On Sat, Apr 30, 2016 at 8:44 PM, Marc Glisse <marc.gli...@inria.fr> wrote: > Hello, > > this case seemed to be missing in the various X cmp X transformations. It > does not change the generated code in the testcase. > > The missing :c is rather trivial. I can commit it separately if you prefer.
I think it's not missing. Commutating the first one is enough to eventually make the @1s match up. I think you should get a diagnostic on a duplicate pattern when adding another :c (hmm, no, it's indeed "different" patterns but still redundant). > Bootstrap+regtest on powerpc64le-unknown-linux-gnu. Ok for the new pattern. Thanks, Richard. > 2016-05-02 Marc Glisse <marc.gli...@inria.fr> > > gcc/ > * match.pd ((A & B) OP (C & B)): Mark '&' as commutative. > (X u< X, X u> X): New transformations > > gcc/testsuite/ > * gcc.dg/tree-ssa/unord.c: New testcase. > > -- > Marc Glisse > Index: trunk/gcc/match.pd > =================================================================== > --- trunk/gcc/match.pd (revision 235654) > +++ trunk/gcc/match.pd (working copy) > @@ -783,21 +783,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > @0) > /* (~x | y) & x -> x & y */ > /* (~x & y) | x -> x | y */ > (simplify > (bitop:c (rbitop:c (bit_not @0) @1) @0) > (bitop @0 @1))) > > /* Simplify (A & B) OP0 (C & B) to (A OP0 C) & B. */ > (for bitop (bit_and bit_ior bit_xor) > (simplify > - (bitop (bit_and:c @0 @1) (bit_and @2 @1)) > + (bitop (bit_and:c @0 @1) (bit_and:c @2 @1)) > (bit_and (bitop @0 @2) @1))) > > /* (x | CST1) & CST2 -> (x & CST2) | (CST1 & CST2) */ > (simplify > (bit_and (bit_ior @0 CONSTANT_CLASS_P@1) CONSTANT_CLASS_P@2) > (bit_ior (bit_and @0 @2) (bit_and @1 @2))) > > /* Combine successive equal operations with constants. */ > (for bitop (bit_and bit_ior bit_xor) > (simplify > @@ -1914,20 +1914,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (simplify > (cmp @0 @0) > (if (cmp != NE_EXPR > || ! FLOAT_TYPE_P (TREE_TYPE (@0)) > || ! HONOR_NANS (@0)) > { constant_boolean_node (false, type); }))) > (for cmp (unle unge uneq) > (simplify > (cmp @0 @0) > { constant_boolean_node (true, type); })) > +(for cmp (unlt ungt) > + (simplify > + (cmp @0 @0) > + (unordered @0 @0))) > (simplify > (ltgt @0 @0) > (if (!flag_trapping_math) > { constant_boolean_node (false, type); })) > > /* Fold ~X op ~Y as Y op X. */ > (for cmp (simple_comparison) > (simplify > (cmp (bit_not@2 @0) (bit_not@3 @1)) > (if (single_use (@2) && single_use (@3)) > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c > =================================================================== > --- trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c (revision 0) > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c (working copy) > @@ -0,0 +1,7 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O -fdump-tree-optimized" } */ > + > +int f(double a){double b=a;return !__builtin_islessequal(a,b);} > +int g(double a){double b=a;return !__builtin_isgreaterequal(a,b);} > + > +/* { dg-final { scan-tree-dump-times " unord " 2 "optimized" } } */ >