[cfe-dev] Optimizing vcalls from structors and virtual this-adjusting thunks

Chris Lattner clattner at apple.com
Fri Nov 8 13:08:17 PST 2013


On Nov 7, 2013, at 7:43 AM, Timur Iskhodzhanov <timurrrr at google.com> wrote:

> Hi John,
> 
> I've noticed Clang doesn't devirtualize all vcalls in ctors/dtors.

This sounds bad, please file a bugzilla!

-Chris

> 
> e.g. for this code:
> --------------------------
> struct A { virtual void a(); };
> struct B { virtual void b(); };
> struct C : virtual A, virtual B {
>  C();
>  virtual void key_function();
>  virtual void a();
>  virtual void b();
> };
> 
> C::C() { a(); b(); }
> void C::key_function() {}
> --------------------------
> the assembly for C::C() at -O3 is
> --------------------------
> _ZN1CC1Ev:  # complete ctor
>        pushq   %rbx
>        movq    %rdi, %rbx
>        movq    $_ZTV1C+40, (%rbx)
>        movq    $_ZTV1C+88, 8(%rbx)
>        callq   _ZN1C1aEv  # call to C::a is devirtualized
>        movq    (%rbx), %rax
>        movq    %rbx, %rdi
>        popq    %rbx
>        jmpq    *16(%rax)  # call to C::b is not!
> ...
> _ZN1CC2Ev:  # base ctor
>        pushq   %rbx
>        movq    %rdi, %rbx
>        movq    (%rsi), %rax
>        movq    %rax, (%rbx)
>        movq    8(%rsi), %rcx
>        movq    -32(%rax), %rax
>        movq    %rcx, (%rbx,%rax)
>        movq    16(%rsi), %rax
>        movq    (%rbx), %rcx
>        movq    -40(%rcx), %rcx
>        movq    %rax, (%rbx,%rcx)
>        movq    (%rbx), %rax
>        callq   *(%rax)   # looks like even C::a is not devirtualized
>        movq    (%rbx), %rax
>        movq    %rbx, %rdi
>        popq    %rbx
>        jmpq    *16(%rax)  # call C::b is not devirtualized
> --------------------------
> The same pattern holds if I define C::C() as "b(); a();" - only the
> first vcall in the complete ctor is devirtualized.
> 
> Does this look like a bug to you?
> GCC devirtualizes all four calls in this example...
> 
> I also have a somewhat related ABI question.
> Is there any reason to keep virtual this-adjusting thunks in the
> vtable when the class is fully constructed?
> I think all the offsets between bases are known statically at the end
> of the complete object constructor, so a special "final vtable" with
> only static this adjusting thunks can be used instead of a regular
> vtable?
> Am I missing something?
> 
> --
> Thanks,
> Timur
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131108/b749f69f/attachment.html>


More information about the cfe-dev mailing list