Hi,
On Fri, May 16, 2014 at 07:25:59PM +0200, Jan Hubicka wrote: > ... > > * 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. > ... > Index: ipa.c > =================================================================== > --- ipa.c (revision 210514) > +++ ipa.c (working copy) > @@ -640,43 +711,40 @@ ipa_discover_readonly_nonaddressable_var > if (dump_file) > fprintf (dump_file, "Clearing variable flags:"); > FOR_EACH_VARIABLE (vnode) > - if (vnode->definition && varpool_all_refs_explicit_p (vnode) > + if (!vnode->alias > && (TREE_ADDRESSABLE (vnode->decl) > + || !vnode->writeonly > || !TREE_READONLY (vnode->decl))) > { > bool written = false; > bool address_taken = false; > - int i; > - struct ipa_ref *ref; > - for (i = 0; ipa_ref_list_referring_iterate (&vnode->ref_list, > - i, ref) > - && (!written || !address_taken); i++) > - switch (ref->use) > - { > - case IPA_REF_ADDR: > - address_taken = true; > - break; > - case IPA_REF_LOAD: > - break; > - case IPA_REF_STORE: > - written = true; > - break; > - } > - if (TREE_ADDRESSABLE (vnode->decl) && !address_taken) > + bool read = false; > + bool explicit_refs = true; > + > + process_references (vnode, &written, &address_taken, &read, > &explicit_refs); > + if (!explicit_refs) > + continue; > + if (!address_taken) > { > - if (dump_file) > + if (TREE_ADDRESSABLE (vnode->decl) && dump_file) > fprintf (dump_file, " %s (addressable)", vnode->name ()); I know it is technically not a part of the patch... but surely this is supposed to dump not addressable and might be quite a bit confusing, so if you are already changing this, correcting the dump would be great. Martin > - TREE_ADDRESSABLE (vnode->decl) = 0; > + varpool_for_node_and_aliases (vnode, clear_addressable_bit, NULL, > true); > } > - if (!TREE_READONLY (vnode->decl) && !address_taken && !written > + if (!address_taken && !written > /* Making variable in explicit section readonly can cause section > type conflict. > See e.g. gcc.c-torture/compile/pr23237.c */ > && DECL_SECTION_NAME (vnode->decl) == NULL) > { > - if (dump_file) > + if (!TREE_READONLY (vnode->decl) && dump_file) > fprintf (dump_file, " %s (read-only)", vnode->name ()); > - TREE_READONLY (vnode->decl) = 1; > + varpool_for_node_and_aliases (vnode, set_readonly_bit, NULL, true); > + } > + if (!vnode->writeonly && !read && !address_taken) > + { > + if (dump_file) > + fprintf (dump_file, " %s (write-only)", vnode->name ()); > + varpool_for_node_and_aliases (vnode, set_writeonly_bit, NULL, true); > } > } > if (dump_file)