summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2022-08-04 16:35:31 +0100
committerTamar Christina <tamar.christina@arm.com>2022-08-04 16:35:31 +0100
commitc832ec4c3ec4853ad89ff3b0dbf6e9454e75e8cc (patch)
tree9af9c6071176f56b879eb0b12ea58a4c5a1dc041
parent39579ba8de9d91eafcc4943259b154a9e66538f1 (diff)
middle-end: Fix phi-ssa assertion triggers. [PR106519]
For the diamond PHI form in tree_ssa_phiopt_worker we need to extract edge e2 sooner. This changes it so we extract it at the same time we determine we have a diamond shape. gcc/ChangeLog: PR middle-end/106519 * tree-ssa-phiopt.cc (tree_ssa_phiopt_worker): Check final phi edge for diamond shapes. gcc/testsuite/ChangeLog: PR middle-end/106519 * gcc.dg/pr106519.c: New test.
-rw-r--r--gcc/testsuite/gcc.dg/pr106519.c11
-rw-r--r--gcc/tree-ssa-phiopt.cc6
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/pr106519.c b/gcc/testsuite/gcc.dg/pr106519.c
new file mode 100644
index 00000000000..3d4662d8a02
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr106519.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+int bytestart, bytemem_0_0, modlookup_l_p;
+
+void
+modlookup_l() {
+ long j;
+ while (modlookup_l_p)
+ while (bytestart && j && bytemem_0_0)
+ j = j + 1;
+}
diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
index a8e55e04064..ef4c0b78f4e 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -269,7 +269,10 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
}
else if (EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest
&& !empty_block_p (bb1))
- diamond_p = true;
+ {
+ diamond_p = true;
+ e2 = EDGE_SUCC (bb2, 0);
+ }
else
continue;
@@ -324,7 +327,6 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
if (!candorest)
continue;
- e2 = diamond_p ? EDGE_SUCC (bb2, 0) : e2;
phi = single_non_singleton_phi_for_edges (phis, e1, e2);
if (!phi)
continue;