------- 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. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41598