evgeny777 added inline comments.
================
Comment at: llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp:1678
+ // breaks any uses on assumes.
+ if (TypeIdMap.count(TypeId))
+ continue;
----------------
tejohnson wrote:
> evgeny777 wrote:
> > tejohnson wrote:
> > > evgeny777 wrote:
> > > > I don't think, I understand this.
> > > > It looks like that if (a) we have type.test in the module and (b) we
> > > > don't have vtable definition with corresponding type metadata in the
> > > > same module then we'll remove type.test/assume sequence before even
> > > > getting to ICP. This seems strange in the context of previous
> > > > discussion because virtual function may be called in different module
> > > > from one where vtable is defined, like so:
> > > > ```
> > > > struct A { virtual int foo() { return 42; } };
> > > >
> > > > // calls pA->foo
> > > > extern int callFoo(A *pA);
> > > > int main() { A a; return callFoo(&a); }
> > > > ```
> > > >
> > > We will only be able to do ICP this way if we have the target vtable in
> > > the module (similar to how we currently can only do ICP if the target
> > > function is in the module). I anticipate doing something similar for
> > > vtable defs as to what we do for virtual functions, where a fake call
> > > edge is added to the summary based on the value profile results to ensure
> > > they are imported before the LTO backend ICP.
> > > We will only be able to do ICP this way if we have the target vtable in
> > > the module (similar to how we currently can only do ICP if the target
> > > function is in the module).
> >
> > I was thinking of slightly different approach: it seems you have required
> > type information in combined index together with type name in the module,
> > so you probably can add external declarations of required vtables (this may
> > require promotion) to the module in the ICP pass and run ICP over them. Do
> > you think this can work?
> Possibly, but we'd still need to have type metadata on those vtable
> declarations, because the type metadata provides the address point offset
> which is needed in the comparison sequence.
> Possibly, but we'd still need to have type metadata on those vtable
> declarations, because the type metadata provides the address point offset
> which is needed in the comparison sequence.
I think it's stored in the index in VFuncId structures. Isn't it?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D73242/new/
https://reviews.llvm.org/D73242
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits