diff mbox series

Fix PR89135

Message ID alpine.LSU.2.20.1901310959080.23386@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR89135 | expand

Commit Message

Richard Biener Jan. 31, 2019, 8:59 a.m. UTC
I am testing the following patch to fix PR89135.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

Richard.

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.
diff mbox series

Patch

Index: gcc/tree-ssa-phiprop.c
===================================================================
--- gcc/tree-ssa-phiprop.c	(revision 268415)
+++ gcc/tree-ssa-phiprop.c	(working copy)
@@ -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 ();
Index: gcc/testsuite/gcc.dg/torture/pr89135.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr89135.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr89135.c	(working copy)
@@ -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;
+}