aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-09-21 12:44:07 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-09-21 12:44:07 +0000
commit61514fe46313e7ecfdec799f9033c788e1e0f710 (patch)
tree341cbdd7ee2fc938b2fa3bacdf901ca539657dd6 /gcc
parent0c105b723d92cb3508856069802c8a0f503cd011 (diff)
downloadgcc-61514fe46313e7ecfdec799f9033c788e1e0f710.zip
gcc-61514fe46313e7ecfdec799f9033c788e1e0f710.tar.gz
gcc-61514fe46313e7ecfdec799f9033c788e1e0f710.tar.bz2
re PR tree-optimization/54647 (Segmentation fault in get_expr_value_id with -O2)
2012-09-21 Richard Guenther <rguenther@suse.de> PR tree-optimization/54647 * tree-ssa-pre.c (compute_avail): Do not put COND_EXPR or VEC_COND_EXPR into EXP_GEN again. * g++.dg/torture/pr54647.C: New testcase. From-SVN: r191613
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr54647.C25
-rw-r--r--gcc/tree-ssa-pre.c11
4 files changed, 46 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8fd0221..648eb10 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-21 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54647
+ * tree-ssa-pre.c (compute_avail): Do not put COND_EXPR
+ or VEC_COND_EXPR into EXP_GEN again.
+
2012-09-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/54629
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9616b89..3723d6b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-21 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54647
+ * g++.dg/torture/pr54647.C: New testcase.
+
2012-09-21 Marc Glisse <marc.glisse@inria.fr>
PR c++/54427
diff --git a/gcc/testsuite/g++.dg/torture/pr54647.C b/gcc/testsuite/g++.dg/torture/pr54647.C
new file mode 100644
index 0000000..2177ecd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr54647.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+class A
+{
+};
+template <class type> struct D:A
+{
+ type & operator[](int);
+};
+struct B
+{
+ typedef D <int *>Row;
+ struct C
+ {
+ Row *row;
+ };
+};
+B::C a;
+B::Row & b = *a.row;
+void
+fn1 ()
+{
+ while (1)
+ b[0] = b[0] ? (int *) -1 : 0;
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index ab9f2f4..d1d97b6 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -3981,9 +3981,18 @@ compute_avail (void)
{
case VN_NARY:
{
+ enum tree_code code = gimple_assign_rhs_code (stmt);
vn_nary_op_t nary;
+
+ /* COND_EXPR and VEC_COND_EXPR are awkward in
+ that they contain an embedded complex expression.
+ Don't even try to shove those through PRE. */
+ if (code == COND_EXPR
+ || code == VEC_COND_EXPR)
+ continue;
+
vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1,
- gimple_assign_rhs_code (stmt),
+ code,
gimple_expr_type (stmt),
gimple_assign_rhs1_ptr (stmt),
&nary);