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