diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-30 18:14:15 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-30 18:14:15 +0000 |
commit | 9e6e69fead5213ddfee190c0402ff832d6c06537 (patch) | |
tree | 547504d63ebc99e12b881ae303cb2482daa00135 /gcc/tree-inline.c | |
parent | 3b6a4b4184528ed5c6c5f8e51c1c57cd92ed2cf5 (diff) | |
download | gcc-9e6e69fead5213ddfee190c0402ff832d6c06537.tar.gz |
PR tree-optimization/24172
* tree-inline.c (copy_body_r): Unshare the substituted value first.
* g++.dg/tree-ssa/pr24172.C: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106247 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 0f7ea978b72..228252fd709 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -639,6 +639,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl); if (n) { + tree new; /* If we happen to get an ADDR_EXPR in n->value, strip it manually here as we'll eventually get ADDR_EXPRs which lie about their types pointed to. In this case @@ -646,13 +647,14 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) but we absolutely rely on that. As fold_indirect_ref does other useful transformations, try that first, though. */ tree type = TREE_TYPE (TREE_TYPE ((tree)n->value)); - *tp = fold_indirect_ref_1 (type, (tree)n->value); + new = unshare_expr ((tree)n->value); + *tp = fold_indirect_ref_1 (type, new); if (! *tp) { - if (TREE_CODE ((tree)n->value) == ADDR_EXPR) - *tp = TREE_OPERAND ((tree)n->value, 0); + if (TREE_CODE (new) == ADDR_EXPR) + *tp = TREE_OPERAND (new, 0); else - *tp = build1 (INDIRECT_REF, type, (tree)n->value); + *tp = build1 (INDIRECT_REF, type, new); } *walk_subtrees = 0; return NULL; |