On Wed, Oct 22, 2025 at 1:26 AM Richard Biener
<[email protected]> wrote:
>
> On Wed, Oct 22, 2025 at 2:15 AM Andrew Pinski
> <[email protected]> wrote:
> >
> > This is the last patch that is needed to support to remove
> > minmax_replacement.
> > This fixes pr101024-1.c which is failing when minmax_replacement is removed.
> >
> > This next patch will remove it.
> >
> > gcc/ChangeLog:
> >
> > PR tree-optimization/101024
> > * match.pd (`((signed)a </>= 0) ? min/max (a, c) : b`): New pattern.
> > ---
> > gcc/match.pd | 21 +++++++++++++++++++++
> > 1 file changed, 21 insertions(+)
> >
> > diff --git a/gcc/match.pd b/gcc/match.pd
> > index a4248a521cf..c6e7850a46e 100644
> > --- a/gcc/match.pd
> > +++ b/gcc/match.pd
> > @@ -6911,6 +6911,27 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> > && integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
> > @3, @4)))
> > (max @2 @4))))))
> >
> > +/* Optimize (((signed)a CMP 0) ? max<a,CST2> : a */
> > +(for cmp (lt ge)
> > + minmax (min max)
> > + (simplify
> > + (cond (cmp:c (nop_convert @0) integer_zerop@1) (minmax:c@2 @0 @3) @4)
>
> why is @4 not @0 as in the comment above? Why do we need :c on the minmax
> when @3 is a constant? (and why's that not checked for?)
It was a copy and pasto in the comment when copied the previous pattern.
>
> > + (if (!TYPE_UNSIGNED (TREE_TYPE (@1)))
> > + (with
> > + {
> > + tree c1 = fold_convert (TREE_TYPE (@0), TYPE_MIN_VALUE (TREE_TYPE
> > (@1)));
>
> I'd prefer a wide_int_to_tree of the appropriate value rather than
> relying on TYPE_MIN_VALUE
Ok, will do
> here (but then ideally minmax_from_comparison wouldn't require a tree
> in the first place...).
The problem is minmax_from_comparison handles non-constants. I should
create a version which takes wide_int for this and have the tree
version call into it.
>
> > + tree_code ncmp = cmp == GE_EXPR ? LT_EXPR : GE_EXPR;
> > + tree_code code = minmax_from_comparison (ncmp, @0, c1, @0, @4);
> > + }
> > + (if (ncmp == LT_EXPR
> > + && code == MIN_EXPR
> > + && integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
> > @3, @4)))
>
> Err, can we please avoid building & folding trees here? Or at least
> it warrants some comment
> as to why this is necessary (esp. why not && (tem = fold_binary (...))
> && integer_nonzerop (tem)).
Ok, I used wi::le_p/wi::ge_p instead.
Thanks,
Andrew
>
> > + (min @2 @4)
> > + (if (ncmp == GE_EXPR
> > + && code == MAX_EXPR
> > + && integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
> > @3, @4)))
> > + (max @2 @4)))))))
> > +
> > #if GIMPLE
> > /* These patterns should be after min/max detection as simplifications
> > of `(type)(zero_one ==/!= 0)` to `(type)(zero_one)`
> > --
> > 2.43.0
> >