------- Comment #8 from hubicka at ucw dot cz  2005-10-04 12:56 -------
Subject: Re:  [4.1 Regression] error: incorrect sharing of tree nodes

> 
> 
> ------- Comment #5 from rguenth at gcc dot gnu dot org  2005-10-04 10:44 
> -------
> The problem is, that with this part of the blamed patch
> 
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v
> retrieving revision 1.182
> retrieving revision 1.183
> diff -u -r1.182 -r1.183
> --- gcc/gcc/tree-inline.c       2005/04/23 21:27:58     1.182
> +++ gcc/gcc/tree-inline.c       2005/05/13 13:56:54     1.183
> @@ -566,21 +566,15 @@
>         {
>           /* Get rid of *& from inline substitutions that can happen when a
>              pointer argument is an ADDR_EXPR.  */
> -         tree decl = TREE_OPERAND (*tp, 0), value;
> +         tree decl = TREE_OPERAND (*tp, 0);
>           splay_tree_node n;
> 
>           n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
>           if (n)
>             {
> -             value = (tree) n->value;
> -             STRIP_NOPS (value);
> -             if (TREE_CODE (value) == ADDR_EXPR
> -                 && (lang_hooks.types_compatible_p
> -                     (TREE_TYPE (*tp), TREE_TYPE (TREE_OPERAND (value, 0)))))
> -               {
> -                 *tp = TREE_OPERAND (value, 0);
> -                 return copy_body_r (tp, walk_subtrees, data);
> -               }
> +             *tp = build_fold_indirect_ref ((tree)n->value);
> +             *walk_subtrees = 0;
> +             return NULL;
>             }
>         }
> 
> we do not have *tp unshared anymore.  Is build_fold_indirect_ref supposed
> to do that?

It is not, but the entries of decl_map are expected to be shareable.
There are couple of other places where n->value is substituted in
without further copying.  I see there can be NOP_EXPRs and ADDR_EXPRs
that are supposed to be unshared.

We don't want to recurse on substituted value as we would mess up
recursive functions and friends, but probably somehing like unshare_expr
call on all places we dosubstitution would work?
I can look into that tomorrow unless someone beats me ;)

Honza


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24172

Reply via email to