diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-01-30 16:58:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-01-30 16:58:22 +0100 |
commit | a59b07c1e17769b9b0cd126731a6466edbfe8801 (patch) | |
tree | b4c5d497b845046df4408d08e8f0aa3e99dbada9 | |
parent | 9efd61f83b1bf59a4a20fe8d116ddd6bc402dd07 (diff) | |
download | gcc-a59b07c1e17769b9b0cd126731a6466edbfe8801.zip gcc-a59b07c1e17769b9b0cd126731a6466edbfe8801.tar.gz gcc-a59b07c1e17769b9b0cd126731a6466edbfe8801.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr84111.c | 31 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 14 |
4 files changed, 53 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc75ffa..0d2e8d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a963d4b..c348529 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 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 0000000..51f598f --- /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 a87ed0b..24bf60e 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. */ |