[PATCH 0/2] Handle idempotent and toggle recurrences in SCEV final value replacement

liuhongt <[email protected]> Tue, 4 Aug 2026 19:45:28 -0700
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
 Structure:
  - Motivation — SCEV can't represent non-polynomial recurrences, so
  final_value_replacement_loop bails on MIN/NEG style loops whose exit value
  depends only on the initial value (plus trip-count parity).
  - Patch 1 — idempotent updates (MIN/MAX/AND/IOR/ABS): apply-once equals
  apply-N-times, no niter reasoning needed.
  - Patch 2 — toggle updates (NEG/NOT/XOR): parity of the latch count selects
  between initial and toggled value; constant niter folds, symbolic niter emits
  (niter & 1) == 0 ? toggled : initial.

Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
Ok for trunk?

liuhongt (2):
  tree-scalar-evolution: Handle idempotent recurrences [PR124460]
  tree-scalar-evolution: Handle toggle recurrences

 gcc/testsuite/gcc.dg/tree-ssa/pr124460-1.c |  40 ++++++
 gcc/testsuite/gcc.dg/tree-ssa/pr124460-2.c |  41 ++++++
 gcc/testsuite/gcc.dg/tree-ssa/pr124460-3.c |  22 +++
 gcc/testsuite/gcc.dg/tree-ssa/pr124460-4.c |  96 +++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/pr124460-5.c |  40 ++++++
 gcc/testsuite/gcc.target/i386/pr105735-1.c |   2 +-
 gcc/testsuite/gcc.target/i386/pr105735-3.c |   2 +-
 gcc/testsuite/gcc.target/i386/pr92080-12.c |  12 +-
 gcc/tree-scalar-evolution.cc               | 153 +++++++++++++--------
 9 files changed, 343 insertions(+), 65 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124460-1.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124460-2.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124460-3.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124460-4.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124460-5.c

-- 
2.34.1