diff options
Diffstat (limited to 'gcc/loop-doloop.c')
-rw-r--r-- | gcc/loop-doloop.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c index 6e33a4f..448bb72 100644 --- a/gcc/loop-doloop.c +++ b/gcc/loop-doloop.c @@ -348,6 +348,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, bool increment_count; basic_block loop_end = desc->out_edge->src; enum machine_mode mode; + rtx true_prob_val; jump_insn = BB_END (loop_end); @@ -361,6 +362,10 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, fputs (" iterations).\n", dump_file); } + /* Get the probabilty 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); @@ -516,6 +521,15 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, REG_NOTES (jump_insn) = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX, REG_NOTES (jump_insn)); } + /* Update the REG_BR_PROB note. */ + if (true_prob_val) + { + /* Seems safer to use the branch probability. */ + REG_NOTES (jump_insn) = + gen_rtx_EXPR_LIST (REG_BR_PROB, + GEN_INT (desc->in_edge->probability), + REG_NOTES (jump_insn)); + } } /* Process loop described by LOOP validating that the loop is suitable for |