]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/109331 - make sure to clean up the CFG after forwprop
authorRichard Biener <rguenther@suse.de>
Wed, 29 Mar 2023 09:59:16 +0000 (11:59 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 29 Mar 2023 11:55:47 +0000 (13:55 +0200)
When forwprop discovers unreachable code or makes decisions based
on unreachable edges make sure to cleanup the CFG since otherwise
SSA form can become invalid.

PR tree-optimization/109331
* tree-ssa-forwprop.cc (pass_forwprop::execute): When we
discover a taken edge make sure to cleanup the CFG.

* gcc.dg/torture/pr109331.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr109331.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr109331.c b/gcc/testsuite/gcc.dg/torture/pr109331.c
new file mode 100644 (file)
index 0000000..72c57b9
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+char *ustol_dpp;
+void ustol(int flags)
+{
+  char *s;
+  if (s)
+    flags |= 3;
+  switch (flags & 3)
+  case 3:
+    while (*s)
+    case '+':
+      ++s;
+  if (flags)
+    ustol_dpp = s;
+}
index bb0fa306312fa3a10dfd03336da05ea3435c90c3..9b567440ba4f1cb40f1507984e5d4e023623f834 100644 (file)
@@ -4046,7 +4046,11 @@ pass_forwprop::execute (function *fun)
 
       /* Mark outgoing exectuable edges.  */
       if (edge e = find_taken_edge (bb, NULL))
-       e->flags |= EDGE_EXECUTABLE;
+       {
+         e->flags |= EDGE_EXECUTABLE;
+         if (EDGE_COUNT (bb->succs) > 1)
+           cfg_changed = true;
+       }
       else
        {
          FOR_EACH_EDGE (e, ei, bb->succs)