This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Add a MIPS -mbranch-cost option


This patch adds a -mbranch-cost option, as explained in the documentation.
It's probably only going to be of interest to developers and dyed-in-the-wool
code tweakers, but it's easy enough to support.

Tested on mipsisa32r2-elfoabi and mipsisa64-elfoabi.  Applied to trunk.

Thanks to Nigel Stephens for the suggestion.

Richard


gcc/
	* config/mips/mips.c (override_options): Use mips_costs to derive
	the default branch cost.
	* config/mips/mips.h (BRANCH_COST): Use mips_branch_cost rather
	than mips_costs.
	* config/mips/mips.opt (mbranch-cost=): New option.
	* doc/invoke.texi (-mbrach-cost): Document new MIPS option.

gcc/testsuite/
	* gcc.target/mips/branch-cost-1.c: New test.
	* gcc.target/mips/branch-cost-2.c: Likewise.

Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	2007-07-23 13:11:10.000000000 +0100
+++ gcc/config/mips/mips.c	2007-07-23 13:30:55.000000000 +0100
@@ -5047,6 +5047,11 @@ override_options (void)
   else
     mips_cost = &mips_rtx_cost_data[mips_tune];
 
+  /* If the user hasn't specified a branch cost, use the processor's
+     default.  */
+  if (mips_branch_cost == 0)
+    mips_branch_cost = mips_cost->branch_cost;
+
   if ((target_flags_explicit & MASK_64BIT) != 0)
     {
       /* The user specified the size of the integer registers.  Make sure
Index: gcc/config/mips/mips.h
===================================================================
--- gcc/config/mips/mips.h	2007-07-23 13:11:10.000000000 +0100
+++ gcc/config/mips/mips.h	2007-07-23 13:30:55.000000000 +0100
@@ -2326,7 +2326,7 @@ #define AVOID_CCMODE_COPIES
 /* A C expression for the cost of a branch instruction.  A value of
    1 is the default; other values are interpreted relative to that.  */
 
-#define BRANCH_COST mips_cost->branch_cost
+#define BRANCH_COST mips_branch_cost
 #define LOGICAL_OP_NON_SHORT_CIRCUIT 0
 
 /* If defined, modifies the length assigned to instruction INSN as a
Index: gcc/config/mips/mips.opt
===================================================================
--- gcc/config/mips/mips.opt	2007-07-23 12:55:46.000000000 +0100
+++ gcc/config/mips/mips.opt	2007-07-23 13:30:55.000000000 +0100
@@ -35,6 +35,10 @@ march=
 Target RejectNegative Joined Var(mips_arch_string)
 -march=ISA	Generate code for the given ISA
 
+mbranch-cost=
+Target RejectNegative Joined UInteger Var(mips_branch_cost)
+-mbranch-cost=COST	Set the cost of branches to roughly COST instructions
+
 mbranch-likely
 Target Report Mask(BRANCHLIKELY)
 Use Branch Likely instructions, overriding the architecture default
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	2007-07-23 12:55:46.000000000 +0100
+++ gcc/doc/invoke.texi	2007-07-23 13:34:37.000000000 +0100
@@ -638,7 +638,7 @@ Objective-C and Objective-C++ Dialects}.
 -mfix-vr4120  -mno-fix-vr4120  -mfix-vr4130  -mno-fix-vr4130 @gol
 -mfix-sb1  -mno-fix-sb1 @gol
 -mflush-func=@var{func}  -mno-flush-func @gol
--mbranch-likely  -mno-branch-likely @gol
+-mbranch-cost=@var{num}  -mbranch-likely  -mno-branch-likely @gol
 -mfp-exceptions -mno-fp-exceptions @gol
 -mvr4130-align -mno-vr4130-align}
 
@@ -11915,6 +11915,13 @@ memory range, and the number 3 (to flush
 depends on the target GCC was configured for, but commonly is either
 @samp{_flush_func} or @samp{__cpu_flush}.
 
+@item mbranch-cost=@var{num}
+@opindex mbranch-cost
+Set the cost of branches to roughly @var{num} ``simple'' instructions.
+This cost is only a heuristic and is not guaranteed to produce
+consistent results across releases.  A zero cost redundantly selects
+the default, which is based on the @option{-mtune} setting.
+
 @item -mbranch-likely
 @itemx -mno-branch-likely
 @opindex mbranch-likely
Index: gcc/testsuite/gcc.target/mips/branch-cost-1.c
===================================================================
--- /dev/null	2007-07-23 10:10:45.588099250 +0100
+++ gcc/testsuite/gcc.target/mips/branch-cost-1.c	2007-07-23 13:30:55.000000000 +0100
@@ -0,0 +1,8 @@
+/* { dg-mips-options "-mbranch-cost=1 -mips64 -O2" } */
+int
+foo (int x, int y, int z, int k)
+{
+  return x == k ? x + y : z - x;
+}
+/* { dg-final { scan-assembler-not "\t(movz|movn)\t" } } */
+/* { dg-final { scan-assembler "\t(bne|beq)\t" } } */
Index: gcc/testsuite/gcc.target/mips/branch-cost-2.c
===================================================================
--- /dev/null	2007-07-23 10:10:45.588099250 +0100
+++ gcc/testsuite/gcc.target/mips/branch-cost-2.c	2007-07-20 17:43:09.000000000 +0100
@@ -0,0 +1,8 @@
+/* { dg-mips-options "-mbranch-cost=10 -mips64 -O2" } */
+int
+foo (int x, int y, int z, int k)
+{
+  return x == k ? x + y : z - x;
+}
+/* { dg-final { scan-assembler "\t(movz|movn)\t" } } */
+/* { dg-final { scan-assembler-not "\t(bne|beq)\t" } } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]