diff options
Diffstat (limited to 'gcc/loop-doloop.c')
-rw-r--r-- | gcc/loop-doloop.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c index 05daabb22fb..49861b8e362 100644 --- a/gcc/loop-doloop.c +++ b/gcc/loop-doloop.c @@ -347,6 +347,8 @@ add_test (rtx cond, edge *e, basic_block dest) rtx op0 = XEXP (cond, 0), op1 = XEXP (cond, 1); enum rtx_code code = GET_CODE (cond); basic_block bb; + /* The jump is supposed to handle an unlikely special case. */ + profile_probability prob = profile_probability::guessed_never (); mode = GET_MODE (XEXP (cond, 0)); if (mode == VOIDmode) @@ -356,7 +358,8 @@ add_test (rtx cond, edge *e, basic_block dest) op0 = force_operand (op0, NULL_RTX); op1 = force_operand (op1, NULL_RTX); label = block_label (dest); - do_compare_rtx_and_jump (op0, op1, code, 0, mode, NULL_RTX, NULL, label, -1); + do_compare_rtx_and_jump (op0, op1, code, 0, mode, NULL_RTX, NULL, label, + prob); jump = get_last_insn (); if (!jump || !JUMP_P (jump)) @@ -386,12 +389,14 @@ add_test (rtx cond, edge *e, basic_block dest) JUMP_LABEL (jump) = label; - /* The jump is supposed to handle an unlikely special case. */ - add_int_reg_note (jump, REG_BR_PROB, 0); - LABEL_NUSES (label)++; - make_edge (bb, dest, (*e)->flags & ~EDGE_FALLTHRU); + edge e2 = make_edge (bb, dest, (*e)->flags & ~EDGE_FALLTHRU); + e2->probability = prob; + e2->count = e2->src->count.apply_probability (prob); + (*e)->probability = prob.invert (); + (*e)->count = (*e)->count.apply_probability (prob); + update_br_prob_note (e2->src); return true; } @@ -414,7 +419,6 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, bool increment_count; basic_block loop_end = desc->out_edge->src; machine_mode mode; - rtx true_prob_val; widest_int iterations; jump_insn = BB_END (loop_end); @@ -429,10 +433,6 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, fputs (" iterations).\n", dump_file); } - /* Get the probability of the original branch. If it exists we would - need to update REG_BR_PROB of the new jump_insn. */ - true_prob_val = find_reg_note (jump_insn, REG_BR_PROB, NULL_RTX); - /* Discard original jump to continue loop. The original compare result may still be live, so it cannot be discarded explicitly. */ delete_insn (jump_insn); @@ -575,11 +575,8 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, add_reg_note (jump_insn, REG_NONNEG, NULL_RTX); /* Update the REG_BR_PROB note. */ - if (true_prob_val) - { - /* Seems safer to use the branch probability. */ - add_int_reg_note (jump_insn, REG_BR_PROB, desc->in_edge->probability); - } + if (desc->in_edge->probability.initialized_p ()) + add_reg_br_prob_note (jump_insn, desc->in_edge->probability); } /* Called through note_stores. */ |