Hello,
while working on another PR I've noticed that the -mbranch-cost option
in the SH target is not really working. The attached patch brings it
back to life, leaving the default behavior unchanged.
Cheers,
Oleg
2011-12-28 Oleg Endo <[email protected]>
* config/sh/sh.h (BRANCH_COST): Use sh_branch_cost variable.
* config/sh/sh.c (sh_option_override): Simplify sh_branch_cost
expression.
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c (revision 182695)
+++ gcc/config/sh/sh.c (working copy)
@@ -724,9 +724,16 @@
else
sh_divsi3_libfunc = "__sdivsi3";
if (sh_branch_cost == -1)
- sh_branch_cost
- = TARGET_SH5 ? 1 : ! TARGET_SH2 || TARGET_HARD_SH4 ? 2 : 1;
+ {
+ sh_branch_cost = 1;
+ /* The SH1 does not have delay slots, hence we get a pipeline stall
+ at every branch. The SH4 is superscalar, so the single delay slot
+ is not sufficient to keep both pipelines filled. */
+ if (! TARGET_SH2 || TARGET_HARD_SH4)
+ sh_branch_cost = 2;
+ }
+
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
if (! VALID_REGISTER_P (regno))
sh_register_names[regno][0] = '\0';
Index: gcc/config/sh/sh.h
===================================================================
--- gcc/config/sh/sh.h (revision 182695)
+++ gcc/config/sh/sh.h (working copy)
@@ -2088,12 +2088,8 @@
different code that does fewer memory accesses. */
/* A C expression for the cost of a branch instruction. A value of 1
- is the default; other values are interpreted relative to that.
- The SH1 does not have delay slots, hence we get a pipeline stall
- at every branch. The SH4 is superscalar, so the single delay slot
- is not sufficient to keep both pipelines filled. */
-#define BRANCH_COST(speed_p, predictable_p) \
- (TARGET_SH5 ? 1 : ! TARGET_SH2 || TARGET_HARD_SH4 ? 2 : 1)
+ is the default; other values are interpreted relative to that. */
+#define BRANCH_COST(speed_p, predictable_p) sh_branch_cost
/* Assembler output control. */