On Wed, Oct 30, 2024 at 4:46 PM Akram Ahmad <akram.ah...@arm.com> wrote:
>
> On 29/10/2024 12:48, Richard Biener wrote:
> > On Mon, Oct 28, 2024 at 4:45 PM Akram Ahmad <akram.ah...@arm.com> wrote:
> >> Case 7 of unsigned scalar saturating addition defines
> >> SAT_ADD = X <= (X + Y) ? (X + Y) : -1. This is the same as
> >> SAT_ADD = Y <= (X + Y) ? (X + Y) : -1 due to usadd_left_part_1
> >> being commutative.
> >>
> >> The pattern for case 7 currently does not accept the alternative
> >> where Y is used in the condition. Therefore, this commit adds the
> >> commutative property to this case which causes more valid cases of
> >> unsigned saturating arithmetic to be recognised.
> >>
> >> Before:
> >>   <bb 2>
> >>   _1 = BIT_FIELD_REF <b_3(D), 8, 0>;
> >>   sum_5 = _1 + a_4(D);
> >>   if (a_4(D) <= sum_5)
> >>     goto <bb 4>; [INV]
> >>   else
> >>     goto <bb 3>; [INV]
> >>
> >>   <bb 3> :
> >>
> >>   <bb 4> :
> >>   _2 = PHI <255(3), sum_5(2)>
> >>   return _2;
> >>
> >> After:
> >>    <bb 2> [local count: 1073741824]:
> >>    _1 = BIT_FIELD_REF <b_3(D), 8, 0>;
> >>    _2 = .SAT_ADD (_1, a_4(D)); [tail call]
> >>    return _2;
> >>
> >> This passes the aarch64-none-linux-gnu regression tests with no new
> >> failures. The tests written in this patch will fail on targets which
> >> do not implement the standard names for IFN SAT_ADD.
> >>
> >> gcc/ChangeLog:
> >>
> >>          * match.pd: Modify existing case for SAT_ADD.
> >>
> >> gcc/testsuite/ChangeLog:
> >>
> >>          * gcc.dg/tree-ssa/sat-u-add-match-1-u16.c: New test.
> >>          * gcc.dg/tree-ssa/sat-u-add-match-1-u32.c: New test.
> >>          * gcc.dg/tree-ssa/sat-u-add-match-1-u64.c: New test.
> >>          * gcc.dg/tree-ssa/sat-u-add-match-1-u8.c: New test.
> >> ---
> >>   gcc/match.pd                                  |  4 ++--
> >>   .../gcc.dg/tree-ssa/sat-u-add-match-1-u16.c   | 21 +++++++++++++++++++
> >>   .../gcc.dg/tree-ssa/sat-u-add-match-1-u32.c   | 21 +++++++++++++++++++
> >>   .../gcc.dg/tree-ssa/sat-u-add-match-1-u64.c   | 21 +++++++++++++++++++
> >>   .../gcc.dg/tree-ssa/sat-u-add-match-1-u8.c    | 21 +++++++++++++++++++
> >>   5 files changed, 86 insertions(+), 2 deletions(-)
> >>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u16.c
> >>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u32.c
> >>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u64.c
> >>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u8.c
> >>
> >> diff --git a/gcc/match.pd b/gcc/match.pd
> >> index 4fc5efa6247..98c50ab097f 100644
> >> --- a/gcc/match.pd
> >> +++ b/gcc/match.pd
> >> @@ -3085,7 +3085,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >>   /* SAT_ADD = usadd_left_part_1 | usadd_right_part_1, aka:
> >>      SAT_ADD = (X + Y) | -((X + Y) < X)  */
> >>   (match (usadd_left_part_1 @0 @1)
> >> - (plus:c @0 @1)
> >> + (plus @0 @1)
> >>    (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> >>         && types_match (type, @0, @1))))
> >>
> >> @@ -3166,7 +3166,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >>   /* Unsigned saturation add, case 7 (branch with le):
> >>      SAT_ADD = x <= (X + Y) ? (X + Y) : -1.  */
> >>   (match (unsigned_integer_sat_add @0 @1)
> >> - (cond^ (le @0 (usadd_left_part_1@2 @0 @1)) @2 integer_minus_onep))
> >> + (cond^ (le @0 (usadd_left_part_1:C@2 @0 @1)) @2 integer_minus_onep))
> >>
> >>   /* Unsigned saturation add, case 8 (branch with gt):
> >>      SAT_ADD = x > (X + Y) ? -1 : (X + Y).  */
> >> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u16.c 
> >> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u16.c
> >> new file mode 100644
> >> index 00000000000..0202c70cc83
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u16.c
> >> @@ -0,0 +1,21 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> >> +
> >> +#include <stdint.h>
> >> +
> >> +#define T uint16_t
> >> +#define UMAX (T) -1
> >> +
> >> +T sat_u_add_1 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < a ? UMAX : sum;
> >> +}
> >> +
> >> +T sat_u_add_2 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < b ? UMAX : sum;
> >> +}
> >> +
> >> +/* { dg-final { scan-tree-dump-times " .SAT_ADD " 2 "optimized" } } */
> > The testcases will FAIL unless the target has support for .SAT_ADD - you 
> > want to
> > add proper effective target tests here.
> >
> > The match.pd part looks OK to me.
> >
> > Richard.
>
> Hi Richard,
>
> I assume this also applies to the tests written for the SAT_SUB pattern
> too in that case?

