>
> Unfortunately, this commit has caused the following ICE for me when
> LTO building 471.omnetpp from SPEC 2006 or Firefox (but not libxul,
> something that gets built earlier):
>
> lto1: internal compiler error: in gimple_get_virt_method_for_vtable,
> at gimple-fold.c:3276
> 0x7437a3 gimple_get_virt_method_for_vtable(long, tree_node*, unsigned
> long, bool*)
> /home/mjambor/gcc/bisect/src/gcc/gimple-fold.c:3276
> 0x743993 gimple_get_virt_method_for_binfo(long, tree_node*, bool*)
> /home/mjambor/gcc/bisect/src/gcc/gimple-fold.c:3377
> 0x7913f2 possible_polymorphic_call_targets(tree_node*, long,
> ipa_polymorphic_call_context, bool*, void**, int*)
> /home/mjambor/gcc/bisect/src/gcc/ipa-devirt.c:1697
> 0x7b73a9 possible_polymorphic_call_targets
> /home/mjambor/gcc/bisect/src/gcc/ipa-utils.h:121
> 0x7b73a9 walk_polymorphic_call_targets
> /home/mjambor/gcc/bisect/src/gcc/ipa.c:177
> 0x7b73a9 symtab_remove_unreachable_nodes(bool, _IO_FILE*)
> /home/mjambor/gcc/bisect/src/gcc/ipa.c:407
> 0x86bf47 execute_todo
> /home/mjambor/gcc/bisect/src/gcc/passes.c:1843
> Please submit a full bug report...
>
> I compile omnetpp with -Ofast -g -flto=8 -fwhole-program
> -funroll-loops -fpeel-loops -march=native -mtune=native
>
> I'm afraid I won't be able to prepare a more reduced testcase very
> soon.
Actually I think where is a problem: when the variable is completely dead
(that is no writes, reads and address taken), we still set the writeonly
flag and clear DECL_INITIAL. This may happen for vtables still in use
by the type based devirt machinery. The following patch should fix it.
Bootstrapped/regtested and comitted to mainline.
It also fixes the debug output issue you pointed out.
Index: ipa.c
===================================================================
--- ipa.c (revision 210653)
+++ ipa.c (working copy)
@@ -730,7 +730,7 @@ ipa_discover_readonly_nonaddressable_var
if (!address_taken)
{
if (TREE_ADDRESSABLE (vnode->decl) && dump_file)
- fprintf (dump_file, " %s (addressable)", vnode->name ());
+ fprintf (dump_file, " %s (non-addressable)", vnode->name ());
varpool_for_node_and_aliases (vnode, clear_addressable_bit, NULL,
true);
}
if (!address_taken && !written
@@ -743,7 +743,7 @@ ipa_discover_readonly_nonaddressable_var
fprintf (dump_file, " %s (read-only)", vnode->name ());
varpool_for_node_and_aliases (vnode, set_readonly_bit, NULL, true);
}
- if (!vnode->writeonly && !read && !address_taken)
+ if (!vnode->writeonly && !read && !address_taken && written)
{
if (dump_file)
fprintf (dump_file, " %s (write-only)", vnode->name ());