re PR tree-optimization/89135 (internal compiler error: in gimple_split_edge, at...
authorRichard Biener <rguenther@suse.de>
Thu, 31 Jan 2019 11:51:59 +0000 (11:51 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 31 Jan 2019 11:51:59 +0000 (11:51 +0000)
2019-01-31  Richard Biener  <rguenther@suse.de>

PR tree-optimization/89135
* tree-ssa-phiprop.c (pass_phiprop::execute): Skip blocks
with abnormal preds.

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

From-SVN: r268417

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr89135.c [new file with mode: 0644]
gcc/tree-ssa-phiprop.c

index a220d57560052d508aba57c686703ac1bade9e90..d0ce1170b1729bef995f7edc5ec9f2ac944b7112 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-31  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/89135
+       * tree-ssa-phiprop.c (pass_phiprop::execute): Skip blocks
+       with abnormal preds.
+
 2019-01-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/89124
index 48f4bbddd88b0a77abf1c2d69679ddaff7af6214..5197926d3d0f66d6ffba1bd9bf0ef03c19095b15 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-31  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/89135
+       * gcc.dg/torture/pr89135.c: New testcase.
+
 2019-01-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/89124
diff --git a/gcc/testsuite/gcc.dg/torture/pr89135.c b/gcc/testsuite/gcc.dg/torture/pr89135.c
new file mode 100644 (file)
index 0000000..8a93e89
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+
+typedef __INTPTR_TYPE__ intptr_t;
+intptr_t a, b, c, d;
+int foo (void) { return 0; }
+int baz (void);
+
+void
+bar (void)
+{
+  intptr_t g = (intptr_t) &&h;
+  void *i = &&j, *k = &&l;
+j:
+  if (baz ())
+    {
+      intptr_t **n = (intptr_t **) &a;
+l:
+      b = 0;
+      for (; b >= 0;)
+       goto *k;
+h:
+      **n = 0;
+      for (;;)
+       {
+         intptr_t *o = &c;
+         g = foo ();
+         *o = g;
+         if (c)
+           goto *d;
+       }
+    }
+  goto *i;
+}
index cad1d217ee75185c0073dfb47829f3aee1c5fa44..d710582a915e417e6d6ee698076942dae3babca6 100644 (file)
@@ -495,8 +495,14 @@ pass_phiprop::execute (function *fun)
   bbs = get_all_dominated_blocks (CDI_DOMINATORS,
                                  single_succ (ENTRY_BLOCK_PTR_FOR_FN (fun)));
   FOR_EACH_VEC_ELT (bbs, i, bb)
-    for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-      did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n);
+    {
+      /* Since we're going to move dereferences across predecessor
+         edges avoid blocks with abnormal predecessors.  */
+      if (bb_has_abnormal_pred (bb))
+       continue;
+      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+       did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n);
+    }
 
   if (did_something)
     gsi_commit_edge_inserts ();