[PATCH v1 0/1] tree-optimization/114502 - final value replacement for idempotent negation

Rachit Mehta via Sourceware Forge <[email protected]> Thu, 06 Aug 2026 11:05:30 +0000
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
Hi gcc-patches mailing list,
Rachit Mehta via Sourceware Forge <[email protected]> has requested that the following forgejo pull request
be published on the mailing list.

Created on: 2026-07-30 10:55:55+00:00
Latest update: 2026-08-06 11:05:30+00:00
Changes: 4 changed files, 296 additions, 1 deletions
Head revision: Rachit/gcc ref PR-114502 commit 7bda01c9f0fd3d2a364363a351cfec966b0bb511
Base revision: gcc/gcc ref trunk commit e873aac49eb2b58ae18e05f4150826278bdbb3cb r17-2839-ge873aac49eb2b5
Merge base: e873aac49eb2b58ae18e05f4150826278bdbb3cb
Full diff url: https://forge.sourceware.org/gcc/gcc/pulls/206.diff
Discussion:  https://forge.sourceware.org/gcc/gcc/pulls/206
Requested Reviewers:

SCEV cannot represent a period-2 recurrence, so recognize loops of the
form 'c = -c' with a constant trip count in the final-value replacement
and replace the exit value by c or -c depending on the parity of the trip
count.  Bail out when signed overflow must trap (-ftrapv) or be sanitized,
mirroring the existing bitop special-cases.

Tested on aarch64-linux-gnu: gcc.dg/tree-ssa/scev-negate-{1,2,3}.c all pass.

	PR tree-optimization/114502

```
gcc/ChangeLog:

	* tree-scalar-evolution.cc (analyze_and_compute_negate_effect): New.
	(final_value_replacement_loop): Call it.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/scev-negate-1.c: New test.
	* gcc.dg/tree-ssa/scev-negate-2.c: New test.
	* gcc.dg/tree-ssa/scev-negate-3.c: New test.
```

Signed-off-by: Rachit Mehta <[email protected]>


Changed files:
- A: gcc/testsuite/gcc.dg/tree-ssa/scev-negate-1.c
- A: gcc/testsuite/gcc.dg/tree-ssa/scev-negate-2.c
- A: gcc/testsuite/gcc.dg/tree-ssa/scev-negate-3.c
- M: gcc/tree-scalar-evolution.cc


Rachit Mehta (1):
  tree-optimization/114502 - final value replacement for idempotent
    negation

 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-1.c |  47 ++++++++
 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-2.c |  65 +++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-3.c |  82 ++++++++++++++
 gcc/tree-scalar-evolution.cc                  | 103 +++++++++++++++++-
 4 files changed, 296 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-1.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-2.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-negate-3.c

-- 
2.54.0