if (isBinary() && !op2.similar(ae.op2)) return false; return op1.similar(ae.op1);
if (!isBinary()) return op1.similar(ae.op1); if (op1.similar(ae.op1) && op2.similar(ae.op2)) return true; return isCommutative() && op1.similar(ae.op2) && op2.similar(ae.op1);
    public boolean equals (Object o) {      if (!(o instanceof AvailableExpression))        return false;      AvailableExpression ae = (AvailableExpression)o;      if (isLoadOrStore()) {        if (!ae.isLoadOrStore())          return false;        boolean result = OPT_LocationOperand.mayBeAliased(location, ae.location);        if (op1 != null) {          result = result && op1.similar(ae.op1);        } else {          /* op1 is null, so ae.op1 must also be null */          if (ae.op1 != null)            return false;        }        if (op2 != null) {          result = result && op2.similar(ae.op2);        } else {          /* op2 is null, so ae.op2 must also be null */          if (ae.op2 != null)            return false;        }        return result;      } else if (isBoundsCheck()) {        // Augment equality with BC(ref,C1) ==> BC(ref,C2)         // when C1>0, C2>=0, and C1>C2        if (!opr.equals(ae.opr))          return false;        if (!op1.similar(ae.op1))          return false;        if (op2.similar(ae.op2))          return true;        if (op2 instanceof OPT_IntConstantOperand &&             ae.op2 instanceof OPT_IntConstantOperand) {          int C1 = ((OPT_IntConstantOperand)op2).value;          int C2 = ((OPT_IntConstantOperand)ae.op2).value;          return C1 > 0 && C2 >= 0 && C1 > C2;        } else {          return false;        }      } else {        if (!opr.equals(ae.opr))          return false;        if (isTernary() && !op3.similar(ae.op3))          return false;        if (isBinary() && !op2.similar(ae.op2))          return false;        return op1.similar(ae.op1);      }    }