This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix xalancbmk LTO/WHOR ICE
- From: Richard Guenther <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 30 Apr 2010 20:32:52 +0200 (CEST)
- Subject: Re: Fix xalancbmk LTO/WHOR ICE
- References: <20100430182837.GJ21761@kam.mff.cuni.cz>
On Fri, 30 Apr 2010, Jan Hubicka wrote:
> Hi,
> with the varpool dumping I broke xalancbmk on LTO (it never worked with WHOPR).
> The problem is that decl merging attempts to replace variable with a varpool node
> with variable without.
>
> I must admit this is not area I would feed confident in.
> The patch makes lto_symtab_resolve_can_prevail_p to choose only variables with defnition
> of body in it and I removed dubious looking logic in lto_symtab_merge_decls_1.
>
> vnode->inalized imply that the decl is not just forward declaration. But I guess
> we can have one with has initializer merged with one without?
> So perhaps the second hunk still makes sense? (we just need to remove the comment
> about not streming varpool node)
The patch makes sense and is ok if it bootstraps & tests ok.
Thanks,
Richard.
> * lto-symtab.c (lto_symtab_resolve_can_prevail_p): Preffer variables with nodes.
> (lto_symtab_merge_decls_1): Remove logic chosing preferred variable.
>
> Index: lto-symtab.c
> ===================================================================
> --- lto-symtab.c (revision 158936)
> +++ lto-symtab.c (working copy)
> @@ -406,11 +406,7 @@ lto_symtab_resolve_can_prevail_p (lto_sy
>
> /* A variable should have a size. */
> else if (TREE_CODE (e->decl) == VAR_DECL)
> - return (DECL_SIZE (e->decl) != NULL_TREE
> - /* The C++ frontend retains TREE_STATIC on the declaration
> - of foo_ in struct Foo { static Foo *foo_; }; but it is
> - not a definition. g++.dg/lto/20090315_0.C. */
> - && !DECL_EXTERNAL (e->decl));
> + return (e->vnode && e->vnode->finalized);
>
> gcc_unreachable ();
> }
> @@ -588,17 +584,6 @@ lto_symtab_merge_decls_1 (void **slot, v
> while (!prevailing->vnode
> && prevailing->next)
> prevailing = prevailing->next;
> - /* We do not stream varpool nodes, so the first decl has to
> - be good enough for now.
> - ??? For QOI choose a variable with readonly initializer
> - if there is one. This matches C++
> - struct Foo { static const int i = 1; }; without a real
> - definition. */
> - if (TREE_CODE (prevailing->decl) == VAR_DECL)
> - while (!(TREE_READONLY (prevailing->decl)
> - && DECL_INITIAL (prevailing->decl))
> - && prevailing->next)
> - prevailing = prevailing->next;
> }
>
> /* Move it first in the list. */
>
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex