This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Eliminate write-only variables


Hi,

On Fri, May 16, 2014 at 07:25:59PM +0200, Jan Hubicka wrote:
> Hi,
> 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.
> 
> Honza
> 
> 	* 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,
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.

Thanks,

Martin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]