Patchwork [lto] Unify decl and type registration (issue4515186)

login
register
mail settings
Submitter Diego Novillo
Date June 6, 2011, 5:02 p.m.
Message ID <BANLkTimK1NLQCemLG+54H3Ko5xJz2Yi4QA@mail.gmail.com>
Download mbox | patch
Permalink /patch/98958/
State New
Headers show

Comments

Diego Novillo - June 6, 2011, 5:02 p.m.
On Mon, Jun 6, 2011 at 10:27, Diego Novillo <dnovillo@google.com> wrote:
> On Mon, Jun 6, 2011 at 04:50, Richard Guenther <rguenther@suse.de> wrote:
>
>> I'd have it done in the loop that computes canonical types, at this
>> place we do not gain the advantage that the decl register functions
>> get completely fixed up trees.
>
> Hm, yes, I had forgotten about the call to rest_of_decl_compilation.
> Patch coming up.

You mean this?  Currently under testing.


        * lto.c (uniquify_nodes): Move code to register decls to
        the loop that computes canonical types.
Diego Novillo - June 6, 2011, 6:41 p.m.
On Mon, Jun 6, 2011 at 13:02, Diego Novillo <dnovillo@google.com> wrote:
> On Mon, Jun 6, 2011 at 10:27, Diego Novillo <dnovillo@google.com> wrote:
>> On Mon, Jun 6, 2011 at 04:50, Richard Guenther <rguenther@suse.de> wrote:
>>
>>> I'd have it done in the loop that computes canonical types, at this
>>> place we do not gain the advantage that the decl register functions
>>> get completely fixed up trees.
>>
>> Hm, yes, I had forgotten about the call to rest_of_decl_compilation.
>> Patch coming up.
>
> You mean this?  Currently under testing.

>
>
>        * lto.c (uniquify_nodes): Move code to register decls to
>        the loop that computes canonical types.


LTO profiledbootstrap and regression tested on x86_64.

OK for trunk?


Diego.
Richard Guenther - June 7, 2011, 8:50 a.m.
On Mon, 6 Jun 2011, Diego Novillo wrote:

> On Mon, Jun 6, 2011 at 10:27, Diego Novillo <dnovillo@google.com> wrote:
> > On Mon, Jun 6, 2011 at 04:50, Richard Guenther <rguenther@suse.de> wrote:
> >
> >> I'd have it done in the loop that computes canonical types, at this
> >> place we do not gain the advantage that the decl register functions
> >> get completely fixed up trees.
> >
> > Hm, yes, I had forgotten about the call to rest_of_decl_compilation.
> > Patch coming up.
> 
> You mean this?  Currently under testing.

Yes.

Thanks,
Richard.

> 
>         * lto.c (uniquify_nodes): Move code to register decls to
>         the loop that computes canonical types.
> 
> diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
> index 74dfecd..6e49ee7 100644
> --- a/gcc/lto/lto.c
> +++ b/gcc/lto/lto.c
> @@ -651,21 +651,13 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
>    /* Go backwards because children streamed for the first time come
>       as part of their parents, and hence are created after them.  */
> 
> -  /* First register all declarations and types in the cache.
> -     This makes sure to have the original structure in the type cycles
> -     when registering them and computing hashes.  */
> +  /* First register all the types in the cache.  This makes sure to
> +     have the original structure in the type cycles when registering
> +     them and computing hashes.  */
>    for (i = len; i-- > from;)
>      {
>        tree t = VEC_index (tree, cache->nodes, i);
> -
> -      if (t == NULL_TREE)
> -       continue;
> -
> -      if (TREE_CODE (t) == VAR_DECL)
> -       lto_register_var_decl_in_symtab (data_in, t);
> -      else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))
> -       lto_register_function_decl_in_symtab (data_in, t);
> -      else if (TYPE_P (t))
> +      if (t && TYPE_P (t))
>         gimple_register_type (t);
>      }
> 
> @@ -788,19 +780,23 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
>         }
>      }
> 
> -  /* Finally compute the canonical type of t.  From this point
> -     there are no longer any types with TYPE_STRUCTURAL_EQUALITY_P
> -     and its type-based alias problems.  This step requires the
> -     TYPE_POINTER_TO lists being present, so make sure it is done
> -     last.  */
> +  /* Finally compute the canonical type of all TREE_TYPEs and register
> +     VAR_DECL and FUNCTION_DECL nodes in the symbol table.
> +     From this point there are no longer any types with
> +     TYPE_STRUCTURAL_EQUALITY_P and its type-based alias problems.
> +     This step requires the TYPE_POINTER_TO lists being present, so
> +     make sure it is done last.  */
>    for (i = len; i-- > from;)
>      {
>        tree t = VEC_index (tree, cache->nodes, i);
> -      if (!t
> -         || !TYPE_P (t))
> +      if (t == NULL_TREE)
>         continue;
> 
> -      if (!TYPE_CANONICAL (t))
> +      if (TREE_CODE (t) == VAR_DECL)
> +       lto_register_var_decl_in_symtab (data_in, t);
> +      else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))
> +       lto_register_function_decl_in_symtab (data_in, t);
> +      else if (TYPE_P (t) && !TYPE_CANONICAL (t))
>         TYPE_CANONICAL (t) = gimple_register_canonical_type (t);
>      }
>  }
> 
>

Patch

diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 74dfecd..6e49ee7 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -651,21 +651,13 @@  uniquify_nodes (struct data_in *data_in, unsigned from)
   /* Go backwards because children streamed for the first time come
      as part of their parents, and hence are created after them.  */

-  /* First register all declarations and types in the cache.
-     This makes sure to have the original structure in the type cycles
-     when registering them and computing hashes.  */
+  /* First register all the types in the cache.  This makes sure to
+     have the original structure in the type cycles when registering
+     them and computing hashes.  */
   for (i = len; i-- > from;)
     {
       tree t = VEC_index (tree, cache->nodes, i);
-
-      if (t == NULL_TREE)
-       continue;
-
-      if (TREE_CODE (t) == VAR_DECL)
-       lto_register_var_decl_in_symtab (data_in, t);
-      else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))
-       lto_register_function_decl_in_symtab (data_in, t);
-      else if (TYPE_P (t))
+      if (t && TYPE_P (t))
        gimple_register_type (t);
     }

@@ -788,19 +780,23 @@  uniquify_nodes (struct data_in *data_in, unsigned from)
        }
     }

-  /* Finally compute the canonical type of t.  From this point
-     there are no longer any types with TYPE_STRUCTURAL_EQUALITY_P
-     and its type-based alias problems.  This step requires the
-     TYPE_POINTER_TO lists being present, so make sure it is done
-     last.  */
+  /* Finally compute the canonical type of all TREE_TYPEs and register
+     VAR_DECL and FUNCTION_DECL nodes in the symbol table.
+     From this point there are no longer any types with
+     TYPE_STRUCTURAL_EQUALITY_P and its type-based alias problems.
+     This step requires the TYPE_POINTER_TO lists being present, so
+     make sure it is done last.  */
   for (i = len; i-- > from;)
     {
       tree t = VEC_index (tree, cache->nodes, i);
-      if (!t
-         || !TYPE_P (t))
+      if (t == NULL_TREE)
        continue;

-      if (!TYPE_CANONICAL (t))
+      if (TREE_CODE (t) == VAR_DECL)
+       lto_register_var_decl_in_symtab (data_in, t);
+      else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))
+       lto_register_function_decl_in_symtab (data_in, t);
+      else if (TYPE_P (t) && !TYPE_CANONICAL (t))
        TYPE_CANONICAL (t) = gimple_register_canonical_type (t);
     }
 }