From 766dec0ecdb5e4d705c8be49a7b0e826c4356cbf Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sun, 23 Mar 2003 21:25:13 +0000 Subject: [PATCH] re PR c/10178 (ICE in tree_low_cst) 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 | 6 ++++++ gcc/stmt.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ .../gcc.c-torture/compile/20030323-1.c | 17 +++++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20030323-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f98fa02a8824..9dc6621300b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-03-23 Roger Sayle + + 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 * cfgcleanup.c (try_optimize_cfg): Allow merging of tablejumps diff --git a/gcc/stmt.c b/gcc/stmt.c index 823afbff7fa2..d8f36c5d7dbe 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 34b0946ff287..05b170ca1850 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-03-23 Roger Sayle + + * gcc.c-torture/compile/20030323-1.c: New test case. + 2003-03-22 Ulrich Weigand * 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 index 000000000000..8ea602deee35 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030323-1.c @@ -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; +} + -- 2.47.2