Add --param case-values-threshold
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Tue, 5 Jul 2011 17:45:38 +0000 (17:45 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 5 Jul 2011 17:45:38 +0000 (17:45 +0000)
From-SVN: r175878

gcc/ChangeLog
gcc/Makefile.in
gcc/doc/invoke.texi
gcc/params.def
gcc/stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/ppc-switch-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c [new file with mode: 0644]

index 70de80a5f5a7c96e76ab806c29e9bfed96a60ddc..184ea83bf118273d77cd8c3b2e977463aa90ecb2 100644 (file)
@@ -1,3 +1,17 @@
+2011-07-05  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * params.def (PARAM_CASE_VALUES_THRESHOLD): New parameter to
+       override CASE_VALUES_THRESHOLD.
+
+       * stmt.c (toplevel): Include params.h.
+       (case_values_threshold): Use the --param case-values-threshold
+       value if non-zero, otherwise use machine dependent value.
+       (expand_case): Use case_values_threshold.
+
+       * Makefile.in (stmt.o): Add $(PARAMS_H) dependency.
+
+       * doc/invoke.texi (--param case-values-threshold): Document.
+
 2011-07-05  Richard Henderson  <rth@redhat.com>
 
        * dwarf2out.c (dwarf2out_cfi_label): Make static.
index 091729d6e6151962f8b779fe8afeef5eb116d35b..82119117e6783bc8983cd4d320e45fad78c6757b 100644 (file)
@@ -2946,7 +2946,7 @@ stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(LIBFUNCS_H) $(EXCEPT_H) $(RECOG_H) $(DIAGNOSTIC_CORE_H) \
    output.h $(GGC_H) $(TM_P_H) langhooks.h $(PREDICT_H) $(OPTABS_H) \
    $(TARGET_H) $(GIMPLE_H) $(MACHMODE_H) $(REGS_H) alloc-pool.h \
-   $(PRETTY_PRINT_H) $(BITMAP_H)
+   $(PRETTY_PRINT_H) $(BITMAP_H) $(PARAMS_H)
 except.o : except.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(TREE_H) $(FLAGS_H) $(EXCEPT_H) $(FUNCTION_H) $(EXPR_H) $(LIBFUNCS_H) \
    langhooks.h insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h \
index 1fc40389f0a16abf1319220cf2cf283b87bca04c..c5e369ac6f89de61a0d37fc81390b846587fc765 100644 (file)
@@ -9026,6 +9026,11 @@ The maximum number of conditional stores paires that can be sunk.  Set to 0
 if either vectorization (@option{-ftree-vectorize}) or if-conversion
 (@option{-ftree-loop-if-convert}) is disabled.  The default is 2.
 
+@item case-values-threshold
+The smallest number of different values for which it is best to use a
+jump-table instead of a tree of conditional branches.  If the value is
+0, use the default for the machine.  The default is 0.
+
 @end table
 @end table
 
index d827121f86c8200a4d25eb66a165033660f99e2c..78601f6de88da0182930d34d320fd008c8e95e83 100644 (file)
@@ -892,6 +892,16 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK,
           "Maximum number of conditional store pairs that can be sunk",
           2, 0, 0)
 
+/* Override CASE_VALUES_THRESHOLD of when to switch from doing switch
+   statements via if statements to using a table jump operation.  If the value
+   is 0, the default CASE_VALUES_THRESHOLD will be used.  */
+DEFPARAM (PARAM_CASE_VALUES_THRESHOLD,
+          "case-values-threshold",
+          "The smallest number of different values for which it is best to "
+         "use a jump-table instead of a tree of conditional branches, "
+         "if 0, use the default for the machine",
+          0, 0, 0)
+
 
 /*
 Local variables:
index 1a9f9e505dab04e091d4de183590d788fb478418..38e1e285234a5d54f243fe423fdb3cac649ad364 100644 (file)
@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "alloc-pool.h"
 #include "pretty-print.h"
 #include "bitmap.h"
+#include "params.h"
 
 \f
 /* Functions and data structures for expanding case statements.  */
@@ -2270,6 +2271,20 @@ expand_switch_using_bit_tests_p (tree index_expr, tree range,
              || (uniq == 3 && count >= 6)));
 }
 
+/* Return the smallest number of different values for which it is best to use a
+   jump-table instead of a tree of conditional branches.  */
+
+static unsigned int
+case_values_threshold (void)
+{
+  unsigned int threshold = PARAM_VALUE (PARAM_CASE_VALUES_THRESHOLD);
+
+  if (threshold == 0)
+    threshold = targetm.case_values_threshold ();
+
+  return threshold;
+}
+
 /* Terminate a case (Pascal/Ada) or switch (C) statement
    in which ORIG_INDEX is the expression to be tested.
    If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
@@ -2424,7 +2439,7 @@ expand_case (gimple stmt)
         If the switch-index is a constant, do it this way
         because we can optimize it.  */
 
-      else if (count < targetm.case_values_threshold ()
+      else if (count < case_values_threshold ()
               || compare_tree_int (range,
                                    (optimize_insn_for_size_p () ? 3 : 10) * count) > 0
               /* RANGE may be signed, and really large ranges will show up
index 31297628029605dc4ee371e03182aac9ce89cfdf..7ce7bf88c7c93fdd6005d95654ff788aff93727d 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-05  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * gcc.target/powerpc/ppc-switch-1.c: New test for
+       --param case-values-threshold.
+       * gcc.target/powerpc/ppc-switch-2.c: Ditto.
+
 2011-07-05  Janis Johnson  <janisjo@codesourcery.com>
 
        * gcc.target/arm/pr42093.c: Use "-fno-reorder-blocks".
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc-switch-1.c b/gcc/testsuite/gcc.target/powerpc/ppc-switch-1.c
new file mode 100644 (file)
index 0000000..ac1dac9
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-options "-O2 --param case-values-threshold=2" } */
+/* { dg-final { scan-assembler "mtctr" } } */
+/* { dg-final { scan-assembler "bctr" } } */
+
+/* Force using a dispatch table even though by default we would generate
+   ifs.  */
+
+extern long call (long);
+
+long
+test_switch (long a, long b)
+{
+  long c;
+
+  switch (a)
+    {
+    case 0:  c = -b;   break;
+    case 1:  c = ~b;   break;
+    case 2:  c = b+1;  break;
+    default: c = b & 9;        break;
+    }
+
+  return call (c) + 1;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c b/gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c
new file mode 100644 (file)
index 0000000..4f2efcc
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-options "-O2 --param case-values-threshold=20" } */
+/* { dg-final { scan-assembler-not "mtctr" } } */
+/* { dg-final { scan-assembler-not "bctr" } } */
+
+/* Force using if tests, instead of a dispatch table.  */
+
+extern long call (long);
+
+long
+test_switch (long a, long b)
+{
+  long c;
+
+  switch (a)
+    {
+    case 0:  c = -b;   break;
+    case 1:  c = ~b;   break;
+    case 2:  c = b+1;  break;
+    case 3:  c = b-2;  break;
+    case 4:  c = b*3;  break;
+    case 5:  c = b/4;  break;
+    case 6:  c = b<<5; break;
+    case 7:  c = b>>6; break;
+    case 8:  c = b|7;  break;
+    case 9:  c = b^8;  break;
+    default: c = b&9;  break;
+    }
+
+  return call (c) + 1;
+}