diff mbox series

[v1] Widening-Mul: Try .SAT_SUB for PLUS_EXPR when one op is IMM

Message ID 20240728032547.3426120-1-pan2.li@intel.com
State New
Headers show
Series [v1] Widening-Mul: Try .SAT_SUB for PLUS_EXPR when one op is IMM | expand

Commit Message

Li, Pan2 July 28, 2024, 3:25 a.m. UTC
From: Pan Li <pan2.li@intel.com>

After add the matching for .SAT_SUB when one op is IMM,  there
will be a new root PLUS_EXPR for the .SAT_SUB pattern.  For example,

Form 3:
  #define DEF_SAT_U_SUB_IMM_FMT_3(T, IMM) \
  T __attribute__((noinline))             \
  sat_u_sub_imm##IMM##_##T##_fmt_3 (T x)  \
  {                                       \
    return x >= IMM ? x - IMM : 0;        \
  }

DEF_SAT_U_SUB_IMM_FMT_3(uint64_t, 11)

And then we will have gimple before widening-mul as below.  Thus,  try
the .SAT_SUB for the PLUS_EXPR.

   4   │ __attribute__((noinline))
   5   │ uint64_t sat_u_sub_imm11_uint64_t_fmt_3 (uint64_t x)
   6   │ {
   7   │   long unsigned int _1;
   8   │   uint64_t _3;
   9   │
  10   │   <bb 2> [local count: 1073741824]:
  11   │   _1 = MAX_EXPR <x_2(D), 11>;
  12   │   _3 = _1 + 18446744073709551605;
  13   │   return _3;
  14   │
  15   │ }

The below test suites are passed for this patch.
1. The rv64gcv fully regression tests.
2. The x86 bootstrap tests.
3. The x86 fully regression tests.

gcc/ChangeLog:

	* tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children):
	Try .SAT_SUB for PLUS_EXPR case.

Signed-off-by: Pan Li <pan2.li@intel.com>
---
 gcc/tree-ssa-math-opts.cc | 1 +
 1 file changed, 1 insertion(+)

Comments

Richard Biener July 29, 2024, 9:02 a.m. UTC | #1
On Sun, Jul 28, 2024 at 5:25 AM <pan2.li@intel.com> wrote:
>
> From: Pan Li <pan2.li@intel.com>
>
> After add the matching for .SAT_SUB when one op is IMM,  there
> will be a new root PLUS_EXPR for the .SAT_SUB pattern.  For example,
>
> Form 3:
>   #define DEF_SAT_U_SUB_IMM_FMT_3(T, IMM) \
>   T __attribute__((noinline))             \
>   sat_u_sub_imm##IMM##_##T##_fmt_3 (T x)  \
>   {                                       \
>     return x >= IMM ? x - IMM : 0;        \
>   }
>
> DEF_SAT_U_SUB_IMM_FMT_3(uint64_t, 11)
>
> And then we will have gimple before widening-mul as below.  Thus,  try
> the .SAT_SUB for the PLUS_EXPR.
>
>    4   │ __attribute__((noinline))
>    5   │ uint64_t sat_u_sub_imm11_uint64_t_fmt_3 (uint64_t x)
>    6   │ {
>    7   │   long unsigned int _1;
>    8   │   uint64_t _3;
>    9   │
>   10   │   <bb 2> [local count: 1073741824]:
>   11   │   _1 = MAX_EXPR <x_2(D), 11>;
>   12   │   _3 = _1 + 18446744073709551605;
>   13   │   return _3;
>   14   │
>   15   │ }
>
> The below test suites are passed for this patch.
> 1. The rv64gcv fully regression tests.
> 2. The x86 bootstrap tests.
> 3. The x86 fully regression tests.

OK

