From: Jakub Jelinek Date: Tue, 30 Jan 2018 15:58:22 +0000 (+0100) Subject: re PR tree-optimization/84111 (Compile time hog w/ -O2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a59b07c1e17769b9b0cd126731a6466edbfe8801;p=gcc.git re PR tree-optimization/84111 (Compile time hog w/ -O2) 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. * gcc.c-torture/compile/pr84111.c: New test. From-SVN: r257188 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc75ffab7c8..0d2e8d53139 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-01-30 Richard Biener + Jakub Jelinek + + 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 PR ipa/81360 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a963d4b527d..c348529ea9b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-30 Jakub Jelinek + + PR tree-optimization/84111 + * gcc.c-torture/compile/pr84111.c: New test. + 2018-01-30 Jan Hubicka PR ipa/83179 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr84111.c b/gcc/testsuite/gcc.c-torture/compile/pr84111.c new file mode 100644 index 00000000000..51f598fa2df --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr84111.c @@ -0,0 +1,31 @@ +/* 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; + } +} diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index a87ed0b920b..24bf60eaa49 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -1373,13 +1373,17 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer, 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. */