Exprent (Exprent exprent) { if (exprent.type == Exprent.EXPRENT_FUNCTION) { FunctionExprent fexpr = (FunctionExprent)exprent; if (fexpr.getFuncType() == FunctionExprent.FUNCTION_BOOL_NOT) { Exprent param = fexpr.getLstOperands().get(0); if (param.type == Exprent.EXPRENT_FUNCTION) { FunctionExprent fparam = (FunctionExprent)param; int ftype = fparam.getFuncType(); boolean canSimplify = false; switch (ftype) { case FunctionExprent.FUNCTION_BOOL_NOT: Exprent newexpr = fparam.getLstOperands().get(0); Exprent retexpr = propagateBoolNot(newexpr); return retexpr == null ? newexpr : retexpr; case FunctionExprent.FUNCTION_CADD, FunctionExprent.FUNCTION_COR: { List<Exprent> operands = fparam.getLstOperands(); for (int i = 0; i < operands.size(); i++) { Exprent newparam = new FunctionExprent(FunctionExprent.FUNCTION_BOOL_NOT, operands.get(i), operands.get(i).bytecode); Exprent retparam = propagateBoolNot(newparam); operands.set(i, retparam == null ? newparam : retparam); } } case FunctionExprent.FUNCTION_EQ, FunctionExprent.FUNCTION_NE: canSimplify = true; case FunctionExprent.FUNCTION_LT, FunctionExprent.FUNCTION_GE, FunctionExprent.FUNCTION_GT, FunctionExprent.FUNCTION_LE: if (!canSimplify) { List<Exprent> operands = fparam.getLstOperands(); VarType left = operands.get(0).getExprType(); VarType right = operands.get(1).getExprType(); VarType commonSupertype = VarType.getCommonSupertype(left, right); if (commonSupertype != null) { canSimplify = commonSupertype.getType() != CodeConstants.TYPE_FLOAT && commonSupertype.getType() != CodeConstants.TYPE_DOUBLE; } } if (canSimplify) { fparam.setFuncType(funcsnot[ftype - FunctionExprent.FUNCTION_EQ]); return fparam; } } } } } return null; }