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.

Reply via email to