tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1): Rework father_bb setting in a way to avoid propagating constants multiple times...

2018-07-10  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1):
	Rework father_bb setting in a way to avoid propagating constants
	multiple times on a loop body.

From-SVN: r262550
This commit is contained in:
Richard Biener 2018-07-11 07:04:59 +00:00 committed by Richard Biener
parent 7b8bddb4d3
commit 286fa9840d
2 changed files with 37 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2018-07-10 Richard Biener <rguenther@suse.de>
* tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1):
Rework father_bb setting in a way to avoid propagating constants
multiple times on a loop body.
2018-07-10 Mark Wielaard <mark@klomp.org>
PR debug/86459

View File

@ -1378,17 +1378,37 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
/* 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. */
bitmap child_father_bbs = NULL;
for (inner = loop->inner; inner != NULL; inner = inner->next)
if ((unsigned) inner->num < num)
changed |= tree_unroll_loops_completely_1 (may_increase_size,
unroll_outer, father_bbs,
inner);
{
if (!child_father_bbs)
child_father_bbs = BITMAP_ALLOC (NULL);
if (tree_unroll_loops_completely_1 (may_increase_size, unroll_outer,
child_father_bbs, inner))
{
bitmap_ior_into (father_bbs, child_father_bbs);
bitmap_clear (child_father_bbs);
changed = true;
}
}
if (child_father_bbs)
BITMAP_FREE (child_father_bbs);
/* 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. */
if (changed)
{
/* If we are recorded as father clear all other fathers that
are necessarily covered already to avoid redundant work. */
if (bitmap_bit_p (father_bbs, loop->header->index))
{
bitmap_clear (father_bbs);
bitmap_set_bit (father_bbs, loop->header->index);
}
return true;
}
/* Don't unroll #pragma omp simd loops until the vectorizer
attempts to vectorize those. */
@ -1418,7 +1438,13 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
computations; otherwise, the size might blow up before the
iteration is complete and the IR eventually cleaned up. */
if (loop_outer (loop_father))
{
/* Once we process our father we will have processed
the fathers of our children as well, so avoid doing
redundant work and clear fathers we've gathered sofar. */
bitmap_clear (father_bbs);
bitmap_set_bit (father_bbs, loop_father->header->index);
}
return true;
}