boolean (RelationType type, DfaValue dfaLeft, DfaValue dfaRight) { RelationType currentRelation = getRelation(dfaLeft, dfaRight); if (currentRelation != null) { // Eq: NE & GE => GT type = type.meet(currentRelation); if (type == null) return false; } boolean isNegated = type == RelationType.NE || type == RelationType.GT || type == RelationType.LT; if (!isNegated && type != RelationType.EQ) { return true; } if (type == RelationType.EQ && !applyDerivedVariablesEquivalence(dfaLeft, dfaRight)) return false; if (dfaLeft instanceof DfaVariableValue && dfaRight instanceof DfaVariableValue && !isNegated) { if (!updateQualifierOnEquality((DfaVariableValue)dfaLeft, dfaRight) || !updateQualifierOnEquality((DfaVariableValue)dfaRight, dfaLeft)) { return false; } } if (dfaLeft == dfaRight && dfaLeft instanceof DfaVariableValue) { return !isNegated || isUnstableValue(dfaLeft) || ((DfaVariableValue)dfaLeft).containsCalls(); } if (dfaLeft instanceof DfaVariableValue && dfaRight instanceof DfaVariableValue) { if (type == RelationType.LT) { if (!applyLessThanRelation(dfaLeft, dfaRight)) return false; } else if (type == RelationType.GT) { if (!applyLessThanRelation(dfaRight, dfaLeft)) return false; } else { if (!applyRelation(dfaLeft, dfaRight, isNegated)) return false; } } if (isNegated) { return applyDerivedInequality(dfaLeft, dfaRight); } return true; }