On Mon, 14 Apr 2014, Jan Hubicka wrote:

> Hi,
> this patch fixes ICE in ctor_for_folding where varpool_remove_node 
> incorrectly clobbers
> DECL_INITIAL of a variable while removing cgraph during the early LTO merging.
> This case is special by alowing multiple symtab nodes for a given declaration
> and we have similar special case in the other removal hooks.
> 
> I did not manage to get reliable testcase for a testsuite, but it is ICE on 
> valid, too.
> 
> Bootstrapped/regtested x86_64-linux, comitted to mainline.
> Jakub/Richi, OK for trunk?

Ok for 4.9.1.  Please work harder for the testcase - there is one in the
PR after all that just needs proper reduction.  Maybe you can ask Markus
to reduce it.

Thanks,
Richard.

>       PR lto/60820
>       * varpool.c (varpool_remove_node): Do not alter decls when streaming.
> Index: varpool.c
> ===================================================================
> --- varpool.c (revision 209386)
> +++ varpool.c (working copy)
> @@ -166,7 +166,9 @@ varpool_remove_node (varpool_node *node)
>    /* Because we remove references from external functions before final 
> compilation,
>       we may end up removing useful constructors.
>       FIXME: We probably want to trace boundaries better.  */
> -  if ((init = ctor_for_folding (node->decl)) == error_mark_node)
> +  if (cgraph_state == CGRAPH_LTO_STREAMING)
> +    ;
> +  else if ((init = ctor_for_folding (node->decl)) == error_mark_node)
>      varpool_remove_initializer (node);
>    else
>      DECL_INITIAL (node->decl) = init;
> 

Reply via email to