stmt.c (expand_end_case): Do subtraction of lower bound as trees to avoid overflow.
authorOlivier Hainque <hainque@act-europe.fr>
Wed, 12 Dec 2001 12:44:46 +0000 (13:44 +0100)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 12 Dec 2001 12:44:46 +0000 (07:44 -0500)
* stmt.c (expand_end_case): Do subtraction of lower bound as trees
to avoid overflow.

From-SVN: r47932

gcc/ChangeLog
gcc/stmt.c

index c34e921cb87b4457146bfd53880f6903c4b229ad..319e07efb8c7465dd369b279c0c2adf973c803c5 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 3c4ccd1157364617f77c85b49e6f6ba295647f68..797855401310d89ef4baa18b619aa30b2c42f382 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.  */