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));