diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp b/llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp index a02d88fe066f..a5e65ffc45fe 100644 --- a/llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp +++ b/llvm/lib/Transforms/Scalar/AnnotationRemarks.cpp @@ -16,10 +16,13 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstIterator.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/MemoryOpRemark.h" using namespace llvm; using namespace llvm::ore; @@ -27,16 +30,37 @@ using namespace llvm::ore; #define DEBUG_TYPE "annotation-remarks" #define REMARK_PASS DEBUG_TYPE -static void runImpl(Function &F) { +static void tryEmitAutoInitRemark(ArrayRef<Instruction *> Instructions, + OptimizationRemarkEmitter &ORE, + const TargetLibraryInfo &TLI) { + // For every auto-init annotation generate a separate remark. + for (Instruction *I : Instructions) { + if (!AutoInitRemark::canHandle(I)) + continue; + + Function &F = *I->getParent()->getParent(); + const DataLayout &DL = F.getParent()->getDataLayout(); + AutoInitRemark Remark(ORE, REMARK_PASS, DL, TLI); + Remark.visit(I); + } +} + +static void runImpl(Function &F, const TargetLibraryInfo &TLI) { if (!OptimizationRemarkEmitter::allowExtraAnalysis(F, REMARK_PASS)) return; + // Track all annotated instructions aggregated based on their debug location. + DenseMap<MDNode *, SmallVector<Instruction *, 4>> DebugLoc2Annotated; + OptimizationRemarkEmitter ORE(&F); - // For now, just generate a summary of the annotated instructions. + // First, generate a summary of the annotated instructions. MapVector<StringRef, unsigned> Mapping; for (Instruction &I : instructions(F)) { if (!I.hasMetadata(LLVMContext::MD_annotation)) continue; + auto Iter = DebugLoc2Annotated.insert({I.getDebugLoc().getAsMDNode(), {}}); + Iter.first->second.push_back(&I); + for (const MDOperand &Op : I.getMetadata(LLVMContext::MD_annotation)->operands()) { auto Iter = Mapping.insert({cast<MDString>(Op.get())->getString(), 0}); @@ -44,11 +68,21 @@ static void runImpl(Function &F) { } } - Instruction *IP = &*F.begin()->begin(); for (const auto &KV : Mapping) - ORE.emit(OptimizationRemarkAnalysis(REMARK_PASS, "AnnotationSummary", IP) + ORE.emit(OptimizationRemarkAnalysis(REMARK_PASS, "AnnotationSummary", + F.getSubprogram(), &F.front()) << "Annotated " << NV("count", KV.second) << " instructions with " << NV("type", KV.first)); + + // For each debug location, look for all the instructions with annotations and + // generate more detailed remarks to be displayed at that location. + for (auto &KV : DebugLoc2Annotated) { + // Don't generate remarks with no debug location. + if (!KV.first) + continue; + + tryEmitAutoInitRemark(KV.second, ORE, TLI); + } } namespace { @@ -61,12 +95,15 @@ struct AnnotationRemarksLegacy : public FunctionPass { } bool runOnFunction(Function &F) override { - runImpl(F); + const TargetLibraryInfo &TLI = + getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); + runImpl(F, TLI); return false; } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); + AU.addRequired<TargetLibraryInfoWrapperPass>(); } }; @@ -76,6 +113,7 @@ char AnnotationRemarksLegacy::ID = 0; INITIALIZE_PASS_BEGIN(AnnotationRemarksLegacy, "annotation-remarks", "Annotation Remarks", false, false) +INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) INITIALIZE_PASS_END(AnnotationRemarksLegacy, "annotation-remarks", "Annotation Remarks", false, false) @@ -85,6 +123,7 @@ FunctionPass *llvm::createAnnotationRemarksLegacyPass() { PreservedAnalyses AnnotationRemarksPass::run(Function &F, FunctionAnalysisManager &AM) { - runImpl(F); + auto &TLI = AM.getResult<TargetLibraryAnalysis>(F); + runImpl(F, TLI); return PreservedAnalyses::all(); } |