On Mon, Oct 28, 2024 at 4:44 PM Akram Ahmad <akram.ah...@arm.com> wrote:
>
> This patch adds a new case for unsigned scalar saturating subtraction
> using a branch with a greater-than-or-equal condition. For example,
>
> X >= (X - Y) ? (X - Y) : 0
>
> is transformed into SAT_SUB (X, Y) when X and Y are unsigned scalars,
> which therefore correctly matches more cases of IFN SAT_SUB. New tests
> are added to verify this behaviour on targets which use the standard
> names for IFN SAT_SUB.
>
> This passes the aarch64 regression tests with no additional failures.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
>
>         * match.pd: Add new match for SAT_SUB.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c: New test.
>         * gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c: New test.
>         * gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c: New test.
>         * gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c: New test.
> ---
>  gcc/match.pd                                       |  8 ++++++++
>  .../gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c        | 14 ++++++++++++++
>  .../gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c        | 14 ++++++++++++++
>  .../gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c        | 14 ++++++++++++++
>  .../gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c         | 14 ++++++++++++++
>  5 files changed, 64 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index ee53c25cef9..4fc5efa6247 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3360,6 +3360,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>    }
>    (if (wi::eq_p (sum, wi::uhwi (0, precision)))))))
>
> +/* Unsigned saturation sub, case 11 (branch with ge):
> +  SAT_U_SUB = X >= (X - Y) ? (X - Y) : 0.  */
> +(match (unsigned_integer_sat_sub @0 @1)
> + (cond^ (ge @0 (minus @0 @1))
> +  (convert? (minus (convert1? @0) (convert1? @1))) integer_zerop)
> + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> +      && TYPE_UNSIGNED (TREE_TYPE (@0)) && types_match (@0, @1))))
> +
>  /* Signed saturation sub, case 1:
>     T minus = (T)((UT)X - (UT)Y);
>     SAT_S_SUB = (X ^ Y) & (X ^ minus) < 0 ? (-(T)(X < 0) ^ MAX) : minus;
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c
> new file mode 100644
> index 00000000000..164719980c3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u16.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +#include <stdint.h>
> +
> +#define T uint16_t
> +
> +T sat_u_sub_1 (T a, T b)
> +{
> +  T sum = a - b;
> +  return sum > a ? 0 : sum;
> +}
> +
> +/* { dg-final { scan-tree-dump " .SAT_SUB " "optimized" } } */
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c
> new file mode 100644
> index 00000000000..40a28c6092b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u32.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +#include <stdint.h>
> +
> +#define T uint32_t
> +
> +T sat_u_sub_1 (T a, T b)
> +{
> +  T sum = a - b;
> +  return sum > a ? 0 : sum;
> +}
> +
> +/* { dg-final { scan-tree-dump " .SAT_SUB " "optimized" } } */
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c
> new file mode 100644
> index 00000000000..5649858ef2a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u64.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +#include <stdint.h>
> +
> +#define T uint64_t
> +
> +T sat_u_sub_1 (T a, T b)
> +{
> +  T sum = a - b;
> +  return sum > a ? 0 : sum;
> +}
> +
> +/* { dg-final { scan-tree-dump " .SAT_SUB " "optimized" } } */
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c
> new file mode 100644
> index 00000000000..785e48b92ee
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-sub-match-1-u8.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +#include <stdint.h>
> +
> +#define T uint8_t
> +
> +T sat_u_sub_1 (T a, T b)
> +{
> +  T sum = a - b;
> +  return sum > a ? 0 : sum;
> +}
> +
> +/* { dg-final { scan-tree-dump " .SAT_SUB " "optimized" } } */
> \ No newline at end of file
> --
> 2.34.1
>

Reply via email to