On Thu, Oct 23, 2025 at 5:54 AM Andrew Pinski <[email protected]> wrote: > > This is a follow on r16-4534-g07800a565abd20 based on the review of > the other pattern > (https://gcc.gnu.org/pipermail/gcc-patches/2025-October/698336.html) > as the same issue mentioned in that review apply here. > > This changes to use the new version of minmax_from_comparison so we don't > need to create > a tree for the constant. and use wi::mask instead of TYPE_MIN_VALUE.
OK. Richard. > gcc/ChangeLog: > > * match.pd (`(type1)x CMP CST1 ? (type2)x : CST2`): Better handling > of `((signed)x) < 0`. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/match.pd | 25 +++++++++++++++---------- > 1 file changed, 15 insertions(+), 10 deletions(-) > > diff --git a/gcc/match.pd b/gcc/match.pd > index cbf03512b71..b1882b14050 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -6571,25 +6571,30 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > tree from_type = TREE_TYPE (@1); > tree c1_type = TREE_TYPE (@3), c2_type = TREE_TYPE (@2); > enum tree_code code = ERROR_MARK; > - enum tree_code ncmp = cmp; > - tree c1 = @3; > > /* `((signed)a) < 0` should be converted back into > `a >= (unsigned)SIGNED_TYPE_MIN`. > `((signed)a) >= 0` should be converted back into > `a < (unsigned)SIGNED_TYPE_MIN`. */ > - if (integer_zerop (c1) > + if (integer_zerop (@3) > + && INTEGRAL_TYPE_P (from_type) > && (cmp == GE_EXPR || cmp == LT_EXPR) > && TYPE_UNSIGNED (from_type) > && !TYPE_UNSIGNED (c1_type) > - && TYPE_PRECISION (from_type) == TYPE_PRECISION (c1_type)) > + && TYPE_PRECISION (from_type) == TYPE_PRECISION (c1_type) > + && int_fits_type_p (@2, from_type) > + && (types_match (c2_type, from_type) > + || (TYPE_PRECISION (c2_type) > TYPE_PRECISION (from_type) > + && (TYPE_UNSIGNED (from_type) > + || TYPE_SIGN (c2_type) == TYPE_SIGN (from_type))))) > { > - ncmp = cmp == GE_EXPR ? LT_EXPR : GE_EXPR; > - c1 = fold_convert (from_type, TYPE_MIN_VALUE (c1_type)); > - c1_type = from_type; > + tree_code ncmp = cmp == GE_EXPR ? LE_EXPR : GT_EXPR; > + widest_int c1 = wi::mask<widest_int>(TYPE_PRECISION (type) - 1, 0); > + code = minmax_from_comparison (ncmp, @1, c1, wi::to_widest (@2)); > } > > - if (INTEGRAL_TYPE_P (from_type) > + if (code == ERROR_MARK > + && INTEGRAL_TYPE_P (from_type) > && int_fits_type_p (@2, from_type) > && (types_match (c1_type, from_type) > || (TYPE_PRECISION (c1_type) > TYPE_PRECISION (from_type) > @@ -6600,8 +6605,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > && (TYPE_UNSIGNED (from_type) > || TYPE_SIGN (c2_type) == TYPE_SIGN (from_type))))) > { > - if (ncmp != EQ_EXPR) > - code = minmax_from_comparison (ncmp, @1, c1, @1, @2); > + if (cmp != EQ_EXPR) > + code = minmax_from_comparison (cmp, @1, @3, @1, @2); > /* Can do A == C1 ? A : C2 -> A == C1 ? C1 : C2? */ > else if (int_fits_type_p (@3, from_type)) > code = EQ_EXPR; > -- > 2.43.0 >
