//Optimize IF(a,b,c) op x to IF(a,b op x, c OP x) //But be careful because it uncommons attributes increasing the size of the queries. static IHqlExpression * peepholeOptimizeCompare(BuildCtx & ctx, IHqlExpression * expr) { IHqlExpression * lhs = expr->queryChild(0); if (ctx.queryMatchExpr(lhs)) return LINK(expr); IHqlExpression * rhs = expr->queryChild(1); if (!rhs->isConstant() || (lhs->getOperator() != no_if)) return LINK(expr); IHqlExpression * ifCond = lhs->queryChild(0); IHqlExpression * ifTrue = lhs->queryChild(1); IHqlExpression * ifFalse = lhs->queryChild(2); assertex(ifFalse); node_operator op = expr->getOperator(); OwnedHqlExpr newTrue = createValue(op, makeBoolType(), LINK(ifTrue), LINK(rhs)); OwnedHqlExpr newFalse = createValue(op, makeBoolType(), LINK(ifFalse), LINK(rhs)); OwnedHqlExpr newIf = createValue(no_if, makeBoolType(), LINK(ifCond), peepholeOptimize(ctx, newTrue), peepholeOptimize(ctx, newFalse)); return expr->cloneAllAnnotations(newIf); }