This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: power4 branch hints
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Geoff Keating <geoffk at redhat dot com>, David Edelsohn <dje at watson dot ibm dot com>
- Date: Fri, 2 Aug 2002 12:20:23 +0930
- Subject: Re: power4 branch hints
- References: <amodra@bigpond.net.au> <200208020147.VAA27536@makai.watson.ibm.com>
On Thu, Aug 01, 2002 at 09:47:01PM -0400, David Edelsohn wrote:
> + int cpu_version1_arch = rs6000_cpu < PROCESSOR_POWER4;
>
> I am extremely conflicted about having a fragile test like the one
> above versus
OK, we came to agreement in private email. For the record, this is
what I'm committing.
* config/rs6000/rs6000.c (output_cbranch): Hint differently for power4.
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.355
diff -u -p -r1.355 rs6000.c
--- config/rs6000/rs6000.c 2 Aug 2002 01:08:01 -0000 1.355
+++ config/rs6000/rs6000.c 2 Aug 2002 02:46:19 -0000
@@ -8438,21 +8438,30 @@ output_cbranch (op, label, reversed, ins
/* Maybe we have a guess as to how likely the branch is.
The old mnemonics don't have a way to specify this information. */
+ pred = "";
note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
if (note != NULL_RTX)
{
/* PROB is the difference from 50%. */
int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
-
- /* For branches that are very close to 50%, assume not-taken. */
- if (abs (prob) > REG_BR_PROB_BASE / 20
- && ((prob > 0) ^ need_longbranch))
- pred = "+";
- else
- pred = "-";
+ bool always_hint = rs6000_cpu != PROCESSOR_POWER4;
+
+ /* Only hint for highly probable/improbable branches on newer
+ cpus as static prediction overrides processor dynamic
+ prediction. For older cpus we may as well always hint, but
+ assume not taken for branches that are very close to 50% as a
+ mispredicted taken branch is more expensive than a
+ mispredicted not-taken branch. */
+ if (always_hint
+ || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
+ {
+ if (abs (prob) > REG_BR_PROB_BASE / 20
+ && ((prob > 0) ^ need_longbranch))
+ pred = "+";
+ else
+ pred = "-";
+ }
}
- else
- pred = "";
if (label == NULL)
s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
--
Alan Modra
IBM OzLabs - Linux Technology Centre