On Fri, Jul 21, 2023 at 6:06 AM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > This adds a simple match pattern to simplify > `max<max<a,b>,a>` to `max<a,b>`. Reassociation handles > this already (r0-77700-ge969dbde29bfd396259357) but > seems like we should be able to handle this even before > reassociation. > > This fixes part of PR tree-optimization/80574 but more > work is needed fix it the rest of the way. The original > testcase there is fixed but the RTL level is what fixes > it the rest of the way. > > OK? Bootstrapped and tested on x86_64-linux-gnu. > > gcc/ChangeLog: > > * match.pd (minmax<minmax<a,b>,a>->minmax<a,b>): New > transformation. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/reassoc-12.c: Disable all of > the passes that enables match-and-simplify.
maybe turn it into a GIMPLE testcase instead ... In any case OK. Thanks, Richard. > * gcc.dg/tree-ssa/minmax-23.c: New test. > --- > gcc/match.pd | 6 +++++- > gcc/testsuite/gcc.dg/tree-ssa/minmax-23.c | 22 ++++++++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c | 3 ++- > 3 files changed, 29 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/minmax-23.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 4dfe92623f7..bfd15d6cd4a 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -3503,7 +3503,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (for minmax (min max) > (simplify > (minmax @0 @0) > - @0)) > + @0) > +/* max(max(x,y),x) -> max(x,y) */ > + (simplify > + (minmax:c (minmax:c@2 @0 @1) @0) > + @2)) > /* For fmin() and fmax(), skip folding when both are sNaN. */ > (for minmax (FMIN_ALL FMAX_ALL) > (simplify > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-23.c > b/gcc/testsuite/gcc.dg/tree-ssa/minmax-23.c > new file mode 100644 > index 00000000000..0b7e51bb97e > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-23.c > @@ -0,0 +1,22 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O1 -fno-tree-reassoc -fdump-tree-optimized" } */ > + > + > +#define MAX(a,b) (a)>=(b) ? (a) : (b) > + > +#define MIN(a,b) (a)<=(b) ? (a) : (b) > + > +int test1(int a, int b) > +{ > + int d = MAX(a,b); > + return MAX(a,d); > +} > +int test2(int a, int b) > +{ > + int d = MIN(a,b); > + return MIN(a,d); > +} > + > +/* We should be optimize these two functions even without reassociation. */ > +/* { dg-final { scan-tree-dump-times "MAX_EXPR " 1 "optimized"} } */ > +/* { dg-final { scan-tree-dump-times "MIN_EXPR " 1 "optimized"} } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c > b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c > index 9a138ebcf70..2238147de19 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c > @@ -1,5 +1,6 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -fdump-tree-reassoc1-details" } */ > +/* Match-and-simplify can handle now MAX<MAX<a,b>,a>->MAX<a,b>, disable all > of the passes that uses that. */ > +/* { dg-options "-O1 -fdump-tree-reassoc1-details -fno-tree-ccp > -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre" } */ > int f(int a, int b) > { > /* MAX_EXPR <a, a> should cause it to be equivalent to a. */ > -- > 2.31.1 >