diff options
Diffstat (limited to 'gcc/cfgloopmanip.c')
-rw-r--r-- | gcc/cfgloopmanip.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 282515db97c..3753c048f8b 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -486,7 +486,7 @@ scale_loop_frequencies (struct loop *loop, int num, int den) struct loop * loopify (struct loops *loops, edge latch_edge, edge header_edge, - basic_block switch_bb) + basic_block switch_bb, bool redirect_all_edges) { basic_block succ_bb = latch_edge->dest; basic_block pred_bb = header_edge->src; @@ -513,12 +513,17 @@ loopify (struct loops *loops, edge latch_edge, edge header_edge, loop_redirect_edge (latch_edge, loop->header); loop_redirect_edge (BRANCH_EDGE (switch_bb), succ_bb); - loop_redirect_edge (header_edge, switch_bb); - loop_redirect_edge (FALLTHRU_EDGE (switch_bb), loop->header); - - /* Update dominators. */ - set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb); - set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb); + /* During loop versioning, one of the switch_bb edge is already properly + set. Do not redirect it again unless redirect_all_edges is true. */ + if (redirect_all_edges) + { + loop_redirect_edge (header_edge, switch_bb); + loop_redirect_edge (FALLTHRU_EDGE (switch_bb), loop->header); + + /* Update dominators. */ + set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb); + set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb); + } set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb); @@ -971,6 +976,9 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops, /* Copy bbs. */ copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop); + for (i = 0; i < n; i++) + new_bbs[i]->rbi->copy_number = j + 1; + /* Note whether the blocks and edges belong to an irreducible loop. */ if (add_irreducible_flag) { @@ -1049,6 +1057,8 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops, int n_dom_bbs,j; bb = bbs[i]; + bb->rbi->copy_number = 0; + n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs); for (j = 0; j < n_dom_bbs; j++) { @@ -1156,8 +1166,7 @@ create_preheader (struct loop *loop, int flags) } if (dump_file) - fprintf (dump_file, "Created preheader block for loop %i\n", - loop->num); + fprintf (dump_file, "Created preheader block for loop %i\n", loop->num); return dummy; } |