OSDN Git Service

* stmt.c (expand_end_case): Do subtraction of lower bound as trees
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Dec 2001 12:44:46 +0000 (12:44 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Dec 2001 12:44:46 +0000 (12:44 +0000)
to avoid overflow.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47932 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stmt.c

index c34e921..319e07e 100644 (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
index 3c4ccd1..7978554 100644 (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);
-
-             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.  */