From 2d9d49e4477346398ed3cc8827680069837afb0e Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Wed, 12 Dec 2001 13:44:46 +0100 Subject: stmt.c (expand_end_case): Do subtraction of lower bound as trees to avoid overflow. * stmt.c (expand_end_case): Do subtraction of lower bound as trees to avoid overflow. From-SVN: r47932 --- gcc/stmt.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'gcc/stmt.c') diff --git a/gcc/stmt.c b/gcc/stmt.c index 3c4ccd1..7978554 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -5525,18 +5525,20 @@ expand_end_case (orig_index) for (n = thiscase->data.case_stmt.case_list; n; n = n->right) { - HOST_WIDE_INT i - = tree_low_cst (n->low, 0) - tree_low_cst (minval, 0); - - while (1) - { - labelvec[i] - = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); - if (i + tree_low_cst (minval, 0) - == tree_low_cst (n->high, 0)) - break; - i++; - } + /* Compute the low and high bounds relative to the minimum + value since that should fit in a HOST_WIDE_INT while the + actual values may not. */ + HOST_WIDE_INT i_low + = tree_low_cst (fold (build (MINUS_EXPR, index_type, + n->low, minval)), 1); + HOST_WIDE_INT i_high + = tree_low_cst (fold (build (MINUS_EXPR, index_type, + n->high, minval)), 1); + HOST_WIDE_INT i; + + for (i = i_low; i <= i_high; i ++) + labelvec[i] + = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); } /* Fill in the gaps with the default. */ -- cgit v1.1