  Devirtualization is a compiler optimization that replaces indirect (virtual)
function calls with direct calls. It is particularly effective in
object-oriented languages, such as Java or C++, in which virtual methods are
typically abundant.
  We present a novel abstract model to express the lifetimes of C++ dynamic
objects and invariance of virtual table pointers in the LLVM intermediate
representation. The model and the corresponding implementation in Clang and
LLVM enable full devirtualization of virtual calls whenever the dynamic type is
statically known and elimination of redundant virtual table loads in other
cases.
  Due to the complexity of C++, this has not been achieved by any other C++
compiler so far. Although our model was designed for C++, it is also applicable
to other languages that use virtual dispatch. Our benchmarks show an average of
0.8% performance improvement on real-world C++ programs, with more than 30%
speedup in some cases. The implementation is already a part of the upstream
LLVM/Clang and can be enabled with the -fstrict-vtable-pointers flag.
