summaryrefslogtreecommitdiff
path: root/gcc/predict.c
diff options
context:
space:
mode:
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-21 16:19:20 +0000
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-21 16:19:20 +0000
commit7fdc504b710c98bd35cc6435af26eac7994516d7 (patch)
tree35203b209db18c9660d4be98dfd9a892e8804de4 /gcc/predict.c
parent09f4eead50cd3f3ee80c14513c9c37a1ccb936bd (diff)
downloadgcc-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.c33
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));
}
}