summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
index 53eb4e2c907..b14bfa36f41 100644
--- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
+++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
@@ -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,
OpenPOWER on IntegriCloud