| Message ID | 20260902145254.77832-1-ktkachov@nvidia.com |
|---|---|
| Headers | show |
| Series | Saturating arithmetic matching improvements | expand |
From: Kyrylo Tkachov <ktkachov@nvidia.com>
Hi all,
This series teaches GCC to recognise some more saturating arithmetic patterns,
primarily through match-sat-alu.pd and match.pd matchers.
These patterns were identified in a number of OSS workloads like video encoding
with the help of AI agents, though the patches themselves are manually written.
Bootstrapped and tested on aarch64-none-linux-gnu.
Ok for trunk?
Thanks,
Kyrill
Kyrylo Tkachov (13):
match-sat-alu.pd: Allow wider ranges for signed saturating truncation
match-sat-alu.pd: Recognize X - MIN (X, Y) as saturating subtraction
match-sat-alu.pd: Recognize signed saturation clamps
match-sat-alu.pd: Recognize borrow-test saturating subtraction
match-sat-alu.pd: Recognize more unsigned saturating subtraction forms
match-sat-alu.pd: Recognize complement tests for unsigned saturating
addition
match-sat-alu.pd: Recognize X + MIN (~X, Y) as unsigned saturating
addition
match-sat-alu.pd: Recognize strict widened unsigned saturation clamps
match-sat-alu.pd: Recognize signed saturating truncation after a shift
match-sat-alu.pd: Recognize unsigned constant-clamp truncation
match-sat-alu.pd: Recognize signed constant-clamp truncation
match-sat-alu.pd: Recognize complement masks for unsigned saturating
truncation
match.pd: Narrow promoted saturating addition and subtraction
gcc/match-sat-alu.pd | 341 ++++++++++++++++--
gcc/match.pd | 37 ++
gcc/testsuite/gcc.dg/sat-trunc-signed-cmp-2.c | 42 +++
.../gcc.dg/vect/vect-sat-trunc-clamp-1.c | 121 +++++++
.../gcc.dg/vect/vect-sat-trunc-clamp-2.c | 126 +++++++
.../gcc.dg/vect/vect-sat-trunc-complement-1.c | 70 ++++
.../vect/vect-sat-trunc-range-precision-1.c | 122 +++++++
.../vect/vect-sat-trunc-shift-sign-source-1.c | 221 ++++++++++++
.../gcc.target/aarch64/sat_s_clamp-1.c | 78 ++++
.../gcc.target/aarch64/sat_s_clamp-2.c | 43 +++
.../gcc.target/aarch64/sat_s_val_ashr-1.c | 30 ++
.../gcc.target/aarch64/sat_u_add_min_not-1.c | 18 +
.../gcc.target/aarch64/sat_u_add_not_cmp-1.c | 30 ++
.../gcc.target/aarch64/sat_u_add_not_cmp-2.c | 17 +
.../gcc.target/aarch64/sat_u_add_widen_lt-1.c | 32 ++
.../gcc.target/aarch64/sat_u_promoted-1.c | 29 ++
.../gcc.target/aarch64/sat_u_promoted-2.c | 32 ++
.../gcc.target/aarch64/sat_u_sub_borrow-1.c | 22 ++
.../gcc.target/aarch64/sat_u_sub_minmax-1.c | 18 +
.../gcc.target/aarch64/sat_u_sub_minmax-2.c | 32 ++
.../gcc.target/aarch64/sat_u_sub_minmax-3.c | 27 ++
.../gcc.target/aarch64/sat_u_sub_swapped-1.c | 27 ++
.../aarch64/saturating_arithmetic_1.c | 2 +-
.../aarch64/sve/saturating_arithmetic_1.c | 2 +-
.../aarch64/sve/saturating_arithmetic_3.c | 2 +-
.../aarch64/sve/saturating_arithmetic_4.c | 2 +-
.../vect-sat-trunc-clamp-inner-use-1.c | 22 ++
.../vect-sat-trunc-clamp-multi-use-1.c | 21 ++
.../aarch64/vect-sat-trunc-clamp-s-1.c | 7 +
.../vect-sat-trunc-clamp-s-negative-1.c | 30 ++
.../aarch64/vect-sat-trunc-clamp-u-1.c | 7 +
.../vect-sat-trunc-clamp-u-negative-1.c | 30 ++
.../aarch64/vect-sat-trunc-complement-1.c | 30 ++
.../vect-sat-trunc-range-precision-1.c | 7 +
...ect-sat-trunc-range-precision-negative-1.c | 24 ++
.../vect-sat-trunc-shift-sign-source-1.c | 7 +
...t-sat-trunc-shift-sign-source-negative-1.c | 122 +++++++
gcc/tree-ssa-math-opts.cc | 17 +-
38 files changed, 1807 insertions(+), 40 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/sat-trunc-signed-cmp-2.c
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-clamp-1.c
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-clamp-2.c
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-complement-1.c
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-range-precision-1.c
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-shift-sign-source-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_clamp-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_clamp-2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_val_ashr-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_min_not-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_not_cmp-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_not_cmp-2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_widen_lt-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_promoted-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_promoted-2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_borrow-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-3.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-inner-use-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-multi-use-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-s-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-s-negative-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-u-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-u-negative-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-complement-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-range-precision-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-range-precision-negative-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-shift-sign-source-1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-shift-sign-source-negative-1.c
From: Kyrylo Tkachov <ktkachov@nvidia.com> Hi all, This series teaches GCC to recognise some more saturating arithmetic patterns, primarily through match-sat-alu.pd and match.pd matchers. These patterns were identified in a number of OSS workloads like video encoding with the help of AI agents, though the patches themselves are manually written. Bootstrapped and tested on aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill Kyrylo Tkachov (13): match-sat-alu.pd: Allow wider ranges for signed saturating truncation match-sat-alu.pd: Recognize X - MIN (X, Y) as saturating subtraction match-sat-alu.pd: Recognize signed saturation clamps match-sat-alu.pd: Recognize borrow-test saturating subtraction match-sat-alu.pd: Recognize more unsigned saturating subtraction forms match-sat-alu.pd: Recognize complement tests for unsigned saturating addition match-sat-alu.pd: Recognize X + MIN (~X, Y) as unsigned saturating addition match-sat-alu.pd: Recognize strict widened unsigned saturation clamps match-sat-alu.pd: Recognize signed saturating truncation after a shift match-sat-alu.pd: Recognize unsigned constant-clamp truncation match-sat-alu.pd: Recognize signed constant-clamp truncation match-sat-alu.pd: Recognize complement masks for unsigned saturating truncation match.pd: Narrow promoted saturating addition and subtraction gcc/match-sat-alu.pd | 341 ++++++++++++++++-- gcc/match.pd | 37 ++ gcc/testsuite/gcc.dg/sat-trunc-signed-cmp-2.c | 42 +++ .../gcc.dg/vect/vect-sat-trunc-clamp-1.c | 121 +++++++ .../gcc.dg/vect/vect-sat-trunc-clamp-2.c | 126 +++++++ .../gcc.dg/vect/vect-sat-trunc-complement-1.c | 70 ++++ .../vect/vect-sat-trunc-range-precision-1.c | 122 +++++++ .../vect/vect-sat-trunc-shift-sign-source-1.c | 221 ++++++++++++ .../gcc.target/aarch64/sat_s_clamp-1.c | 78 ++++ .../gcc.target/aarch64/sat_s_clamp-2.c | 43 +++ .../gcc.target/aarch64/sat_s_val_ashr-1.c | 30 ++ .../gcc.target/aarch64/sat_u_add_min_not-1.c | 18 + .../gcc.target/aarch64/sat_u_add_not_cmp-1.c | 30 ++ .../gcc.target/aarch64/sat_u_add_not_cmp-2.c | 17 + .../gcc.target/aarch64/sat_u_add_widen_lt-1.c | 32 ++ .../gcc.target/aarch64/sat_u_promoted-1.c | 29 ++ .../gcc.target/aarch64/sat_u_promoted-2.c | 32 ++ .../gcc.target/aarch64/sat_u_sub_borrow-1.c | 22 ++ .../gcc.target/aarch64/sat_u_sub_minmax-1.c | 18 + .../gcc.target/aarch64/sat_u_sub_minmax-2.c | 32 ++ .../gcc.target/aarch64/sat_u_sub_minmax-3.c | 27 ++ .../gcc.target/aarch64/sat_u_sub_swapped-1.c | 27 ++ .../aarch64/saturating_arithmetic_1.c | 2 +- .../aarch64/sve/saturating_arithmetic_1.c | 2 +- .../aarch64/sve/saturating_arithmetic_3.c | 2 +- .../aarch64/sve/saturating_arithmetic_4.c | 2 +- .../vect-sat-trunc-clamp-inner-use-1.c | 22 ++ .../vect-sat-trunc-clamp-multi-use-1.c | 21 ++ .../aarch64/vect-sat-trunc-clamp-s-1.c | 7 + .../vect-sat-trunc-clamp-s-negative-1.c | 30 ++ .../aarch64/vect-sat-trunc-clamp-u-1.c | 7 + .../vect-sat-trunc-clamp-u-negative-1.c | 30 ++ .../aarch64/vect-sat-trunc-complement-1.c | 30 ++ .../vect-sat-trunc-range-precision-1.c | 7 + ...ect-sat-trunc-range-precision-negative-1.c | 24 ++ .../vect-sat-trunc-shift-sign-source-1.c | 7 + ...t-sat-trunc-shift-sign-source-negative-1.c | 122 +++++++ gcc/tree-ssa-math-opts.cc | 17 +- 38 files changed, 1807 insertions(+), 40 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/sat-trunc-signed-cmp-2.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-clamp-1.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-clamp-2.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-complement-1.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-range-precision-1.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-sat-trunc-shift-sign-source-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_clamp-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_clamp-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_s_val_ashr-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_min_not-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_not_cmp-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_not_cmp-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_add_widen_lt-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_promoted-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_promoted-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_borrow-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_minmax-3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-inner-use-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-multi-use-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-s-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-s-negative-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-u-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-clamp-u-negative-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-complement-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-range-precision-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-range-precision-negative-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-shift-sign-source-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-sat-trunc-shift-sign-source-negative-1.c