private boolean applyEquivalenceRelation(RelationType type, DfaValue dfaLeft, DfaValue dfaRight) {
    if (!dfaLeft.getDfType().hasNonStandardEquivalence() && !dfaRight.getDfType().hasNonStandardEquivalence()) {
      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;
  }
private boolean applyEquivalenceRelation(RelationType type, DfaValue dfaLeft, DfaValue dfaRight)