aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@gmail.com>2008-12-30 08:27:29 -0800
committerAndrew Pinski <pinskia@gcc.gnu.org>2008-12-30 08:27:29 -0800
commit7f2a9982659c7963ff213722e1feabbd7563118e (patch)
treee674523d6521e2e5ad5b3539aabdd14810d1673a /gcc
parent000020907344fccdd11036944874d80d137557df (diff)
downloadgcc-7f2a9982659c7963ff213722e1feabbd7563118e.zip
gcc-7f2a9982659c7963ff213722e1feabbd7563118e.tar.gz
gcc-7f2a9982659c7963ff213722e1feabbd7563118e.tar.bz2
re PR tree-optimization/38661 (ICE: vector VEC(constructor_elt,base) push domain error, in build_constructors at tree-switch-conversion.c:450)
2008-12-30 Andrew Pinski <pinskia@gmail.com> PR middle-end/38661 * tree-switch-conversion.c (build_constructors): Test for wrapping of pos case. 2008-12-30 Andrew Pinski <pinskia@gmail.com> PR middle-end/38661 * gcc.c-torture/compile/pr38661.c: New testcase. * gcc.c-torture/compile/pr38661-1.c: New testcase. From-SVN: r142964
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr38661-1.c9
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr38661.c9
-rw-r--r--gcc/tree-switch-conversion.c5
5 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 87d22b4..89d19b0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-30 Andrew Pinski <pinskia@gmail.com>
+
+ PR middle-end/38661
+ * tree-switch-conversion.c (build_constructors): Test for wrapping of
+ pos case.
+
2008-12-30 Steven Bosscher <steven@gcc.gnu.org>
PR middle-end/38584
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7c6dc8d..81e86b3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-30 Andrew Pinski <pinskia@gmail.com>
+
+ PR middle-end/38661
+ * gcc.c-torture/compile/pr38661.c: New testcase.
+ * gcc.c-torture/compile/pr38661-1.c: New testcase.
+
2008-12-30 Richard Guenther <rguenther@suse.de>
PR middle-end/38564
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38661-1.c b/gcc/testsuite/gcc.c-torture/compile/pr38661-1.c
new file mode 100644
index 0000000..065f120
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr38661-1.c
@@ -0,0 +1,9 @@
+/* We used to ICE because we would wrap INT_MAX
+ into INT_MIN while doing the switch converison. */
+
+const char *func(int val) {
+ switch (val) {
+ case - __INT_MAX__ -1 : return "foo";
+ default: return "";
+ }
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38661.c b/gcc/testsuite/gcc.c-torture/compile/pr38661.c
new file mode 100644
index 0000000..5d243c6
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr38661.c
@@ -0,0 +1,9 @@
+/* We used to ICE because we would wrap INT_MAX
+ into INT_MIN while doing the switch converison. */
+
+const char *func(int val) {
+ switch (val) {
+ case __INT_MAX__: return "foo";
+ default: return "";
+ }
+}
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index 798cf16..dba0c6f 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -440,9 +440,10 @@ build_constructors (gimple swtch)
{
gimple phi = gsi_stmt (gsi);
tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
+ tree low = CASE_LOW (cs);
pos = CASE_LOW (cs);
- while (!tree_int_cst_lt (high, pos))
+ do
{
constructor_elt *elt;
@@ -452,7 +453,7 @@ build_constructors (gimple swtch)
elt->value = val;
pos = int_const_binop (PLUS_EXPR, pos, integer_one_node, 0);
- }
+ } while (!tree_int_cst_lt (high, pos) && tree_int_cst_lt (low, pos));
j++;
}
}