diff options
author | Andrew Pinski <quic_apinski@quicinc.com> | 2024-11-15 23:20:42 -0800 |
---|---|---|
committer | Andrew Pinski <quic_apinski@quicinc.com> | 2024-11-16 11:10:49 -0800 |
commit | b085fc9965b7d1e99725892587682822068f2baa (patch) | |
tree | c6213c645f86497e3030ad5b07252b13c68ae979 /gcc/testsuite | |
parent | 5eadc673366c68a62264c55a570cbdfca96bbbaa (diff) | |
download | gcc-b085fc9965b7d1e99725892587682822068f2baa.zip gcc-b085fc9965b7d1e99725892587682822068f2baa.tar.gz gcc-b085fc9965b7d1e99725892587682822068f2baa.tar.bz2 |
match: Optimize `max(a,b) == 0` to `(a|b) == 0` for unsigned [PR115275]
For unsigned types, you can optimize `max<a,b> == 0` into
`(a|b) == 0` (that is both have to be zero). A similar thing happens for `!= 0`.
This optimization fixes the missed optimization (g++.dg/tree-ssa/pr115275.C)
that was reported exposed by adding phiprop early.
Bootstrapped and tested on x86_64-linux-gnu.
PR tree-optimization/115275
gcc/ChangeLog:
* match.pd (umax(a,b) ==/!= 0): New pattern.
gcc/testsuite/ChangeLog:
* g++.dg/tree-ssa/pr115275.C: New test.
* gcc.dg/tree-ssa/max_eqne-1.c: New test.
* gcc.dg/tree-ssa/max_eqne-2.c: New test.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr115275.C | 36 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/max_eqne-1.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/max_eqne-2.c | 19 |
3 files changed, 75 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr115275.C b/gcc/testsuite/g++.dg/tree-ssa/pr115275.C new file mode 100644 index 0000000..1b84766 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr115275.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +/* PR tree-optimization/115275 */ + +template<class T> +inline const T & +min(const T &a, const T &b) +{ + return a < b ? a : b; +} + +template<class T> +inline const T & +max(const T &a, const T &b) +{ + return a < b ? b : a; +} + + +unsigned short m, a, b; +void removeme (); +void fn(unsigned short f) { + if( + (min(max(f, a) ? f : 0U, 84991U)) + - + (min(max(f, b) ? f : 0U, 84991U)) + ) + { + removeme(); + } +} + +/* removeme call should be optimized out. */ + +/* { dg-final { scan-tree-dump-not "removeme " "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-1.c b/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-1.c new file mode 100644 index 0000000..a7f5e0e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-1.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized-raw" } */ + +/* PR tree-optimization/115275 */ + +unsigned maxne(unsigned a, unsigned b) +{ + unsigned t = a > b ? a : b; + return t != 0; +} +unsigned maxeq(unsigned a, unsigned b) +{ + unsigned t = a > b ? a : b; + return t == 0; +} +/* `max(a,b) == 0` should be optimized to `(a|b) == 0` for unsigned types. */ +/* { dg-final { scan-tree-dump-not "max_expr, " "optimized" } } */ +/* { dg-final { scan-tree-dump-times "bit_ior_expr, " 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "eq_expr, " 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "ne_expr, " 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-2.c b/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-2.c new file mode 100644 index 0000000..50808cc --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/max_eqne-2.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized-raw" } */ + +/* PR tree-optimization/115275 */ +signed maxne(signed a, signed b) +{ + unsigned t = a > b ? a : b; + return t != 0; +} +signed maxeq(signed a, signed b) +{ + unsigned t = a > b ? a : b; + return t == 0; +} +/* For signed types, `max(a,b) == 0` should not optimized to `(a|b) == 0`. */ +/* { dg-final { scan-tree-dump-times "max_expr, " 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-not "bit_ior_expr, " "optimized" } } */ +/* { dg-final { scan-tree-dump-times "eq_expr, " 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "ne_expr, " 1 "optimized" } } */ |