On Mon, Nov 25, 2024 at 2:23 AM <pan2...@intel.com> wrote:
>
> From: Pan Li <pan2...@intel.com>
>
> This patch would like to refactor the unsigned SAT_ADD pattern when
> leverage the IFN ADD_OVERFLOW, aka:
> * Extract type check outside.
> * Re-arrange the related match pattern forms together.
> * Remove unnecessary helper pattern matches.
>
> The below test suites are passed for this patch.
> * The rv64gcv fully regression test.
> * The x86 bootstrap test.
> * The x86 fully regression test.

OK.

> gcc/ChangeLog:
>
>         * match.pd: Refactor sorts of unsigned SAT_ADD match pattern for
>         IFN ADD_OVERFLOW.
>
> Signed-off-by: Pan Li <pan2...@intel.com>
> ---
>  gcc/match.pd | 83 +++++++++++++++++++---------------------------------
>  1 file changed, 30 insertions(+), 53 deletions(-)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 48317dc80b6..2ff0536d901 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3086,27 +3086,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>         || POINTER_TYPE_P (itype))
>        && wi::eq_p (wi::to_wide (int_cst), wi::max_value (itype))))))
>
> -/* SAT_ADD = usadd_left_part_2 | usadd_right_part_2, aka:
> -   SAT_ADD = REALPART_EXPR <.ADD_OVERFLOW> | (IMAGPART_EXPR <.ADD_OVERFLOW> 
> != 0) */
> -(match (usadd_left_part_2 @0 @1)
> - (realpart (IFN_ADD_OVERFLOW:c @0 @1))
> - (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> -      && types_match (type, @0, @1))))
> -
> -/* SAT_ADD = usadd_left_part_2 | usadd_right_part_2, aka:
> -   SAT_ADD = REALPART_EXPR <.ADD_OVERFLOW> | (IMAGPART_EXPR <.ADD_OVERFLOW> 
> != 0) */
> -(match (usadd_right_part_2 @0 @1)
> - (negate (convert (ne (imagpart (IFN_ADD_OVERFLOW:c @0 @1)) integer_zerop)))
> - (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> -      && types_match (type, @0, @1))))
> -
> -/* SAT_ADD = usadd_left_part_2 | usadd_right_part_2, aka:
> -   SAT_ADD = REALPART_EXPR <.ADD_OVERFLOW> | -IMAGPART_EXPR <.ADD_OVERFLOW> 
> */
> -(match (usadd_right_part_2 @0 @1)
> - (negate (imagpart (IFN_ADD_OVERFLOW:c @0 @1)))
> - (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> -      && types_match (type, @0, @1))))
> -
>  (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type))
>   (match (usadd_overflow_mask @0 @1)
>    /* SAT_U_ADD = (X + Y) | -(X > (X + Y)).
> @@ -3150,38 +3129,36 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>       wide_int max = wi::mask (precision, false, precision);
>       wide_int sum = wi::add (cst_1, cst_2);
>      }
> -    (if (wi::eq_p (max, sum)))))))
> -
> -/* We cannot merge or overload usadd_left_part_1 and usadd_left_part_2
> -   because the sub part of left_part_2 cannot work with right_part_1.
> -   For example, left_part_2 pattern focus one .ADD_OVERFLOW but the
> -   right_part_1 has nothing to do with .ADD_OVERFLOW.  */
> -
> -/* Unsigned saturation add, case 2 (branchless with .ADD_OVERFLOW):
> -   SAT_ADD = REALPART_EXPR <.ADD_OVERFLOW> | -IMAGPART_EXPR <.ADD_OVERFLOW> 
> or
> -   SAT_ADD = REALPART_EXPR <.ADD_OVERFLOW> | (IMAGPART_EXPR <.ADD_OVERFLOW> 
> != 0) */
> -(match (unsigned_integer_sat_add @0 @1)
> - (bit_ior:c (usadd_left_part_2 @0 @1) (usadd_right_part_2 @0 @1)))
> -
> -/* Unsigned saturation add, case 5 (branch with eq .ADD_OVERFLOW):
> -   SAT_U_ADD = REALPART_EXPR <.ADD_OVERFLOW> == 0 ? .ADD_OVERFLOW : -1.  */
> -(match (unsigned_integer_sat_add @0 @1)
> - (cond^ (eq (imagpart (IFN_ADD_OVERFLOW:c @0 @1)) integer_zerop)
> -  (usadd_left_part_2 @0 @1) integer_minus_onep))
> -
> -/* Unsigned saturation add, case 6 (branch with ne .ADD_OVERFLOW):
> -   SAT_U_ADD = REALPART_EXPR <.ADD_OVERFLOW> != 0 ? -1 : .ADD_OVERFLOW.  */
> -(match (unsigned_integer_sat_add @0 @1)
> - (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c @0 @1)) integer_zerop)
> -  integer_minus_onep (usadd_left_part_2 @0 @1)))
> -
> -/* Unsigned saturation add, case 10 (one op is imm):
> -   SAT_U_ADD = __builtin_add_overflow (X, 3, &ret) == 0 ? ret : -1.  */
> -(match (unsigned_integer_sat_add @0 @1)
> - (cond^ (ne (imagpart (IFN_ADD_OVERFLOW@2 @0 INTEGER_CST@1)) integer_zerop)
> -  integer_minus_onep (realpart @2))
> -  (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> -       && types_match (type, @0) && int_fits_type_p (@1, type))))
> +    (if (wi::eq_p (max, sum))))))
> + (match (unsigned_integer_sat_add @0 @1)
> +  /* SUM = ADD_OVERFLOW (X, Y)
> +     SAT_U_ADD = REALPART (SUM) | -IMAGPART (SUM)   */
> +  (bit_ior:c (realpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) (negate (imagpart @2)))
> +  (if (types_match (type, @0, @1))))
> + (match (unsigned_integer_sat_add @0 @1)
> +  /* SUM = ADD_OVERFLOW (X, Y)
> +     SAT_U_ADD = REALPART (SUM) | -(IMAGPART (SUM) != 0)   */
> +  (bit_ior:c (realpart (IFN_ADD_OVERFLOW:c@2 @0 @1))
> +            (negate (convert (ne (imagpart @2) integer_zerop))))
> +  (if (types_match (type, @0, @1))))
> + (match (unsigned_integer_sat_add @0 @1)
> +  /* SUM = ADD_OVERFLOW (X, Y)
> +     SAT_U_ADD = IMAGPART (SUM) == 0 ? REALPART (SUM) : -1   */
> +  (cond^ (eq (imagpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) integer_zerop)
> +        (realpart @2) integer_minus_onep)
> +  (if (types_match (type, @0, @1))))
> + (match (unsigned_integer_sat_add @0 @1)
> +  /* SUM = ADD_OVERFLOW (X, Y)
> +     SAT_U_ADD = IMAGPART (SUM) != 0 ? -1 : REALPART (SUM)  */
> +  (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) integer_zerop)
> +        integer_minus_onep (realpart @2))
> +  (if (types_match (type, @0, @1))))
> + (match (unsigned_integer_sat_add @0 @1)
> +  /* SUM = ADD_OVERFLOW (X, IMM)
> +     SAT_U_ADD = IMAGPART (SUM) != 0 ? -1 : REALPART (SUM)  */
> +  (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c@2 @0 INTEGER_CST@1)) 
> integer_zerop)
> +        integer_minus_onep (realpart @2))
> +  (if (types_match (type, @0) && int_fits_type_p (@1, type)))))
>
>  /* Signed saturation add, case 1:
>     T sum = (T)((UT)X + (UT)Y)
> --
> 2.43.0
>

Reply via email to