]> git.ipfire.org Git - thirdparty/gcc.git/commit
match.pd: Guard 2 simplifications on integral TYPE_OVERFLOW_UNDEFINED [PR114090]
authorJakub Jelinek <jakub@redhat.com>
Mon, 26 Feb 2024 09:08:45 +0000 (10:08 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 2 Mar 2024 00:37:26 +0000 (01:37 +0100)
commit6b8d8a8bce88981554e5ffeb66bcb6b71a869e62
treee6f14b2337bb1b1697e04bd02699b4b57ef3bc4d
parent051cd2a3ee9ba9f47d640a10e96c79b6c5124736
match.pd: Guard 2 simplifications on integral TYPE_OVERFLOW_UNDEFINED [PR114090]

These 2 patterns are incorrect on floating point, or for -fwrapv, or
for -ftrapv, or the first one for unsigned types (the second one is
mathematically correct, but we ought to just fold that to 0 instead).

So, the following patch properly guards this.

I think we don't need && !TYPE_OVERFLOW_SANITIZED (type) because
in both simplifications there would be UB before and after on
signed integer minimum.

2024-02-26  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/114090
* match.pd ((x >= 0 ? x : 0) + (x <= 0 ? -x : 0) -> abs x):
Restrict pattern to ANY_INTEGRAL_TYPE_P and TYPE_OVERFLOW_UNDEFINED
types.
((x <= 0 ? -x : 0) -> max(-x, 0)): Likewise.

* gcc.dg/pr114090.c: New test.

(cherry picked from commit 24aa051af7c59f37ec45aea754b48b97d210ea6d)
gcc/match.pd
gcc/testsuite/gcc.dg/pr114090.c [new file with mode: 0644]