Message ID | BANLkTimK1NLQCemLG+54H3Ko5xJz2Yi4QA@mail.gmail.com |
---|---|
State | New |
Headers | show |
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.
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); > } > } > >
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); } }