On Sun, Nov 21, 2021 at 3:19 PM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > This PR was orignally for the missed optimization of a few isnegative which > had been solved a long time ago (sometime before 4.4.0). I noticed there was > one missed optimization on the gimple level. There is a match.pd pattern > for ~a < CST but we miss that there could be a nop_convert between the the > comparison and the bit_not. This adds the optional option cast to the current > match.pd pattern. > > OK? Bootstrapped and tested on x86_64 with no regressions. > > PR tree-optimization/31531 > > gcc/ChangeLog: > > * match.pd (~X op C): Allow for an optional nop convert. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/pr31531-1.c: New test. > --- > gcc/match.pd | 5 +++-- > gcc/testsuite/gcc.dg/tree-ssa/pr31531-1.c | 19 +++++++++++++++++++ > 2 files changed, 22 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr31531-1.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 37c5be9e5f4..ca6c9eff624 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -4729,10 +4729,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (for cmp (simple_comparison) > scmp (swapped_simple_comparison) > (simplify > - (cmp (bit_not@2 @0) CONSTANT_CLASS_P@1) > + (cmp (nop_convert?:s (bit_not@2 @0)) CONSTANT_CLASS_P@1)
Any specific reason you add :s to the conversion? OK with removing it. Thanks, Richard. > (if (single_use (@2) > && (TREE_CODE (@1) == INTEGER_CST || TREE_CODE (@1) == VECTOR_CST)) > - (scmp @0 (bit_not @1))))) > + (with { tree type1 = TREE_TYPE (@1); } > + (scmp (convert:type1 @0) (bit_not @1)))))) > > (for cmp (simple_comparison) > /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr31531-1.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr31531-1.c > new file mode 100644 > index 00000000000..c27299151eb > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr31531-1.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > +/* PR tree-optimization/31531 */ > + > +int f(int a) > +{ > + int b = ~a; > + return b<0; > +} > + > + > +int f1(unsigned a) > +{ > + int b = ~a; > + return b<0; > +} > +/* We should convert the above two functions from b <0 to ((int)a) >= 0. */ > +/* { dg-final { scan-tree-dump-times ">= 0" 2 "optimized"} } */ > +/* { dg-final { scan-tree-dump-times "~" 0 "optimized"} } */ > -- > 2.17.1 >