aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2023-12-24 15:51:35 -0800
committerAndrew Pinski <quic_apinski@quicinc.com>2023-12-24 20:01:32 -0800
commit59ecd5ff096f800de17b804f1482055f2d84d629 (patch)
tree986d00ae3ea2571edf47980aefdb7af18e025c4a /gcc
parentf0269df25af37097a06ae247a18c71e24aa32e3e (diff)
downloadgcc-59ecd5ff096f800de17b804f1482055f2d84d629.zip
gcc-59ecd5ff096f800de17b804f1482055f2d84d629.tar.gz
gcc-59ecd5ff096f800de17b804f1482055f2d84d629.tar.bz2
match: Improve `(a != b) ? (a + b) : (2 * a)` pattern [PR19832]
In the testcase provided, we would match f_plus but not g_plus due to a missing `:c` on the plus operator. This fixes the oversight there. Note this was noted in https://github.com/llvm/llvm-project/issues/76318 . Committed as obvious after bootstrap/test on x86_64-linux-gnu. PR tree-optimization/19832 gcc/ChangeLog: * match.pd (`(a != b) ? (a + b) : (2 * a)`): Add `:c` on the plus operator. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/phi-opt-same-2.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/phi-opt-same-2.c19
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index d57e29b..a980c4d 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5694,7 +5694,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
@2)))
/* (a != b) ? (a + b) : (2 * a) -> (a + b) */
(simplify
- (cnd (ne:c @0 @1) (plus@2 @0 @1) (mult @0 uniform_integer_cst_p@3))
+ (cnd (ne:c @0 @1) (plus:c@2 @0 @1) (mult @0 uniform_integer_cst_p@3))
(if (wi::to_wide (uniform_integer_cst_p (@3)) == 2)
@2))
)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-same-2.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-same-2.c
new file mode 100644
index 0000000..94fb6a9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-same-2.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-phiopt1 -fdump-tree-optimized" } */
+/* PR tree-optimization/19832 */
+
+int f_plus(int a, int b)
+{
+ if (a != b) return a + b;
+ return a + a;
+}
+
+int g_plus(int a, int b)
+{
+ if (b != a) return a + b;
+ return a + a;
+}
+
+/* All of the above function's if should have been optimized away even in phiopt1. */
+/* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
+/* { dg-final { scan-tree-dump-not "if " "optimized" } } */