diff options
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc b/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc index 4cc4c6c848c39..8d0cf5843ebce 100644 --- a/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc +++ b/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc @@ -20,15 +20,19 @@ using namespace llvm; using CandidateInfo = ValueProfileCollector::CandidateInfo; +extern cl::opt<bool> MemOPOptMemcmpBcmp; + ///--------------------------- MemIntrinsicPlugin ------------------------------ class MemIntrinsicPlugin : public InstVisitor<MemIntrinsicPlugin> { Function &F; + TargetLibraryInfo &TLI; std::vector<CandidateInfo> *Candidates; public: static constexpr InstrProfValueKind Kind = IPVK_MemOPSize; - MemIntrinsicPlugin(Function &Fn) : F(Fn), Candidates(nullptr) {} + MemIntrinsicPlugin(Function &Fn, TargetLibraryInfo &TLI) + : F(Fn), TLI(TLI), Candidates(nullptr) {} void run(std::vector<CandidateInfo> &Cs) { Candidates = &Cs; @@ -45,6 +49,24 @@ public: Instruction *AnnotatedInst = &MI; Candidates->emplace_back(CandidateInfo{Length, InsertPt, AnnotatedInst}); } + void visitCallInst(CallInst &CI) { + if (!MemOPOptMemcmpBcmp) + return; + auto *F = CI.getCalledFunction(); + if (!F) + return; + LibFunc Func; + if (TLI.getLibFunc(CI, Func) && + (Func == LibFunc_memcmp || Func == LibFunc_bcmp)) { + Value *Length = CI.getArgOperand(2); + // Not instrument constant length calls. + if (dyn_cast<ConstantInt>(Length)) + return; + Instruction *InsertPt = &CI; + Instruction *AnnotatedInst = &CI; + Candidates->emplace_back(CandidateInfo{Length, InsertPt, AnnotatedInst}); + } + } }; ///------------------------ IndirectCallPromotionPlugin ------------------------ @@ -54,12 +76,12 @@ class IndirectCallPromotionPlugin { public: static constexpr InstrProfValueKind Kind = IPVK_IndirectCallTarget; - IndirectCallPromotionPlugin(Function &Fn) : F(Fn) {} + IndirectCallPromotionPlugin(Function &Fn, TargetLibraryInfo &TLI) : F(Fn) {} void run(std::vector<CandidateInfo> &Candidates) { - std::vector<Instruction *> Result = findIndirectCalls(F); + std::vector<CallBase *> Result = findIndirectCalls(F); for (Instruction *I : Result) { - Value *Callee = CallSite(I).getCalledValue(); + Value *Callee = cast<CallBase>(I)->getCalledOperand(); Instruction *InsertPt = I; Instruction *AnnotatedInst = I; Candidates.emplace_back(CandidateInfo{Callee, InsertPt, AnnotatedInst}); |