+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
+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
--- /dev/null
+/* { 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;
+}
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 ();
}