https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65588
--- Comment #6 from Jan Hubicka <hubicka at ucw dot cz> --- Hi, this patch fixes the partitioner and also avoids assemble_undefined_decl to be called on hard registers and value exprs. I am not sure how the reduced testcase could work, since I think the bug needs partitioning to reproduce. So I would welcome if someone can reproduce the reduced one could test that it is indeed fixed. Index: varpool.c =================================================================== --- varpool.c (revision 221725) +++ varpool.c (working copy) @@ -737,7 +737,9 @@ symbol_table::output_variables (void) timevar_push (TV_VAROUT); FOR_EACH_VARIABLE (node) - if (!node->definition) + if (!node->definition + && !DECL_HAS_VALUE_EXPR_P (node->decl) + && !DECL_HARD_REGISTER (node->decl)) assemble_undefined_decl (node->decl); FOR_EACH_DEFINED_VARIABLE (node) { Index: symtab.c =================================================================== --- symtab.c (revision 221725) +++ symtab.c (working copy) @@ -1684,6 +1689,8 @@ symtab_node::get_partitioning_class (voi objects that can not be duplicated across partitions. */ if (DECL_IN_CONSTANT_POOL (decl)) return SYMBOL_DUPLICATE; + if (DECL_HARD_REGISTER (decl)) + return SYMBOL_DUPLICATE; gcc_checking_assert (vnode->definition); } /* Functions that are cloned may stay in callgraph even if they are unused.