aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-04-22 12:16:03 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-04-22 12:16:03 -0700
commit9bcbfc524a30efaaf3d3ba8fed33fe744a11fe9b (patch)
treeb977e3494c1f74abe0d48b035151221824fcd3a5 /gcc
parentb2433fcde0f08059731043f5af3d1ad687a1fbba (diff)
downloadgcc-9bcbfc524a30efaaf3d3ba8fed33fe744a11fe9b.zip
gcc-9bcbfc524a30efaaf3d3ba8fed33fe744a11fe9b.tar.gz
gcc-9bcbfc524a30efaaf3d3ba8fed33fe744a11fe9b.tar.bz2
predict.c (estimate_probability): Examine both sides of a branch for no exits.
* 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. From-SVN: r33343
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/predict.c74
2 files changed, 48 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7b3844a..4b12657 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2000-04-22 Richard Henderson <rth@cygnus.com>
+ * 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.
+
+2000-04-22 Richard Henderson <rth@cygnus.com>
+
* flow.c (mark_used_reg): Hack around rs6000 eliminable pic reg.
2000-04-22 Richard Henderson <rth@cygnus.com>
diff --git a/gcc/predict.c b/gcc/predict.c
index 57b71e2..6900f0e 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));