re PR tree-optimization/84057 (ICE: Segmentation fault (in can_remove_branch_p))
authorRichard Biener <rguenther@suse.de>
Mon, 29 Jan 2018 09:16:09 +0000 (09:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 29 Jan 2018 09:16:09 +0000 (09:16 +0000)
2018-01-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84057
* tree-ssa-loop-ivcanon.c (unloop_loops): Deal with already
removed paths when removing edges.

* gcc.dg/graphite/pr84057.c: New testcase.

From-SVN: r257139

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/pr84057.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivcanon.c

index 8bd02a7d57590761ae3538bb6cfc35fdf2968c3c..ac75869a3e5d8b6085201406457f76f0556d1f46 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84057
+       * tree-ssa-loop-ivcanon.c (unloop_loops): Deal with already
+       removed paths when removing edges.
+
 2018-01-27  H.J. Lu  <hongjiu.lu@intel.com>
 
        * doc/invoke.texi: Replace -mfunction-return==@var{choice} with
index fa663f297e293f06d8dc784145742d93a8791d6f..18e19afcd0abdd6e70dc2fd0982610e67bf1e2f3 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84057
+       * gcc.dg/graphite/pr84057.c: New testcase.
+
 2017-01-29  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/84073
diff --git a/gcc/testsuite/gcc.dg/graphite/pr84057.c b/gcc/testsuite/gcc.dg/graphite/pr84057.c
new file mode 100644 (file)
index 0000000..9f7cea7
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgraphite -funroll-loops -fno-tree-ccp -fno-tree-dce" } */
+
+int ue;
+
+void
+fr (int ct)
+{
+  int au = 0;
+  int *ra = &au;
+
+  while (au < 1)
+    {
+      au -= 0x7878788;
+      if (au != ct && ue != 0)
+       {
+         while (au < 1)
+           {
+           }
+
+fc:
+         while (ct != 0)
+           {
+           }
+       }
+    }
+
+  for (au = 0; au < 2; ++au)
+    if (ct != 0)
+      goto fc;
+}
index 15c378aa998440406c9dde60534319c69deea1c3..a87ed0b920bdee8202ee37318de454f6b1f7e272 100644 (file)
@@ -660,14 +660,21 @@ unloop_loops (bitmap loop_closed_ssa_invalidated,
   loops_to_unloop.release ();
   loops_to_unloop_nunroll.release ();
 
-  /* Remove edges in peeled copies.  */
+  /* Remove edges in peeled copies.  Given remove_path removes dominated
+     regions we need to cope with removal of already removed paths.  */
   unsigned i;
   edge e;
+  auto_vec<int, 20> src_bbs;
+  src_bbs.reserve_exact (edges_to_remove.length ());
   FOR_EACH_VEC_ELT (edges_to_remove, i, e)
-    {
-      bool ok = remove_path (e, irred_invalidated, loop_closed_ssa_invalidated);
-      gcc_assert (ok);
-    }
+    src_bbs.quick_push (e->src->index);
+  FOR_EACH_VEC_ELT (edges_to_remove, i, e)
+    if (BASIC_BLOCK_FOR_FN (cfun, src_bbs[i]))
+      {
+       bool ok = remove_path (e, irred_invalidated,
+                              loop_closed_ssa_invalidated);
+       gcc_assert (ok);
+      }
   edges_to_remove.release ();
 }