re PR c/10178 (ICE in tree_low_cst)
authorRoger Sayle <roger@eyesopen.com>
Sun, 23 Mar 2003 21:25:13 +0000 (21:25 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 23 Mar 2003 21:25:13 +0000 (21:25 +0000)
PR c/10178
* stmt.c (expand_end_case_type): Check for overflow in range when
determining whether to use a bit-test implementation.

* gcc.c-torture/compile/20030323-1.c: New test case.

From-SVN: r64757

gcc/ChangeLog
gcc/stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20030323-1.c [new file with mode: 0644]

index f98fa02..9dc6621 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-23  Roger Sayle  <roger@eyesopen.com>
+
+       PR c/10178
+       * stmt.c (expand_end_case_type): Check for overflow in range when
+       determining whether to use a bit-test implementation.
+
 2003-03-23  Richard Henderson  <rth@redhat.com>
 
        * cfgcleanup.c (try_optimize_cfg): Allow merging of tablejumps
index 823afbf..d8f36c5 100644 (file)
@@ -5505,6 +5505,7 @@ expand_end_case_type (orig_index, orig_type)
       else if (CASE_USE_BIT_TESTS
               && ! TREE_CONSTANT (index_expr)
               && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
+              && compare_tree_int (range, 0) > 0
               && lshift_cheap_p ()
               && ((uniq == 1 && count >= 3)
                   || (uniq == 2 && count >= 5)
index 34b0946..05b170c 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-23  Roger Sayle  <roger@eyesopen.com>
+
+       * gcc.c-torture/compile/20030323-1.c: New test case.
+
 2003-03-22  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gcc.dg/20030321-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20030323-1.c b/gcc/testsuite/gcc.c-torture/compile/20030323-1.c
new file mode 100644 (file)
index 0000000..8ea602d
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR c/10178.  The following code would ICE because we didn't check for
+   overflow when computing the range of the switch-statment, and therefore
+   decided it could be implemented using bit-tests.  */
+
+int
+banana(long citron)
+{
+  switch (citron) {
+    case 0x80000000:
+    case 0x40000:
+    case 0x40001:
+      return 1;
+      break;
+  }
+  return 0;
+}
+