diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-04-21 16:19:20 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-04-21 16:19:20 +0000 |
commit | 7fdc504b710c98bd35cc6435af26eac7994516d7 (patch) | |
tree | 35203b209db18c9660d4be98dfd9a892e8804de4 /gcc/predict.c | |
parent | 09f4eead50cd3f3ee80c14513c9c37a1ccb936bd (diff) | |
download | gcc-7fdc504b710c98bd35cc6435af26eac7994516d7.tar.gz |
* predict.c (estimate_probability): New heuristic: if a jump
branches around a block with no successors, predict it taken.
Disentangle control flow.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33308 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 33 |
1 files changed, 27 insertions, 6 deletions
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)); } } |