From 152897b1529264336677bc782f882a5b09041ac3 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Fri, 21 Apr 2000 16:19:20 +0000 Subject: [PATCH] predict.c (estimate_probability): New heuristic... * predict.c (estimate_probability): New heuristic: if a jump branches around a block with no successors, predict it taken. Disentangle control flow. From-SVN: r33308 --- gcc/ChangeLog | 6 ++++++ gcc/predict.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99659e9eef4..733d02d43e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-04-21 Zack Weinberg + + * predict.c (estimate_probability): New heuristic: if a jump + branches around a block with no successors, predict it taken. + Disentangle control flow. + 2000-04-20 Richard Henderson * loop.c (emit_iv_add_mult): Revert last change. diff --git a/gcc/predict.c b/gcc/predict.c index 958dbf925b8..7ed470929af 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -104,18 +104,37 @@ estimate_probability (loops_info) rtx last_insn = BLOCK_END (i); rtx cond, earliest; int prob = 0; + edge e; if (GET_CODE (last_insn) != JUMP_INSN || ! condjump_p (last_insn) || simplejump_p (last_insn)) continue; + if (find_reg_note (last_insn, REG_BR_PROB, 0)) + continue; cond = get_condition (last_insn, &earliest); if (! cond) continue; + /* If the jump branches around a block with no successors, + predict it to be taken. */ + prob = 0; + for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next) + if ((e->flags & EDGE_FALLTHRU) && e->dest->succ == NULL) + { + prob = REG_BR_PROB_BASE; + break; + } + if (prob) + { + REG_NOTES (last_insn) + = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), + REG_NOTES (last_insn)); + continue; + } + /* Try "pointer heuristic." A comparison ptr == 0 is predicted as false. Similarly, a comparison ptr1 == ptr2 is predicted as false. */ - prob = 0; switch (GET_CODE (cond)) { case EQ: @@ -137,10 +156,13 @@ estimate_probability (loops_info) default: prob = 0; } - if (prob && ! find_reg_note (last_insn, REG_BR_PROB, 0)) + if (prob) + { REG_NOTES (last_insn) = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), REG_NOTES (last_insn)); + continue; + } /* Try "opcode heuristic." EQ tests are usually false and NE tests are usually true. Also, @@ -174,10 +196,9 @@ estimate_probability (loops_info) default: prob = 0; } - if (! find_reg_note (last_insn, REG_BR_PROB, 0)) - REG_NOTES (last_insn) - = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), - REG_NOTES (last_insn)); + REG_NOTES (last_insn) + = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), + REG_NOTES (last_insn)); } } -- 2.30.2