On Tue, 18 Feb 2014, Richard Biener wrote: > On Mon, 17 Feb 2014, Jan Hubicka wrote: > > > > > > > Yeah, ok. But we treat those types (B and C) TBAA equivalent because > > > structurally they are the same ;) Luckily C has a "proper" field > > > for its base (proper means that offset and size are correct as well > > > as the type). It indeed has DECL_ARTIFICIAL set and yes, we treat > > > those as "real" fields when doing the structural comparison. > > > > Yep, the difference is that depending if C or D win, we will end up walking > > the > > BINFO or not. So we should not depend on the BINFo walk for correctness. > > > > > > More interesting is of course when we can re-use tail-padding in > > > one but not the other (works as expected - not merged). > > > > Yep. > > > > > > struct A { A (); short x; bool a;}; > > > struct C:A { bool b; }; > > > struct B {struct A a; bool b;}; > > > struct C *p2; > > > struct B *p1; > > > int > > > t() > > > { > > > p1->a.a = 2; > > > return p2->a; > > > } > > > > > > > Yes, zero sized classes are those having no fields (but other stuff, > > > > type decls, bases etc.) > > > > > > Yeah, but TBAA obviously doesn't care about type decls and bases. > > > > So I guess the conclussion is that the BINFO walk in alias.c is pointless? > > Yes. But as I said - I remember being there and proposing to remove > it. Some N > 5 years ago or so and it was either rejected or it didn't > work out ;)
Btw, a bootstrap & regtest worked fine with removing that loop (not that this proves anything). Richard.