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
This commit is contained in:
Olivier Hainque 2001-12-12 13:44:46 +01:00 committed by Richard Kenner
parent cdb290580c
commit 2d9d49e447
2 changed files with 18 additions and 11 deletions

View File

@ -1,3 +1,8 @@
Wed Dec 12 07:37:52 2001 Olivier Hainque <hainque@act-europe.fr>
* stmt.c (expand_end_case): Do subtraction of lower bound as trees
to avoid overflow.
Wed Dec 12 07:35:24 2001 Douglas B. Rupp <rupp@gnat.com>
* cppfiles.c (read_include_file): Set buffer size properly when

View File

@ -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);
/* 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;
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++;
}
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. */