+2018-01-30 Richard Biener <rguenther@suse.de>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/84111
+ * tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1): Skip
+ inner loops added during recursion, as they don't have up-to-date
+ SSA form.
+
2018-01-30 Jan Hubicka <hubicka@ucw.cz>
PR ipa/81360
+2018-01-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/84111
+ * gcc.c-torture/compile/pr84111.c: New test.
+
2018-01-30 Jan Hubicka <hubicka@ucw.cz>
PR ipa/83179
--- /dev/null
+/* PR tree-optimization/84111 */
+
+void
+foo (int x, int y, int z)
+{
+ int a = 0;
+ int *b = &x;
+
+ while (a < 1)
+ {
+ int c = y;
+ *b = x;
+ lab:
+ for (a = 0; a < 36; ++a)
+ {
+ *b = 0;
+ if (x != 0)
+ y = 0;
+ while (c < 1)
+ ;
+ }
+ }
+ if (z < 33)
+ {
+ b = (int *) 0;
+ ++y;
+ ++z;
+ if (x / *b != 0)
+ goto lab;
+ }
+}
bool changed = false;
struct loop *inner;
enum unroll_level ul;
+ unsigned num = number_of_loops (cfun);
- /* Process inner loops first. */
+ /* Process inner loops first. Don't walk loops added by the recursive
+ calls because SSA form is not up-to-date. They can be handled in the
+ next iteration. */
for (inner = loop->inner; inner != NULL; inner = inner->next)
- changed |= tree_unroll_loops_completely_1 (may_increase_size,
- unroll_outer, father_bbs,
- inner);
-
+ if ((unsigned) inner->num < num)
+ changed |= tree_unroll_loops_completely_1 (may_increase_size,
+ unroll_outer, father_bbs,
+ inner);
+
/* If we changed an inner loop we cannot process outer loops in this
iteration because SSA form is not up-to-date. Continue with
siblings of outer loops instead. */