Thanks Richard for comments.

> OK.

Given almost all of the Saturation match pattern(s) are merged, I'd like to 
start the refinement about "common" match predictions to avoid duplication
as we discussed in previous, after I draft the strided ld/st IFN patch(es).

Pan

-----Original Message-----
From: Richard Biener <richard.guent...@gmail.com> 
Sent: Monday, October 21, 2024 8:29 PM
To: Li, Pan2 <pan2...@intel.com>
Cc: gcc-patches@gcc.gnu.org; tamar.christ...@arm.com; juzhe.zh...@rivai.ai; 
kito.ch...@gmail.com; jeffreya...@gmail.com; rdapp....@gmail.com
Subject: Re: [PATCH 01/11] Match: Support form 1 for vector signed integer 
SAT_TRUNC

On Mon, Oct 14, 2024 at 1:12 PM <pan2...@intel.com> wrote:
>
> From: Pan Li <pan2...@intel.com>
>
> This patch would like to support the form 1 of the vector signed
> integer SAT_TRUNC.  Aka below example:
>
> Form 1:
>   #define DEF_VEC_SAT_S_TRUNC_FMT_1(NT, WT, NT_MIN, NT_MAX)             \
>   void __attribute__((noinline))                                        \
>   vec_sat_s_trunc_##NT##_##WT##_fmt_1 (NT *out, WT *in, unsigned limit) \
>   {                                                                     \
>     unsigned i;                                                         \
>     for (i = 0; i < limit; i++)                                         \
>       {                                                                 \
>         WT x = in[i];                                                   \
>         NT trunc = (NT)x;                                               \
>         out[i] = (WT)NT_MIN <= x && x <= (WT)NT_MAX                     \
>           ? trunc                                                       \
>           : x < 0 ? NT_MIN : NT_MAX;                                    \
>       }                                                                 \
>   }
>
> DEF_VEC_SAT_S_TRUNC_FMT_1(int32_t, int64_t, INT32_MIN, INT32_MAX)
>
> Before this patch:
>   48   │   _87 = .SELECT_VL (ivtmp_85, POLY_INT_CST [2, 2]);
>   49   │   ivtmp_64 = _87 * 8;
>   50   │   vect_x_14.10_67 = .MASK_LEN_LOAD (vectp_in.8_65, 64B, { -1, ... }, 
> _87, 0);
>   51   │   vect_trunc_15.21_78 = (vector([2,2]) int) vect_x_14.10_67;
>   52   │   _61 = VIEW_CONVERT_EXPR<vector([2,2]) unsigned 
> long>(vect_x_14.10_67);
>   53   │   _32 = _61 >> 63;
>   54   │   vect_patt_52.16_73 = (vector([2,2]) int) _32;
>   55   │   vect__46.17_74 = VIEW_CONVERT_EXPR<vector([2,2]) unsigned 
> int>(vect_patt_52.16_73);
>   56   │   vect__47.18_75 = -vect__46.17_74;
>   57   │   vect__21.19_76 = VIEW_CONVERT_EXPR<vector([2,2]) 
> int>(vect__47.18_75);
>   58   │   vect_x.11_68 = VIEW_CONVERT_EXPR<vector([2,2]) unsigned 
> long>(vect_x_14.10_67);
>   59   │   vect__5.12_69 = vect_x.11_68 + { 2147483648, ... };
>   60   │   mask__34.13_70 = vect__5.12_69 > { 4294967295, ... };
>   61   │   _25 = .COND_XOR (mask__34.13_70, vect__21.19_76, { 2147483647, ... 
> }, vect_trunc_15.21_78);
>   62   │   ivtmp_80 = _87 * 4;
>   63   │   .MASK_LEN_STORE (vectp_out.23_81, 32B, { -1, ... }, _87, 0, _25);
>   64   │   vectp_in.8_66 = vectp_in.8_65 + ivtmp_64;
>   65   │   vectp_out.23_82 = vectp_out.23_81 + ivtmp_80;
>   66   │   ivtmp_86 = ivtmp_85 - _87;
>
> After this patch:
>   38   │   _77 = .SELECT_VL (ivtmp_75, POLY_INT_CST [2, 2]);
>   39   │   ivtmp_65 = _77 * 8;
>   40   │   vect_x_14.10_68 = .MASK_LEN_LOAD (vectp_in.8_66, 64B, { -1, ... }, 
> _77, 0);
>   41   │   vect_patt_53.11_69 = .SAT_TRUNC (vect_x_14.10_68);
>   42   │   ivtmp_70 = _77 * 4;
>   43   │   .MASK_LEN_STORE (vectp_out.12_71, 32B, { -1, ... }, _77, 0, 
> vect_patt_53.11_69);
>   44   │   vectp_in.8_67 = vectp_in.8_66 + ivtmp_65;
>   45   │   vectp_out.12_72 = vectp_out.12_71 + ivtmp_70;
>   46   │   ivtmp_76 = ivtmp_75 - _77;
>
> The below test suites are passed for this patch.
> * The rv64gcv fully regression test.
> * The x86 bootstrap test.
> * The x86 fully regression test.

OK.

Richard.

> gcc/ChangeLog:
>
>         * match.pd: Refine matching for vector signed SAT_TRUNC form 1.
>
> Signed-off-by: Pan Li <pan2...@intel.com>
> ---
>  gcc/match.pd | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 2ab76f9d055..36195d0c920 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3493,7 +3493,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>     SAT_S_TRUNC(X) = (unsigned)X + NT_MAX + 1  > Unsigned_MAX ? (NT)X.  */
>  (match (signed_integer_sat_trunc @0)
>   (cond^ (gt (plus:c (convert@4 @0) INTEGER_CST@1) INTEGER_CST@2)
> -       (bit_xor:c (negate (convert (lt @0 integer_zerop))) INTEGER_CST@3)
> +       (bit_xor:c (nop_convert?
> +                   (negate (nop_convert? (convert (lt @0 integer_zerop)))))
> +                  INTEGER_CST@3)
>         (convert @0))
>   (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)
>        && !TYPE_UNSIGNED (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@4)))
> --
> 2.43.0
>

Reply via email to