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
This commit is contained in:
parent
9efd61f83b
commit
a59b07c1e1
4 changed files with 53 additions and 5 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
31
gcc/testsuite/gcc.c-torture/compile/pr84111.c
Normal file
31
gcc/testsuite/gcc.c-torture/compile/pr84111.c
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue