On Thu, Dec 12, 2024 at 9:45 AM <pan2...@intel.com> wrote: > > From: Pan Li <pan2...@intel.com> > > This patch would like to refactor the all signed SAT_* patterns for > the saturated value. Aka, overflow to INT_MAX when > 0 and downflow > to INT_MIN when < 0. Thus, we can remove sorts of duplicated expression > in different patterns. > > The below test suites are passed for this patch. > * The rv64gcv fully regression test. > * The x86 bootstrap test. > * The x86 fully regression test.
Note there's currently an implementation detail of how genmatch treats (match ...) that makes this factoring less efficient in some cases (not specifically this one where there is enough of a "pattern" left) - genmatch does not "inline" (match ...), even when there's only a single variant, causing a function call to match such "tail" instead of integrating the sub-pattern in the decision tree. That's something to keep in mind (though it is a genmatch limitation). The patch is OK. Richard. > gcc/ChangeLog: > > * match.pd: Extract saturated value match for signed SAT_*. > > Signed-off-by: Pan Li <pan2...@intel.com> > --- > gcc/match.pd | 38 +++++++++++++++++--------------------- > 1 file changed, 17 insertions(+), 21 deletions(-) > > diff --git a/gcc/match.pd b/gcc/match.pd > index 5b30a1e9990..18098920007 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -3314,6 +3314,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > } > (if (wi::eq_p (trunc_max, int_cst_1) && wi::eq_p (max, int_cst_2))))))) > > +(if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)) > + /* SAT_VAL = (-(T)(X < 0) ^ MAX) */ > + (match (signed_integer_sat_val @0) > + (bit_xor:c (nop_convert? (negate > + (nop_convert? (convert (lt @0 integer_zerop))))) > + max_value))) > + > (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)) > (match (signed_integer_sat_add @0 @1) > /* T SUM = (T)((UT)X + (UT)Y) > @@ -3322,7 +3329,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (nop_convert @1)))) > (bit_not (bit_xor:c @0 @1))) > integer_zerop) > - (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value) > + (signed_integer_sat_val @0) > @2)) > (match (signed_integer_sat_add @0 @1) > /* T SUM = (T)((UT)X + (UT)Y) > @@ -3340,17 +3347,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (nop_convert @1)))) > integer_zerop) > (ge (bit_xor:c @0 @1) integer_zerop)) > - (bit_xor:c (nop_convert (negate (nop_convert (convert > - (lt @0 > integer_zerop))))) > - max_value) > + (signed_integer_sat_val @0) > @2)) > (match (signed_integer_sat_add @0 @1) > /* SUM = .ADD_OVERFLOW (X, Y) > SAT_S_ADD = IMAGPART_EXPR (SUM) != 0 ? (-(T)(X < 0) ^ MAX) : SUM */ > (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) integer_zerop) > - (bit_xor:c (nop_convert? > - (negate (nop_convert? (convert (lt @0 integer_zerop))))) > - max_value) > + (signed_integer_sat_val @0) > (realpart @2))) > (match (signed_integer_sat_add @0 @1) > /* T SUM = (T)((UT)X + (UT)Y) > @@ -3359,9 +3362,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (nop_convert @1)))) > integer_zerop) > (bit_not (lt (bit_xor:c @0 @1) integer_zerop))) > - (bit_xor:c (nop_convert (negate (nop_convert (convert > - (lt @0 > integer_zerop))))) > - max_value) > + (signed_integer_sat_val @0) > @2)) > (match (signed_integer_sat_add @0 @1) > /* T SUM = (T)((UT)X + (UT)IMM); > @@ -3370,10 +3371,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (cond^ (lt (bit_and:c (bit_xor:c @0 (nop_convert@2 (plus (nop_convert @0) > INTEGER_CST@1))) > (bit_xor:c @0 INTEGER_CST@3)) integer_zerop) > - (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value) > + (signed_integer_sat_val @0) > @2) > - (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0))) > -) > + (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0)))) > > (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)) > (match (signed_integer_sat_sub @0 @1) > @@ -3383,7 +3383,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (bit_xor @0 (nop_convert@2 (minus (nop_convert @0) > (nop_convert @1))))) > integer_zerop) > - (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value) > + (signed_integer_sat_val @0) > @2)) > (match (signed_integer_sat_sub @0 @1) > /* T Z = (T)((UT)X - (UT)Y); > @@ -3393,7 +3393,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (nop_convert @1))))) > integer_zerop) > @2 > - (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value))) > + (signed_integer_sat_val @0))) > (match (signed_integer_sat_sub @0 @1) > /* T Z = (T)((UT)X - (UT)Y); > SAT_S_SUB = (X ^ Y) < 0 & (X ^ Z) < 0 ? (-(T)(X < 0) ^ MAX) : Z */ > @@ -3401,17 +3401,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (nop_convert @1)))) > integer_zerop) > (lt (bit_xor:c @0 @1) integer_zerop)) > - (bit_xor:c (nop_convert (negate (nop_convert (convert > - (lt @0 > integer_zerop))))) > - max_value) > + (signed_integer_sat_val @0) > @2)) > (match (signed_integer_sat_sub @0 @1) > /* Z = .SUB_OVERFLOW (X, Y) > SAT_S_SUB = IMAGPART (Z) != 0 ? (-(T)(X < 0) ^ MAX) : REALPART (Z) */ > (cond^ (ne (imagpart (IFN_SUB_OVERFLOW@2 @0 @1)) integer_zerop) > - (bit_xor:c (nop_convert? > - (negate (nop_convert? (convert (lt @0 integer_zerop))))) > - max_value) > + (signed_integer_sat_val @0) > (realpart @2)) > (if (types_match (type, @0, @1))))) > > -- > 2.43.0 >