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:
parent
7b8bddb4d3
commit
286fa9840d
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user