aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-04-23 08:08:25 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-04-23 08:08:25 +0000
commit999c11718ded2d02734a6ecdf7572f7467cf5dc6 (patch)
tree4e051be64f45b53b36d4a4759715e8b57f71b730
parent5366925908d82b07aaf6948cdf4c20eb41207896 (diff)
downloadgcc-999c11718ded2d02734a6ecdf7572f7467cf5dc6.zip
gcc-999c11718ded2d02734a6ecdf7572f7467cf5dc6.tar.gz
gcc-999c11718ded2d02734a6ecdf7572f7467cf5dc6.tar.bz2
re PR middle-end/57026 (ice: SSA corruption)
2013-04-23 Richard Biener <rguenther@suse.de> PR tree-optimization/57026 * tree-vrp.c (simplify_conversion_using_ranges): Do not propagate from SSA names occuring in abnormal PHI nodes. * gcc.dg/torture/pr57026.c: New testcase. From-SVN: r198175
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr57026.c22
-rw-r--r--gcc/tree-vrp.c3
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6349376..fea5059 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/57026
+ * tree-vrp.c (simplify_conversion_using_ranges): Do not propagate
+ from SSA names occuring in abnormal PHI nodes.
+
2013-04-22 Andi Kleen <ak@linux.intel.com>
* lto/lto.c (print_lto_report_1): Fix LTO report names.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d6be55c..538ed99 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/57026
+ * gcc.dg/torture/pr57026.c: New testcase.
+
2013-04-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/53685
diff --git a/gcc/testsuite/gcc.dg/torture/pr57026.c b/gcc/testsuite/gcc.dg/torture/pr57026.c
new file mode 100644
index 0000000..e378954
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr57026.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+typedef struct __jmp_buf_tag { char buf[1024]; } jmp_buf[1];
+extern int setjmp (jmp_buf);
+extern int bar (unsigned int *);
+extern jmp_buf *baz (void);
+struct C { int c1; unsigned int c2, c3, c4; };
+
+void
+foo (struct C *x, const int *y, unsigned int *z, unsigned int e, unsigned int g)
+{
+ unsigned int d = 0;
+ unsigned long f;
+ setjmp (*baz ());
+ f = d;
+ if ((x->c1 || x->c2) && g && (!e || d >= 8))
+ d = 16;
+ else
+ d = 8;
+ if ((!x->c3 && !x->c4 || *y == 0) && !e && bar (z))
+ *z = f;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 5b4321a..cb4a09a 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -8752,7 +8752,8 @@ simplify_conversion_using_ranges (gimple stmt)
|| !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
return false;
innerop = gimple_assign_rhs1 (def_stmt);
- if (TREE_CODE (innerop) != SSA_NAME)
+ if (TREE_CODE (innerop) != SSA_NAME
+ || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop))
return false;
/* Get the value-range of the inner operand. */