On Sun, Sep 29, 2024 at 5:28 PM Jeff Law <jeffreya...@gmail.com> wrote:
>
>
>
> On 9/25/24 2:30 AM, Eikansh Gupta wrote:
> > This patch simplify `min(a,b) op max(a,b)` to `a op b`. This optimization
> > will work for all the binary commutative operations. So, the `op` here can
> > be one of {plus, mult, bit_and, bit_xor, bit_ior, eq, ne, min, max}.
> >
> >       PR tree-optimization/109878
> >       PR 109401
> >
> > gcc/ChangeLog:
> >
> >       * match.pd (min(a,b) op max(a,b) -> a op b): New pattern.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.dg/tree-ssa/pr109401.c: New test.
> >          * gcc.dg/tree-ssa/pr109401-1.c: New test.
> > ---
> >   gcc/match.pd                               |  7 +++
> >   gcc/testsuite/gcc.dg/tree-ssa/pr109401-1.c | 35 +++++++++++++
> >   gcc/testsuite/gcc.dg/tree-ssa/pr109401.c   | 61 ++++++++++++++++++++++
> >   3 files changed, 103 insertions(+)
> >   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109401-1.c
> >   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109401.c
> >
> > diff --git a/gcc/match.pd b/gcc/match.pd
> > index 940292d0d49..4f0453344d6 100644
> > --- a/gcc/match.pd
> > +++ b/gcc/match.pd
> > @@ -4463,6 +4463,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >       @0
> >       @2)))
> >
> > +/* min (a, b) op max (a, b) -> a op b */
> > +(for op (plus mult bit_and bit_xor bit_ior eq ne min max)
> > + (simplify
> > +  (op:c (min:c @0 @1) (max:c @0 @1))
> > +   (if (!HONOR_NANS (@0))
> > +    (op @0 @1))))
> > +
> Does it work in the other order  ie max (a, b) op (min (a, b) -> a op b?
>
>
> What about other OP cases such as subtraction, div/mod?

I think it only can work for commutative ops, since there's :c on 'op' both
operand orders are checked.  Do we need !HONOR_SIGNED_ZEROS for
min/max though?  I think that it's enough to have :c on either the min or
the max.

Richard.

>
> Jeff

Reply via email to