On Wed, 20 Aug 2014, Marc Glisse wrote: > On Wed, 20 Aug 2014, Richard Biener wrote: > > > Committed. > > > > Also makes visible a desirable change I plan for if-exprs. They > > should behave like outer ifs and allow us to write that series > > of pattern as > > > > (for op in eq ne > > /* Simplify X * C1 CMP 0 to X CMP 0 if C1 is not zero. */ > > (simplify > > (op (mult @0 INTEGER_CST@1) integer_zerop@2) > > /* In fold-const.c we have this and the following patterns > > combined because there we can "compute" the operator > > to use by using swap_tree_comparison. */ > > (if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))) > > (if (tree_int_cst_sgn (@1) > 0) > > (op @0 @2)) > > (if (tree_int_cst_sgn (@1) < 0 && op == EQ_EXPR) > > (ne @0 @2)) > > (if (tree_int_cst_sgn (@1) < 0 && op == NE_EXPR) > > (eq @0 @2))))) > > > > that is, inner ifs have two operands, one condition and one > > "result" (which can be another if). And the simplify > > now has one mandatory match operand and at least one > > result operand (if which all but the last have to be an > > 'if'). > > Not related to how you do "if" and such, but this simplification doesn't make > sense. swap_tree_comparison preserves eq and ne, you only care that @1 is > non-zero. It is for comparisons like lt that the sign can change the > operation.
Oops, true (the fold_comparison code doesn't restrict itself to eq and ne). So for ne and eq the sign of @1 doesn't matter. So we can improve here and do /* Simplify X * C1 CMP 0 to X CMP 0 if C1 is not zero. */ (for op in lt le eq ne ge gt (simplify (op (mult @0 INTEGER_CST@1) integer_zerop@2) /* In fold-const.c we have this and the following pattern combined because there we can "compute" the operator to use by using swap_tree_comparison. Here we manage to use only two patterns by swapping the operands instead of changing the comparison code. */ (if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) && tree_int_cst_sgn (@1) > 0)) (op @0 @2)) (simplify (op (mult @0 INTEGER_CST@1) integer_zerop@2) (if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) && tree_int_cst_sgn (@1) < 0)) (op @2 @0))) right? Thanks, Richard.