diff options
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 432e8373f38..daf98398f29 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -669,13 +669,15 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops) /* Loop branch heuristics - predict an edge back to a loop's head as taken. */ - FOR_EACH_EDGE (e, ei, bb->succs) - if (e->dest == loop->header - && e->src == loop->latch) - { - header_found = 1; - predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN); - } + if (bb == loop->latch) + { + e = find_edge (loop->latch, loop->header); + if (e) + { + header_found = 1; + predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN); + } + } /* Loop exit heuristics - predict an edge exiting the loop if the conditional has no loop header successors as not taken. */ @@ -1660,21 +1662,20 @@ propagate_freq (struct loop *loop, bitmap tovisit) bitmap_clear_bit (tovisit, bb->index); - /* Compute back edge frequencies. */ - FOR_EACH_EDGE (e, ei, bb->succs) - if (e->dest == head) - { - sreal tmp; + e = find_edge (bb, head); + if (e) + { + sreal tmp; - /* EDGE_INFO (e)->back_edge_prob - = ((e->probability * BLOCK_INFO (bb)->frequency) - / REG_BR_PROB_BASE); */ + /* EDGE_INFO (e)->back_edge_prob + = ((e->probability * BLOCK_INFO (bb)->frequency) + / REG_BR_PROB_BASE); */ - sreal_init (&tmp, e->probability, 0); - sreal_mul (&tmp, &tmp, &BLOCK_INFO (bb)->frequency); - sreal_mul (&EDGE_INFO (e)->back_edge_prob, - &tmp, &real_inv_br_prob_base); - } + sreal_init (&tmp, e->probability, 0); + sreal_mul (&tmp, &tmp, &BLOCK_INFO (bb)->frequency); + sreal_mul (&EDGE_INFO (e)->back_edge_prob, + &tmp, &real_inv_br_prob_base); + } /* Propagate to successor blocks. */ FOR_EACH_EDGE (e, ei, bb->succs) |