[00/13] Saturating arithmetic matching improvements

Message ID 20260902145254.77832-1-ktkachov@nvidia.com
Headers
Series Saturating arithmetic matching improvements |

Message

Kyrylo Tkachov Sept. 2, 2026, 2:52 p.m. UTC
  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
  

Comments

Kyrylo Tkachov Sept. 2, 2026, 2:52 p.m. UTC | #1
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