This is the mail archive of the
mailing list for the GCC project.
Re: Eliminate write-only variables
- From: Martin Jambor <mjambor at suse dot cz>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 20 May 2014 23:05:05 +0200
- Subject: Re: Eliminate write-only variables
- Authentication-results: sourceware.org; auth=none
- References: <20140516172559 dot GF20755 at kam dot mff dot cuni dot cz>
On Fri, May 16, 2014 at 07:25:59PM +0200, Jan Hubicka wrote:
> this patch adds code to remove write only static variables. While analyzing
> effectivity of LTO on firefox, I noticed that surprisingly large part of
> binary's data segment is occupied by these. Fixed thus.
> (this is quite trivial transformation, I just never considered it important
> enough to work on it).
> The patch goes by marking write only variables in ipa.c (at same time we
> discover addressable flag) and also fixes handling of the flags for
> aliases. References to variables are then removed by fixup_cfg.
> As first cut, I only remove stores without side effects, so copies from
> volatile variables are preserved. I also kill LHS of function calls.
> I do not attempt to remove asm statements. This means that some references
> may be left in the code and therefore the IPA code does not eliminate the
> referneces after discovering write only variable and instead it relies
> on dead variable elimination to do the job later. Consequently not all write
> only variables are removed with WHOPR in the case the references ends up
> in different partitions. Something I can address incrementally.
> Also I think dwarf2out should be updated to mark value of the write only
> variables as optimized out. Jakub, can you help me with this?
> (I do not think it is valid to output the optimized out value of constructor)
> Bootstrapped/regtested x86_64-linux, will commit it later today.
> * varpool.c (dump_varpool_node): Dump write-only flag.
> * lto-cgraph.c (lto_output_varpool_node, input_varpool_node): Stream
> write-only flag.
> * tree-cfg.c (execute_fixup_cfg): Remove statements setting write-only variables.
> * gcc.c-torture/execute/20101011-1.c: Update testcase.
> * gcc.dg/ira-shrinkwrap-prep-1.c: Update testcase.
> * gcc.dg/tree-ssa/writeonly.c: New testcase.
> * gcc.dg/tree-ssa/ssa-dse-6.c: Update testcase.
> * gcc.dg/tree-ssa/pr21559.c: Update testcase.
> * gcc.dg/debug/pr35154.c: Update testcase.
> * gcc.target/i386/vectorize1.c: Update testcase.
> * ipa.c (process_references): New function.
> (set_readonly_bit): New function.
> (set_writeonly_bit): New function.
> (clear_addressable_bit): New function.
> (ipa_discover_readonly_nonaddressable_var): Mark write only variables; fix
> handling of aliases.
> * cgraph.h (struct varpool_node): Add writeonly flag.
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,
0x7437a3 gimple_get_virt_method_for_vtable(long, tree_node*, unsigned
0x743993 gimple_get_virt_method_for_binfo(long, tree_node*, bool*)
0x7913f2 possible_polymorphic_call_targets(tree_node*, long,
ipa_polymorphic_call_context, bool*, void**, int*)
0x7b73a9 symtab_remove_unreachable_nodes(bool, _IO_FILE*)
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