Yes, of course.

> Many thanks,
>
> Akram
>
> >
> >> \ No newline at end of file
> >> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u32.c 
> >> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u32.c
> >> new file mode 100644
> >> index 00000000000..34c80ba3854
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u32.c
> >> @@ -0,0 +1,21 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> >> +
> >> +#include <stdint.h>
> >> +
> >> +#define T uint32_t
> >> +#define UMAX (T) -1
> >> +
> >> +T sat_u_add_1 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < a ? UMAX : sum;
> >> +}
> >> +
> >> +T sat_u_add_2 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < b ? UMAX : sum;
> >> +}
> >> +
> >> +/* { dg-final { scan-tree-dump-times " .SAT_ADD " 2 "optimized" } } */
> >> \ No newline at end of file
> >> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u64.c 
> >> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u64.c
> >> new file mode 100644
> >> index 00000000000..0718cb566d3
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u64.c
> >> @@ -0,0 +1,21 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> >> +
> >> +#include <stdint.h>
> >> +
> >> +#define T uint64_t
> >> +#define UMAX (T) -1
> >> +
> >> +T sat_u_add_1 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < a ? UMAX : sum;
> >> +}
> >> +
> >> +T sat_u_add_2 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < b ? UMAX : sum;
> >> +}
> >> +
> >> +/* { dg-final { scan-tree-dump-times " .SAT_ADD " 2 "optimized" } } */
> >> \ No newline at end of file
> >> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u8.c 
> >> b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u8.c
> >> new file mode 100644
> >> index 00000000000..c3e0cc6c456
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.dg/tree-ssa/sat-u-add-match-1-u8.c
> >> @@ -0,0 +1,21 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> >> +
> >> +#include <stdint.h>
> >> +
> >> +#define T uint8_t
> >> +#define UMAX (T) -1
> >> +
> >> +T sat_u_add_1 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < a ? UMAX : sum;
> >> +}
> >> +
> >> +T sat_u_add_2 (T a, T b)
> >> +{
> >> +  T sum = a + b;
> >> +  return sum < b ? UMAX : sum;
> >> +}
> >> +
> >> +/* { dg-final { scan-tree-dump-times " .SAT_ADD " 2 "optimized" } } */
> >> \ No newline at end of file
> >> --
> >> 2.34.1
> >>

Reply via email to