> gcc/ChangeLog:
>
>         * tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children):
>         Try .SAT_SUB for PLUS_EXPR case.
>
> Signed-off-by: Pan Li <pan2.li@intel.com>
> ---
>  gcc/tree-ssa-math-opts.cc | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
> index ac86be8eb94..8d96a4c964b 100644
> --- a/gcc/tree-ssa-math-opts.cc
> +++ b/gcc/tree-ssa-math-opts.cc
> @@ -6129,6 +6129,7 @@ math_opts_dom_walker::after_dom_children (basic_block bb)
>
>             case PLUS_EXPR:
>               match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt));
> +             match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt));
>               /* fall-through  */
>             case MINUS_EXPR:
>               if (!convert_plusminus_to_widen (&gsi, stmt, code))
> --
> 2.34.1
>
Li, Pan2 July 29, 2024, 12:19 p.m. UTC | #2
> OK

Committed, thanks Richard.

Pan

-----Original Message-----
From: Richard Biener <richard.guenther@gmail.com> 
Sent: Monday, July 29, 2024 5:03 PM
To: Li, Pan2 <pan2.li@intel.com>
Cc: gcc-patches@gcc.gnu.org; juzhe.zhong@rivai.ai; kito.cheng@gmail.com; tamar.christina@arm.com; jeffreyalaw@gmail.com; rdapp.gcc@gmail.com
Subject: Re: [PATCH v1] Widening-Mul: Try .SAT_SUB for PLUS_EXPR when one op is IMM

On Sun, Jul 28, 2024 at 5:25 AM <pan2.li@intel.com> wrote:
>
> From: Pan Li <pan2.li@intel.com>
>
> After add the matching for .SAT_SUB when one op is IMM,  there
> will be a new root PLUS_EXPR for the .SAT_SUB pattern.  For example,
>
> Form 3:
>   #define DEF_SAT_U_SUB_IMM_FMT_3(T, IMM) \
>   T __attribute__((noinline))             \
>   sat_u_sub_imm##IMM##_##T##_fmt_3 (T x)  \
>   {                                       \
>     return x >= IMM ? x - IMM : 0;        \
>   }
>
> DEF_SAT_U_SUB_IMM_FMT_3(uint64_t, 11)
>
> And then we will have gimple before widening-mul as below.  Thus,  try
> the .SAT_SUB for the PLUS_EXPR.
>
>    4   │ __attribute__((noinline))
>    5   │ uint64_t sat_u_sub_imm11_uint64_t_fmt_3 (uint64_t x)
>    6   │ {
>    7   │   long unsigned int _1;
>    8   │   uint64_t _3;
>    9   │
>   10   │   <bb 2> [local count: 1073741824]:
>   11   │   _1 = MAX_EXPR <x_2(D), 11>;
>   12   │   _3 = _1 + 18446744073709551605;
>   13   │   return _3;
>   14   │
>   15   │ }
>
> The below test suites are passed for this patch.
> 1. The rv64gcv fully regression tests.
> 2. The x86 bootstrap tests.
> 3. The x86 fully regression tests.

OK

> gcc/ChangeLog:
>
>         * tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children):
>         Try .SAT_SUB for PLUS_EXPR case.
>
> Signed-off-by: Pan Li <pan2.li@intel.com>
> ---
>  gcc/tree-ssa-math-opts.cc | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
> index ac86be8eb94..8d96a4c964b 100644
> --- a/gcc/tree-ssa-math-opts.cc
> +++ b/gcc/tree-ssa-math-opts.cc
> @@ -6129,6 +6129,7 @@ math_opts_dom_walker::after_dom_children (basic_block bb)
>
>             case PLUS_EXPR:
>               match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt));
> +             match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt));
>               /* fall-through  */
>             case MINUS_EXPR:
>               if (!convert_plusminus_to_widen (&gsi, stmt, code))
> --
> 2.34.1
>
diff mbox series

Patch

diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
index ac86be8eb94..8d96a4c964b 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -6129,6 +6129,7 @@  math_opts_dom_walker::after_dom_children (basic_block bb)
 
 	    case PLUS_EXPR:
 	      match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt));
+	      match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt));
 	      /* fall-through  */
 	    case MINUS_EXPR:
 	      if (!convert_plusminus_to_widen (&gsi, stmt, code))