From 5e13fdf7526539b77f38ed6aa14f993d542c4b9d Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sun, 30 Oct 2005 19:14:15 +0100 Subject: [PATCH] re PR tree-optimization/24172 (error: incorrect sharing of tree nodes) PR tree-optimization/24172 * tree-inline.c (copy_body_r): Unshare the substituted value first. * g++.dg/tree-ssa/pr24172.C: New testcase. From-SVN: r106247 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/tree-ssa/pr24172.C | 11 +++++++++++ gcc/tree-inline.c | 10 ++++++---- 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr24172.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4eb8a40..56ab427 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-10-30 Jan Hubicka + + PR tree-optimization/24172 + * tree-inline.c (copy_body_r): Unshare the substituted value first. + 2005-10-30 Hans-Peter Nilsson * config/mmix/mmix.c (mmix_intval): Correct handling of DFmode diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 09b9ada..26acd54 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-10-30 Jan Hubicka + + * g++.dg/tree-ssa/pr24172.C: New testcase. + 2005-10-30 Tobias Schl"uter * gfortran.dg/enum_10.f90, gfortran.dg/enum_10.c: New test. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24172.C b/gcc/testsuite/g++.dg/tree-ssa/pr24172.C new file mode 100644 index 0000000..245186a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24172.C @@ -0,0 +1,11 @@ +// { dg-options "-O2" } +void IOException( char); +inline int* dummy( const char* const mode ) +{ + IOException(*mode+*mode); +} + +void prepare_inpaint( ) +{ + dummy ("rb"); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 0f7ea97..228252f 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; -- 2.7.4