WholeProgramDevirt: print remarks with devirtualized method names.

Summary:
Chrome on Linux uses WholeProgramDevirt for speed ups, and it's
important to detect regressions on both sides: the toolchain,
if fewer methods get devirtualized after an update, and Chrome,
if an innocently looking change caused many hot methods become
virtual again.

The need to track devirtualized methods is not Chrome-specific,
but it's probably the only user of the pass at this time.

Reviewers: kcc

Differential Revision: https://reviews.llvm.org/D23219

llvm-svn: 277856
This commit is contained in:
Ivan Krasin
2016-08-05 19:45:16 +00:00
parent 45e442ebaa
commit b05e06e4fd
3 changed files with 35 additions and 3 deletions

View File

@@ -35,6 +35,7 @@
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
@@ -610,6 +611,16 @@ bool DevirtModule::tryVirtualConstProp(
return true;
}
static void emitTargetsRemarks(const std::vector<VirtualCallTarget> &TargetsForSlot) {
for (const VirtualCallTarget &Target : TargetsForSlot) {
Function *F = Target.Fn;
DISubprogram *SP = F->getSubprogram();
DebugLoc DL = SP ? DebugLoc::get(SP->getScopeLine(), 0, SP) : DebugLoc();
emitOptimizationRemark(F->getContext(), DEBUG_TYPE, *F, DL,
std::string("devirtualized ") + F->getName().str());
}
}
void DevirtModule::rebuildGlobal(VTableBits &B) {
if (B.Before.Bytes.empty() && B.After.Bytes.empty())
return;
@@ -815,10 +826,15 @@ bool DevirtModule::run() {
S.first.ByteOffset))
continue;
if (trySingleImplDevirt(TargetsForSlot, S.second))
if (trySingleImplDevirt(TargetsForSlot, S.second)) {
emitTargetsRemarks(TargetsForSlot);
continue;
}
DidVirtualConstProp |= tryVirtualConstProp(TargetsForSlot, S.second);
if (tryVirtualConstProp(TargetsForSlot, S.second)) {
emitTargetsRemarks(TargetsForSlot);
DidVirtualConstProp = true;
}
}
// If we were able to eliminate all unsafe uses for a type checked load,