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)
{