Commit 3aa439ed by Michael Meissner Committed by Michael Meissner

Add --param case-values-threshold

From-SVN: r175878
parent fb237f9c
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> 2011-07-05 Richard Henderson <rth@redhat.com>
* dwarf2out.c (dwarf2out_cfi_label): Make static. * dwarf2out.c (dwarf2out_cfi_label): Make static.
......
...@@ -2946,7 +2946,7 @@ stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ ...@@ -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) \ $(LIBFUNCS_H) $(EXCEPT_H) $(RECOG_H) $(DIAGNOSTIC_CORE_H) \
output.h $(GGC_H) $(TM_P_H) langhooks.h $(PREDICT_H) $(OPTABS_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 \ $(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) \ 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) \ $(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 \ langhooks.h insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h \
......
...@@ -9026,6 +9026,11 @@ The maximum number of conditional stores paires that can be sunk. Set to 0 ...@@ -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 if either vectorization (@option{-ftree-vectorize}) or if-conversion
(@option{-ftree-loop-if-convert}) is disabled. The default is 2. (@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
@end table @end table
......
...@@ -892,6 +892,16 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK, ...@@ -892,6 +892,16 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK,
"Maximum number of conditional store pairs that can be sunk", "Maximum number of conditional store pairs that can be sunk",
2, 0, 0) 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: Local variables:
......
...@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "alloc-pool.h" #include "alloc-pool.h"
#include "pretty-print.h" #include "pretty-print.h"
#include "bitmap.h" #include "bitmap.h"
#include "params.h"
/* Functions and data structures for expanding case statements. */ /* Functions and data structures for expanding case statements. */
...@@ -2270,6 +2271,20 @@ expand_switch_using_bit_tests_p (tree index_expr, tree range, ...@@ -2270,6 +2271,20 @@ expand_switch_using_bit_tests_p (tree index_expr, tree range,
|| (uniq == 3 && count >= 6))); || (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 /* Terminate a case (Pascal/Ada) or switch (C) statement
in which ORIG_INDEX is the expression to be tested. in which ORIG_INDEX is the expression to be tested.
If ORIG_TYPE is not NULL, it is the original ORIG_INDEX If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
...@@ -2424,7 +2439,7 @@ expand_case (gimple stmt) ...@@ -2424,7 +2439,7 @@ expand_case (gimple stmt)
If the switch-index is a constant, do it this way If the switch-index is a constant, do it this way
because we can optimize it. */ because we can optimize it. */
else if (count < targetm.case_values_threshold () else if (count < case_values_threshold ()
|| compare_tree_int (range, || compare_tree_int (range,
(optimize_insn_for_size_p () ? 3 : 10) * count) > 0 (optimize_insn_for_size_p () ? 3 : 10) * count) > 0
/* RANGE may be signed, and really large ranges will show up /* RANGE may be signed, and really large ranges will show up
......
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> 2011-07-05 Janis Johnson <janisjo@codesourcery.com>
* gcc.target/arm/pr42093.c: Use "-fno-reorder-blocks". * gcc.target/arm/pr42093.c: Use "-fno-reorder-blocks".
......
/* { 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;
}
/* { 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;
}
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