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)

Reply via email to