diff options
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index e92eaa6..2fbaa62 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -1801,7 +1801,7 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag, int freq_sum = 0; profile_count count_sum = profile_count::zero (); int nbbs = 0, ncount = 0; - int flag_probability = -1; + profile_probability flag_probability = profile_probability::uninitialized (); /* Flag is set in FLAG_BBS. Determine probability that flag will be true at loop exit. @@ -1824,27 +1824,29 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag, if ((*it)->count.initialized_p ()) count_sum += (*it)->count, ncount ++; if (dominated_by_p (CDI_DOMINATORS, ex->src, *it)) - flag_probability = REG_BR_PROB_BASE; + flag_probability = profile_probability::always (); nbbs++; } - if (flag_probability != -1) + profile_probability cap = profile_probability::always ().apply_scale (2, 3); + + if (flag_probability.initialized_p ()) ; else if (ncount == nbbs && count_sum > 0 && preheader->count >= count_sum) { flag_probability = count_sum.probability_in (preheader->count); - if (flag_probability > REG_BR_PROB_BASE * 2 / 3) - flag_probability = REG_BR_PROB_BASE * 2 / 3; + if (flag_probability > cap) + flag_probability = cap; } else if (freq_sum > 0 && EDGE_FREQUENCY (preheader) >= freq_sum) { - flag_probability = GCOV_COMPUTE_SCALE (freq_sum, - EDGE_FREQUENCY (preheader)); - if (flag_probability > REG_BR_PROB_BASE * 2 / 3) - flag_probability = REG_BR_PROB_BASE * 2 / 3; + flag_probability = profile_probability::from_reg_br_prob_base + (GCOV_COMPUTE_SCALE (freq_sum, EDGE_FREQUENCY (preheader))); + if (flag_probability > cap) + flag_probability = cap; } else - flag_probability = REG_BR_PROB_BASE * 2 / 3; + flag_probability = cap; /* ?? Insert store after previous store if applicable. See note below. */ @@ -1876,7 +1878,7 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag, old_dest = ex->dest; new_bb = split_edge (ex); then_bb = create_empty_bb (new_bb); - then_bb->frequency = apply_probability (new_bb->frequency, flag_probability); + then_bb->frequency = flag_probability.apply (new_bb->frequency); then_bb->count = new_bb->count.apply_probability (flag_probability); if (irr) then_bb->flags = BB_IRREDUCIBLE_LOOP; @@ -1901,13 +1903,11 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag, e1->flags |= EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0); e1->flags &= ~EDGE_FALLTHRU; - e1->probability = REG_BR_PROB_BASE - flag_probability; + e1->probability = flag_probability.invert (); e1->count = new_bb->count - then_bb->count; - then_old_edge = make_edge (then_bb, old_dest, + then_old_edge = make_single_succ_edge (then_bb, old_dest, EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); - then_old_edge->probability = REG_BR_PROB_BASE; - then_old_edge->count = then_bb->count; set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb); |