------- Comment #13 from rguenther at suse dot de 2009-10-12 21:03 ------- Subject: Re: bootstrap *using* lto fails
On Mon, 12 Oct 2009, espindola at google dot com wrote: > ------- Comment #12 from espindola at google dot com 2009-10-12 21:02 ------- > (In reply to comment #9) > > Ok, so the issue here is that we have > > > > typedef struct VEC_constructor_elt_gc { } VEC_constructor_elt_gc; > > > > vs. > > > > typedef struct VEC_constructor_elt_gcx { } VEC_constructor_elt_gc; > > > > which causes us to not merge the two union tree_node types which are > > > > typedef union tree_node *tree; > > union tree_node { > > tree * use; > > VEC_constructor_elt_gc *elts; > > }; > > > > And in the end because we look through typedefs here: > > > > static hashval_t > > iterative_hash_type_name (tree type, hashval_t v) > > { > > tree name = TYPE_NAME (TYPE_MAIN_VARIANT (type)); > > > > Now this is necessary - we'd want to merge > > > > union tree_node { > > tree * use; > > struct VEC_constructor_elt_gc *elts; > > }; > > > > as well. > > > > So - this cannot be fixed by type merging, but instead together with what > > we need to fix TBAA issues for non-merged types we have to try to cover > > these issues as well. > > I am a bit confused why we cannot merge the types. > > If using structural equality, "struct VEC_constructor_elt_gc" and "struct > VEC_constructor_elt_gcx" should be equivalent since they are both {}. With > these being equivalent, the two typedefs defining VEC_constructor_elt_gc are > equivalent and finally the two "union tree_node" also are. We're not really using structural equality. I have patches to go both ways (more structural equality and less), both cause some regressions. So I'm digging somewhat further for now. Richard. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41598