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; >