Commit c66f079e by Richard Henderson

predict.c (PROB_NEVER, [...]): New.

        * predict.c (PROB_NEVER, PROB_VERY_UNLIKELY): New.
        (PROB_UNLIKELY, PROB_EVEN, PROB_LIKELY): New.
        (PROB_VERY_LIKELY, PROB_ALWAYS): New.
        (estimate_probability, expected_value_to_br_prob): Use them.

From-SVN: r33792
parent 2ff00dd4
...@@ -48,6 +48,14 @@ ...@@ -48,6 +48,14 @@
#include "expr.h" #include "expr.h"
/* Random guesstimation given names. */
#define PROB_NEVER (0)
#define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 10 - 1)
#define PROB_UNLIKELY (REG_BR_PROB_BASE * 4 / 10 - 1)
#define PROB_EVEN (REG_BR_PROB_BASE / 2)
#define PROB_LIKELY (REG_BR_PROB_BASE - PROB_UNLIKELY)
#define PROB_VERY_LIKELY (REG_BR_PROB_BASE - PROB_VERY_UNLIKELY)
#define PROB_ALWAYS (REG_BR_PROB_BASE)
/* Statically estimate the probability that a branch will be taken. /* Statically estimate the probability that a branch will be taken.
??? In the next revision there will be a number of other predictors added ??? In the next revision there will be a number of other predictors added
...@@ -89,7 +97,7 @@ estimate_probability (loops_info) ...@@ -89,7 +97,7 @@ estimate_probability (loops_info)
if (! find_reg_note (last_insn, REG_BR_PROB, 0)) if (! find_reg_note (last_insn, REG_BR_PROB, 0))
REG_NOTES (last_insn) REG_NOTES (last_insn)
= gen_rtx_EXPR_LIST (REG_BR_PROB, = gen_rtx_EXPR_LIST (REG_BR_PROB,
GEN_INT (REG_BR_PROB_BASE), GEN_INT (PROB_VERY_LIKELY),
REG_NOTES (last_insn)); REG_NOTES (last_insn));
} }
} }
...@@ -124,9 +132,9 @@ estimate_probability (loops_info) ...@@ -124,9 +132,9 @@ estimate_probability (loops_info)
if (e->dest->succ == NULL) if (e->dest->succ == NULL)
{ {
if (e->flags & EDGE_FALLTHRU) if (e->flags & EDGE_FALLTHRU)
prob = REG_BR_PROB_BASE; prob = PROB_ALWAYS;
else else
prob = 0; prob = PROB_NEVER;
goto emitnote; goto emitnote;
} }
...@@ -142,7 +150,7 @@ estimate_probability (loops_info) ...@@ -142,7 +150,7 @@ estimate_probability (loops_info)
|| (GET_CODE (XEXP (cond, 1)) == REG || (GET_CODE (XEXP (cond, 1)) == REG
&& REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1)))))) && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
{ {
prob = REG_BR_PROB_BASE / 10; prob = PROB_UNLIKELY;
goto emitnote; goto emitnote;
} }
break; break;
...@@ -153,7 +161,7 @@ estimate_probability (loops_info) ...@@ -153,7 +161,7 @@ estimate_probability (loops_info)
|| (GET_CODE (XEXP (cond, 1)) == REG || (GET_CODE (XEXP (cond, 1)) == REG
&& REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1)))))) && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
{ {
prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); prob = PROB_LIKELY;
goto emitnote; goto emitnote;
} }
break; break;
...@@ -170,20 +178,20 @@ estimate_probability (loops_info) ...@@ -170,20 +178,20 @@ estimate_probability (loops_info)
{ {
case CONST_INT: case CONST_INT:
/* Unconditional branch. */ /* Unconditional branch. */
prob = (cond == const0_rtx ? 0 : REG_BR_PROB_BASE); prob = (cond == const0_rtx ? PROB_NEVER : PROB_ALWAYS);
goto emitnote; goto emitnote;
case EQ: case EQ:
prob = REG_BR_PROB_BASE / 10; prob = PROB_UNLIKELY;
goto emitnote; goto emitnote;
case NE: case NE:
prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); prob = PROB_LIKELY;
goto emitnote; goto emitnote;
case LE: case LE:
case LT: case LT:
if (XEXP (cond, 1) == const0_rtx) if (XEXP (cond, 1) == const0_rtx)
{ {
prob = REG_BR_PROB_BASE / 10; prob = PROB_UNLIKELY;
goto emitnote; goto emitnote;
} }
break; break;
...@@ -193,7 +201,7 @@ estimate_probability (loops_info) ...@@ -193,7 +201,7 @@ estimate_probability (loops_info)
|| (GET_CODE (XEXP (cond, 1)) == CONST_INT || (GET_CODE (XEXP (cond, 1)) == CONST_INT
&& INTVAL (XEXP (cond, 1)) == -1)) && INTVAL (XEXP (cond, 1)) == -1))
{ {
prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10); prob = PROB_LIKELY;
goto emitnote; goto emitnote;
} }
break; break;
...@@ -203,7 +211,7 @@ estimate_probability (loops_info) ...@@ -203,7 +211,7 @@ estimate_probability (loops_info)
} }
/* If we havn't chosen something by now, predict 50-50. */ /* If we havn't chosen something by now, predict 50-50. */
prob = REG_BR_PROB_BASE / 2; prob = PROB_EVEN;
emitnote: emitnote:
REG_NOTES (last_insn) REG_NOTES (last_insn)
...@@ -280,8 +288,10 @@ expected_value_to_br_prob () ...@@ -280,8 +288,10 @@ expected_value_to_br_prob ()
/* Turn the condition into a scaled branch probability. */ /* Turn the condition into a scaled branch probability. */
if (cond == const1_rtx) if (cond == const1_rtx)
cond = GEN_INT (REG_BR_PROB_BASE); cond = GEN_INT (PROB_VERY_LIKELY);
else if (cond != const0_rtx) else if (cond == const0_rtx)
cond = GEN_INT (PROB_VERY_UNLIKELY);
else
abort (); abort ();
REG_NOTES (insn) = alloc_EXPR_LIST (REG_BR_PROB, cond, REG_NOTES (insn)); REG_NOTES (insn) = alloc_EXPR_LIST (REG_BR_PROB, cond, REG_NOTES (insn));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment