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)