> On 08/17/2013 05:44 PM, Jan Hubicka wrote: > > 1) we want the type to not have base because we may have inlined the > > constructor. > > During construction the vtables are filled by base's vtable and thus we > > can > > not simply devirtualize based on the final virtual table without > > proving that > > constructor was not (partially) inlined. > > If the constructor is inlined into the current function, then we can > see the most recent assignment to the vptr and use that for > devirtualization.
In most cases, yes. There are some special issues, like partial inlining (where the "wrong" assignment gets inlined, but the final assignment not) But I think tracking inlining those (it will need to make middle end aware of constructors that I think is good idea anyway) and leaving those to the constant propagation should work well enough in practice. > > >I do not know if one can do > >something like having automatic variable of class A and use placement new > >to change it to class B. > > This is something of a grey area in the standard, with a few defect > reports yet to be resolved. I think it should be undefined > behavior. I would preffer it being so ;) > > >Finally I decided to replace the lookup of base binfo by call to > >get_binfo_at_offset. This is not possible. For example my base > >variable can be: > > > >struct {class A a; class B b} var; > > > >and offset 10 may point to class B. Here I get an ICE since TYPE_BINFO > >of the structure is NULL (it is not class). > > I don't understand. In C++ a struct is a class. You are right. I get the ICE here only why I handle arrays and unions, too. (as I do in my tree, but not in the patches posted). In the example above the struct seems to have TYPE_BINFO even though it is useless. Since handling arrays and union seems to make sense and resolves some real testcases from firefox, I think we could keep the tree structured in a way making this possible. I.e. having the type walk as proposed in the patch instead of calling get_binfo_at_offset. > > >I wonder if we can track functions that return pointers/values of objects > > exactly of given type (i.e. no derivations). > > If the function returns by value, it's always a value of that exact type. OK, good! > > >Is the dynamic type upon return from constructor always known to be of > > constructor's type? > > Yes. > > > We may want to introduce assert_type_expr use like: > > > > obj_ptr = assert_type_expr<class A> obj_ptr; > > > > that can be dropped by FE for us to drive those more interesting cases, > > like > > partial construction. > > I guess we would need to be careful to insert those after vptr > assignments within the constructor body, as well. Yes, if we go this way, we will need C++ FE to produce the asserts. The original patch seems resonable? Honza > > Jason