aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr110298.c20
-rw-r--r--gcc/tree-ssa-loop-ivcanon.cc7
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr110298.c b/gcc/testsuite/gcc.dg/torture/pr110298.c
new file mode 100644
index 0000000..139f5c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr110298.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int a, b, c, d, e;
+int f() {
+ c = 0;
+ for (; c >= 0; c--) {
+ d = 0;
+ for (; d <= 0; d++) {
+ e = 0;
+ for (; d + c + e >= 0; e--)
+ ;
+ a = 1;
+ b = 0;
+ for (; a; ++b)
+ a *= 2;
+ for (; b + d >= 0;)
+ return 0;
+ }
+ }
+}
diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-ivcanon.cc
index 6a962a9..491b57e 100644
--- a/gcc/tree-ssa-loop-ivcanon.cc
+++ b/gcc/tree-ssa-loop-ivcanon.cc
@@ -1520,15 +1520,16 @@ tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
}
BITMAP_FREE (fathers);
+ /* Clean up the information about numbers of iterations, since
+ complete unrolling might have invalidated it. */
+ scev_reset ();
+
/* This will take care of removing completely unrolled loops
from the loop structures so we can continue unrolling now
innermost loops. */
if (cleanup_tree_cfg ())
update_ssa (TODO_update_ssa_only_virtuals);
- /* Clean up the information about numbers of iterations, since
- complete unrolling might have invalidated it. */
- scev_reset ();
if (flag_checking && loops_state_satisfies_p (LOOP_CLOSED_SSA))
verify_loop_closed_ssa (true);
}