aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-04-11 07:34:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-04-11 07:34:09 +0000
commit8810712ed9d1a5c2031c640706af1a87acfd3e06 (patch)
tree90a319bf42d7d6bc1abc0e0b94bf8af1853a0f95 /gcc
parentfa78c0c18bd008b04e41e1679461a0d837e72087 (diff)
downloadgcc-8810712ed9d1a5c2031c640706af1a87acfd3e06.zip
gcc-8810712ed9d1a5c2031c640706af1a87acfd3e06.tar.gz
gcc-8810712ed9d1a5c2031c640706af1a87acfd3e06.tar.bz2
re PR tree-optimization/39713 (ICE in get_expr_value_id)
2009-04-11 Richard Guenther <rguenther@suse.de> PR tree-optimization/39713 * tree-ssa-sccvn.c (vn_get_expr_for): Make sure built reference trees have SSA_NAME operands. * g++.dg/torture/pr39713.C: New testcase. From-SVN: r145951
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr39713.C25
-rw-r--r--gcc/tree-ssa-sccvn.c7
4 files changed, 40 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59c28c9..3d6b046 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2009-04-11 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/39713
+ * tree-ssa-sccvn.c (vn_get_expr_for): Make sure built
+ reference trees have SSA_NAME operands.
+
+2009-04-11 Richard Guenther <rguenther@suse.de>
+
PR c/39712
* c-gimplify.c (c_gimplify_expr): Adjust check for mismatched
address expressions.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f74dad2..bcd3c2b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-04-11 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/39713
+ * g++.dg/torture/pr39713.C: New testcase.
+
2009-04-10 Richard Guenther <rguenther@suse.de>
PR c/39712
diff --git a/gcc/testsuite/g++.dg/torture/pr39713.C b/gcc/testsuite/g++.dg/torture/pr39713.C
new file mode 100644
index 0000000..4ff72d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr39713.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+template <typename To, typename From>
+static inline To
+bitwise_cast (From from)
+{
+ union
+ {
+ From f;
+ To t;
+ } u;
+ u.f = from;
+ return u.t;
+}
+
+extern void foo (unsigned char *);
+
+double
+bar ()
+{
+ unsigned char b[sizeof (unsigned long long)];
+ foo (b);
+ return bitwise_cast<double> (*(unsigned long long *) b);
+}
+
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 416fa7f..f3b00e9 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -257,9 +257,10 @@ vn_get_expr_for (tree name)
switch (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)))
{
case tcc_reference:
- if (gimple_assign_rhs_code (def_stmt) == VIEW_CONVERT_EXPR
- || gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
- || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR)
+ if ((gimple_assign_rhs_code (def_stmt) == VIEW_CONVERT_EXPR
+ || gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
+ || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR)
+ && TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME)
expr = fold_build1 (gimple_assign_rhs_code (def_stmt),
gimple_expr_type (def_stmt),
TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0));