[cfe-dev] Potential missed optimization - unnecessary reload of vtable ptr inside loop body

John McCall via cfe-dev cfe-dev at lists.llvm.org
Wed Mar 7 17:18:39 PST 2018



> On Mar 7, 2018, at 1:41 PM, Alex Wang via cfe-dev <cfe-dev at lists.llvm.org> wrote:
> 
> Hello all!
> 
> I posted a question about a potential missed optimization to llvm-dev, but was
> directed here since it concerned more C++-specific bits of code. Previous
> conversion can be found at [0] and [1].
> 
> The code in question is here: https://godbolt.org/g/ec5cP7
> 
> My main question here is about assembly lines 24 and 46, where I think the
> vtable pointer for the Rect object is being reloaded every iteration of the
> loop. nbjoerg on #llvm said that's due to the possibility of placement new being
> used somewhere inside the called function, but I'm not entirely sure that
> placement new can change what vtable the vtable pointer points to.
> 
> (I'm new to this language lawyering stuff, so please let me know what I mess up)
> 
> As far as I understand, paragraph 8 of 6.6.3 [basic.life] in the most recent
> draft of the standard says that references or names of an object that has been
> "replaced" by placement new are only "redirected" to the new object if the new
> object is the same type and no other class derives from that type; otherwise,
> the reference/name refers to an object whose lifetime has ended. Thus, any uses
> of the "this" pointer after a member function is called are only valid if the
> placement new'd object is the same type, and so has the same vtable, which means
> the vtable pointer does not have to be reloaded.
> 
> The example for point 6.5 of paragraph 6 of 6.6.3 sort of supports this
> interpretation, since calling B::mutate() changes the type of *this, which
> causes pb to point to an object whose lifetime has ended, and further method
> calls through pb result in undefined behavior.
> 
> Is this reasoning correct? ICC 18, Clang trunk, Clang 5.0, GCC 7.3, GCC trunk,
> and MSVC 19 all perform the reload, so I'm guessing I'm wrong, but I'm not sure
> how.

Your reasoning is right, but it's proven to be very difficult to write a reliable general
optimization that only triggers on the wrong cases and not when, say, constructing
different base-class subobjects of a class.  Our optimization can be enabled with
-fstrict-vtable-pointers, but it's still experimental.

John.

> 
> If the vtable pointer reload is required, is there a way to indicate to Clang
> that such a reload will not be necessary, even though the compiler can't verify
> that (sort of like __restrict)? I tried adding [[gnu::pure]] to the function
> declarations and definitions, but the vtable pointer reload remained. Does Clang
> take [[gnu::pure]]/[[gnu::const]] into account for code generation/optimization?
> 
> Thanks for the help!
> 
> Alex
> 
>    [0]: http://lists.llvm.org/pipermail/llvm-dev/2018-February/121439.html
>    [1]: http://lists.llvm.org/pipermail/llvm-dev/2018-March/121486.html
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev




More information about the cfe-dev mailing list