aboutsummaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2001-10-24 22:11:40 +0000
committerRichard Henderson <rth@gcc.gnu.org>2001-10-24 15:11:40 -0700
commit1ff37128ae7fd03586750ae1269dd3ef179f3832 (patch)
tree9e551549baa1abd0812c74a8619b5f316aec7e28 /gcc/stmt.c
parentd76b2527779c3a822586c5b1543f5d7d9d22d49c (diff)
downloadgcc-1ff37128ae7fd03586750ae1269dd3ef179f3832.zip
gcc-1ff37128ae7fd03586750ae1269dd3ef179f3832.tar.gz
gcc-1ff37128ae7fd03586750ae1269dd3ef179f3832.tar.bz2
stmt.c (expand_end_case): Index jumptables from zero for suitably small values of minval.
* stmt.c (expand_end_case): Index jumptables from zero for suitably small values of minval. From-SVN: r46478
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 4943397..76fa439 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -5534,6 +5534,17 @@ expand_end_case (orig_index)
table_label, default_label))
{
index_type = thiscase->data.case_stmt.nominal_type;
+
+ /* Index jumptables from zero for suitable values of
+ minval to avoid a subtraction. */
+ if (! optimize_size
+ && compare_tree_int (minval, 0) > 0
+ && compare_tree_int (minval, 3) < 0)
+ {
+ minval = integer_zero_node;
+ range = maxval;
+ }
+
if (! try_tablejump (index_type, index_expr, minval, range,
table_label, default_label))
abort ();
@@ -5541,7 +5552,7 @@ expand_end_case (orig_index)
/* Get table of labels to jump to, in order of case index. */
- ncases = TREE_INT_CST_LOW (range) + 1;
+ ncases = tree_low_cst (range, 0) + 1;
labelvec = (rtx *) alloca (ncases * sizeof (rtx));
memset ((char *) labelvec, 0, ncases * sizeof (rtx));