From 8e85fd14bf6df849e51fdfce711a794f93cb6bbb Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 13 Jun 2006 07:22:04 +0000 Subject: [PATCH] re PR tree-optimization/27830 (ICE: verify_stmts failed (invalid operand to unary operator)) 2006-06-13 Richard Guenther PR tree-optimization/27830 * tree-inline.c (copy_body_r): For copying the operand of an ADDR_EXPR make sure to fold &* afterwards. * g++.dg/tree-ssa/pr27830.C: New testcase. From-SVN: r114600 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr27830.C | 18 ++++++++++++++++++ gcc/tree-inline.c | 7 ++++++- 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr27830.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59b9e4fc5c5..7798dd053d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-06-13 Richard Guenther + + PR tree-optimization/27830 + * tree-inline.c (copy_body_r): For copying the operand + of an ADDR_EXPR make sure to fold &* afterwards. + 2006-06-12 Eric Botcazou * gimplify.c (gimplify_expr): Treat VIEW_CONVERT_EXPR like other diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 55d6788198f..fa0ecd5fb7c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-06-13 Richard Guenther + + PR tree-optimization/27830 + * g++.dg/tree-ssa/pr27830.C: New testcase. + 2006-06-13 Matthew Sachs * lib/target-supports-dg.exp (check-flags): Include TOOL_OPTIONS in diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27830.C b/gcc/testsuite/g++.dg/tree-ssa/pr27830.C new file mode 100644 index 00000000000..01c7fc18783 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27830.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct gc{}; +struct transform:public gc +{ + double x, y, z, t; + transform (void){} +}; +inline transform f (void) +{ + return transform (); +}; +void transformed (void) +{ + new transform (f()); +} + diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 309bb406fb8..3aeb7b61341 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -659,7 +659,12 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) else if (TREE_CODE (*tp) == ADDR_EXPR) { walk_tree (&TREE_OPERAND (*tp, 0), copy_body_r, id, NULL); - recompute_tree_invariant_for_addr_expr (*tp); + /* Handle the case where we substituted an INDIRECT_REF + into the operand of the ADDR_EXPR. */ + if (TREE_CODE (TREE_OPERAND (*tp, 0)) == INDIRECT_REF) + *tp = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0); + else + recompute_tree_invariant_for_addr_expr (*tp); *walk_subtrees = 0; } }