summaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc')
-rw-r--r--llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc30
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});