From bfb7f32bdf46e291321929faf51c23f91deeb0ad Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 11 Jul 2018 07:04:59 +0000 Subject: [PATCH] 2018-07-10 Richard Biener * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@262550 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa-loop-ivcanon.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a333a523b8e..8250b44e49a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-07-10 Richard Biener + + * 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 PR debug/86459 diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index 5f741c3b498..326589f63c3 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -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) - return true; + { + /* 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)) - bitmap_set_bit (father_bbs, loop_father->header->index); + { + /* 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; } -- 2.11.4.GIT