Hi, this patch fixes ICE with register variable when WHOPR decides to partition it. I did not include testcase because it depends on partitining and thus it is huge. It may be possible to produce smaller one with -flto-partition=max
Bootstrap/regtest x86_64-linux is running, will commit it once it finishes. PR ipa/65588 * symtab.c (symtab_node::get_partitioning_class): Register vars are duplicated. (symbol_table::output_variables) Do not assemble unefined decls for non-symbols. Index: symtab.c =================================================================== --- symtab.c (revision 221736) +++ symtab.c (working copy) @@ -1689,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. Index: varpool.c =================================================================== --- varpool.c (revision 221734) +++ 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) {