aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-01-05 11:18:17 +0100
committerJakub Jelinek <jakub@redhat.com>2024-01-05 11:18:17 +0100
commitb8faf1fca42a9b987fec0992ca5d63995b2640b3 (patch)
tree9778db5cc23ae6696c7415fa9769e1f1c3afc51d /gcc
parent0152637c74c9eab7658483b1cca4e3d584dd4262 (diff)
downloadgcc-b8faf1fca42a9b987fec0992ca5d63995b2640b3.zip
gcc-b8faf1fca42a9b987fec0992ca5d63995b2640b3.tar.gz
gcc-b8faf1fca42a9b987fec0992ca5d63995b2640b3.tar.bz2
scev: Avoid ICE on results used in abnormal PHI args [PR113201]
The following testcase ICEs when rslt is SSA_NAME_OCCURS_IN_ABNORMAL_PHI and we call replace_uses_by with a INTEGER_CST def, where it ICEs on: if (e->flags & EDGE_ABNORMAL && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)) because val is not an SSA_NAME. One way would be to add && TREE_CODE (val) == SSA_NAME check in between the above 2 lines in replace_uses_by. And/or the following patch just punts propagating constants to SSA_NAME_OCCURS_IN_ABNORMAL_PHI rslt uses. Or we could punt somewhere earlier in final value replacement (but dunno where). 2024-01-05 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/113201 * tree-scalar-evolution.cc (final_value_replacement_loop): Don't call replace_uses_by on SSA_NAME_OCCURS_IN_ABNORMAL_PHI rslt. * gcc.c-torture/compile/pr113201.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr113201.c15
-rw-r--r--gcc/tree-scalar-evolution.cc2
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr113201.c b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
new file mode 100644
index 0000000..72ec761
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
@@ -0,0 +1,15 @@
+/* PR tree-optimization/113201 */
+
+void foo (void) __attribute__((returns_twice));
+void bar (void);
+
+int
+baz (void)
+{
+ int x = 42;
+ foo ();
+ while (--x)
+ ;
+ bar ();
+ return x;
+}
diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
index 481ce7c..25e3130 100644
--- a/gcc/tree-scalar-evolution.cc
+++ b/gcc/tree-scalar-evolution.cc
@@ -3881,7 +3881,7 @@ final_value_replacement_loop (class loop *loop)
/* Propagate constants immediately, but leave an unused initialization
around to avoid invalidating the SCEV cache. */
- if (CONSTANT_CLASS_P (def))
+ if (CONSTANT_CLASS_P (def) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rslt))
replace_uses_by (rslt, def);
/* Create the replacement statements. */