diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-04-22 19:16:03 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-04-22 19:16:03 +0000 |
commit | e511bae347a2b22c9f7c1da4c8776bbda21eb66d (patch) | |
tree | b977e3494c1f74abe0d48b035151221824fcd3a5 /gcc/predict.c | |
parent | 068255037d27a82ddcb78b909a41917872cf11ce (diff) | |
download | gcc-e511bae347a2b22c9f7c1da4c8776bbda21eb66d.tar.gz |
* predict.c (estimate_probability): Examine both sides of
a branch for no exits. Use 90% not 50% for predict taken.
Reorg for one copy of note generation code.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33343 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 57b71e2d9c2..6900f0ed217 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -103,34 +103,32 @@ estimate_probability (loops_info) { rtx last_insn = BLOCK_END (i); rtx cond, earliest; - int prob = 0; + int prob; 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; + /* If one of the successor blocks has no successors, predict + that side not taken. */ + /* ??? Ought to do the same for any subgraph with no exit. */ for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next) - if ((e->flags & EDGE_FALLTHRU) && e->dest->succ == NULL) + if (e->dest->succ == NULL) { - prob = REG_BR_PROB_BASE; - break; + if (e->flags & EDGE_FALLTHRU) + prob = REG_BR_PROB_BASE; + else + prob = 0; + goto emitnote; } - 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. @@ -143,7 +141,10 @@ estimate_probability (loops_info) && (XEXP (cond, 1) == const0_rtx || (GET_CODE (XEXP (cond, 1)) == REG && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1)))))) - prob = REG_BR_PROB_BASE / 10; + { + prob = REG_BR_PROB_BASE / 10; + goto emitnote; + } break; case NE: if (GET_CODE (XEXP (cond, 0)) == REG @@ -151,17 +152,14 @@ estimate_probability (loops_info) && (XEXP (cond, 1) == const0_rtx || (GET_CODE (XEXP (cond, 1)) == REG && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1)))))) - prob = REG_BR_PROB_BASE / 2; + { + prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); + goto emitnote; + } break; + default: - prob = 0; - } - if (prob) - { - REG_NOTES (last_insn) - = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), - REG_NOTES (last_insn)); - continue; + break; } /* Try "opcode heuristic." @@ -172,30 +170,42 @@ estimate_probability (loops_info) { case CONST_INT: /* Unconditional branch. */ - prob = REG_BR_PROB_BASE / 2; - break; + prob = (cond == const0_rtx ? 0 : REG_BR_PROB_BASE); + goto emitnote; + case EQ: prob = REG_BR_PROB_BASE / 10; - break; + goto emitnote; case NE: - prob = REG_BR_PROB_BASE / 2; - break; + prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); + goto emitnote; case LE: case LT: if (XEXP (cond, 1) == const0_rtx) - prob = REG_BR_PROB_BASE / 10; + { + prob = REG_BR_PROB_BASE / 10; + goto emitnote; + } break; case GE: case GT: if (XEXP (cond, 1) == const0_rtx || (GET_CODE (XEXP (cond, 1)) == CONST_INT && INTVAL (XEXP (cond, 1)) == -1)) - prob = REG_BR_PROB_BASE / 2; + { + prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); + goto emitnote; + } break; default: - prob = 0; + break; } + + /* If we havn't chosen something by now, predict 50-50. */ + prob = REG_BR_PROB_BASE / 2; + + emitnote: REG_NOTES (last_insn) = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob), REG_NOTES (last_insn)); |