diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-24 12:25:22 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-24 12:25:22 +0000 |
commit | 7465dbcda82f9a78067ef5992369db3ac9ad9420 (patch) | |
tree | e719b1da7d230192f4964664cd374d04f8b94006 /gcc/cfgloopmanip.c | |
parent | 8c4ae287ec3e291952cc8be2a28e2332ee46ff42 (diff) | |
download | gcc-7465dbcda82f9a78067ef5992369db3ac9ad9420.tar.gz |
2016-11-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/71595
* cfgloopmanip.h (remove_path): Add irred_invalidated and
loop_closed_ssa_invalidated parameters, defaulted to NULL.
* cfgloopmanip.c (remove_path): Likewise, pass them along to
called functions. Only fix irred flags if the caller didn't
request state.
* tree-ssa-loop-ivcanon.c (unloop_loops): Use add_bb_to_loop.
(unloop_loops): Pass irred_invalidated and loop_closed_ssa_invalidated
to remove_path.
* gcc.dg/torture/pr71595.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@242835 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgloopmanip.c')
-rw-r--r-- | gcc/cfgloopmanip.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index eb868393fac..84b6b019bc9 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -298,16 +298,20 @@ fix_bb_placements (basic_block from, and update loop structures and dominators. Return true if we were able to remove the path, false otherwise (and nothing is affected then). */ bool -remove_path (edge e) +remove_path (edge e, bool *irred_invalidated, + bitmap loop_closed_ssa_invalidated) { edge ae; basic_block *rem_bbs, *bord_bbs, from, bb; vec<basic_block> dom_bbs; int i, nrem, n_bord_bbs; - bool irred_invalidated = false; + bool local_irred_invalidated = false; edge_iterator ei; struct loop *l, *f; + if (! irred_invalidated) + irred_invalidated = &local_irred_invalidated; + if (!can_remove_branch_p (e)) return false; @@ -317,7 +321,7 @@ remove_path (edge e) that is inside an irreducible region is changed, or if such a loop is removed. */ if (e->flags & EDGE_IRREDUCIBLE_LOOP) - irred_invalidated = true; + *irred_invalidated = true; /* We need to check whether basic blocks are dominated by the edge e, but we only have basic block dominators. This is easy to @@ -334,7 +338,7 @@ remove_path (edge e) { f = loop_outer (l); if (dominated_by_p (CDI_DOMINATORS, l->latch, e->dest)) - unloop (l, &irred_invalidated, NULL); + unloop (l, irred_invalidated, loop_closed_ssa_invalidated); } /* Identify the path. */ @@ -348,13 +352,13 @@ remove_path (edge e) /* Find "border" hexes -- i.e. those with predecessor in removed path. */ for (i = 0; i < nrem; i++) bitmap_set_bit (seen, rem_bbs[i]->index); - if (!irred_invalidated) + if (!*irred_invalidated) FOR_EACH_EDGE (ae, ei, e->src->succs) if (ae != e && ae->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) && !bitmap_bit_p (seen, ae->dest->index) && ae->flags & EDGE_IRREDUCIBLE_LOOP) { - irred_invalidated = true; + *irred_invalidated = true; break; } @@ -369,7 +373,7 @@ remove_path (edge e) bord_bbs[n_bord_bbs++] = ae->dest; if (ae->flags & EDGE_IRREDUCIBLE_LOOP) - irred_invalidated = true; + *irred_invalidated = true; } } @@ -411,10 +415,10 @@ remove_path (edge e) /* Fix placements of basic blocks inside loops and the placement of loops in the loop tree. */ - fix_bb_placements (from, &irred_invalidated, NULL); - fix_loop_placements (from->loop_father, &irred_invalidated); + fix_bb_placements (from, irred_invalidated, loop_closed_ssa_invalidated); + fix_loop_placements (from->loop_father, irred_invalidated); - if (irred_invalidated + if (local_irred_invalidated && loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)) mark_irreducible_loops (); |