From 8810712ed9d1a5c2031c640706af1a87acfd3e06 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Sat, 11 Apr 2009 07:34:09 +0000
Subject: [PATCH] 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
---
 gcc/ChangeLog                          |  6 ++++++
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/g++.dg/torture/pr39713.C | 25 +++++++++++++++++++++++++
 gcc/tree-ssa-sccvn.c                   |  7 ++++---
 4 files changed, 40 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr39713.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59c28c90dad5..3d6b046edc5d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f74dad28e4b1..bcd3c2bfa5f9 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 000000000000..4ff72d1a773a
--- /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 416fa7f69a63..f3b00e99b488 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));