LLVM  16.0.0git
ValueProfilePlugins.inc
Go to the documentation of this file.
1 //=== ValueProfilePlugins.inc - set of plugins used by ValueProfileCollector =//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains a set of plugin classes used in ValueProfileCollectorImpl.
10 // Each plugin is responsible for collecting Value Profiling candidates for a
11 // particular optimization.
12 // Each plugin must satisfy the interface described in ValueProfileCollector.cpp
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "ValueProfileCollector.h"
19 #include "llvm/IR/InstVisitor.h"
20 
21 using namespace llvm;
22 using CandidateInfo = ValueProfileCollector::CandidateInfo;
23 
25 
26 ///--------------------------- MemIntrinsicPlugin ------------------------------
27 class MemIntrinsicPlugin : public InstVisitor<MemIntrinsicPlugin> {
28  Function &F;
29  TargetLibraryInfo &TLI;
30  std::vector<CandidateInfo> *Candidates;
31 
32 public:
33  static constexpr InstrProfValueKind Kind = IPVK_MemOPSize;
34 
35  MemIntrinsicPlugin(Function &Fn, TargetLibraryInfo &TLI)
36  : F(Fn), TLI(TLI), Candidates(nullptr) {}
37 
38  void run(std::vector<CandidateInfo> &Cs) {
39  Candidates = &Cs;
40  visit(F);
41  Candidates = nullptr;
42  }
43  void visitMemIntrinsic(MemIntrinsic &MI) {
44  Value *Length = MI.getLength();
45  // Not instrument constant length calls.
46  if (isa<ConstantInt>(Length))
47  return;
48 
49  Instruction *InsertPt = &MI;
50  Instruction *AnnotatedInst = &MI;
51  Candidates->emplace_back(CandidateInfo{Length, InsertPt, AnnotatedInst});
52  }
53  void visitCallInst(CallInst &CI) {
54  if (!MemOPOptMemcmpBcmp)
55  return;
56  auto *F = CI.getCalledFunction();
57  if (!F)
58  return;
59  LibFunc Func;
60  if (TLI.getLibFunc(CI, Func) &&
61  (Func == LibFunc_memcmp || Func == LibFunc_bcmp)) {
62  Value *Length = CI.getArgOperand(2);
63  // Not instrument constant length calls.
64  if (isa<ConstantInt>(Length))
65  return;
66  Instruction *InsertPt = &CI;
67  Instruction *AnnotatedInst = &CI;
68  Candidates->emplace_back(CandidateInfo{Length, InsertPt, AnnotatedInst});
69  }
70  }
71 };
72 
73 ///------------------------ IndirectCallPromotionPlugin ------------------------
74 class IndirectCallPromotionPlugin {
75  Function &F;
76 
77 public:
78  static constexpr InstrProfValueKind Kind = IPVK_IndirectCallTarget;
79 
80  IndirectCallPromotionPlugin(Function &Fn, TargetLibraryInfo &TLI) : F(Fn) {}
81 
82  void run(std::vector<CandidateInfo> &Candidates) {
83  std::vector<CallBase *> Result = findIndirectCalls(F);
84  for (Instruction *I : Result) {
85  Value *Callee = cast<CallBase>(I)->getCalledOperand();
86  Instruction *InsertPt = I;
87  Instruction *AnnotatedInst = I;
88  Candidates.emplace_back(CandidateInfo{Callee, InsertPt, AnnotatedInst});
89  }
90  }
91 };
92 
93 ///----------------------- Registration of the plugins -------------------------
94 /// For now, registering a plugin with the ValueProfileCollector is done by
95 /// adding the plugin type to the VP_PLUGIN_LIST macro.
96 #define VP_PLUGIN_LIST \
97  MemIntrinsicPlugin, \
98  IndirectCallPromotionPlugin
MI
IRTranslator LLVM IR MI
Definition: IRTranslator.cpp:108
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::Function
Definition: Function.h:60
llvm::MemIntrinsic
This is the common base class for memset/memcpy/memmove.
Definition: IntrinsicInst.h:1041
F
#define F(x, y, z)
Definition: MD5.cpp:55
IndirectCallVisitor.h
llvm::LibFunc
LibFunc
Definition: TargetLibraryInfo.h:36
llvm::CallBase::getCalledFunction
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Definition: InstrTypes.h:1397
llvm::ms_demangle::QualifierMangleMode::Result
@ Result
TargetLibraryInfo.h
llvm::TargetLibraryInfo::getLibFunc
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
Definition: TargetLibraryInfo.h:298
llvm::Instruction
Definition: Instruction.h:42
llvm::lltok::Kind
Kind
Definition: LLToken.h:18
llvm::dxil::PointerTypeAnalysis::run
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
Definition: PointerTypeAnalysis.cpp:189
llvm::cl::opt< bool >
I
#define I(x, y, z)
Definition: MD5.cpp:58
llvm::InstrProfValueKind
InstrProfValueKind
Definition: InstrProf.h:244
InstVisitor.h
llvm::InstVisitor
Base class for instruction visitors.
Definition: InstVisitor.h:78
llvm::ifs::IFSSymbolType::Func
@ Func
Callee
amdgpu Simplify well known AMD library false FunctionCallee Callee
Definition: AMDGPULibCalls.cpp:187
llvm::findIndirectCalls
std::vector< CallBase * > findIndirectCalls(Function &F)
Definition: IndirectCallVisitor.h:31
ValueProfileCollector.h
llvm::ValueProfileCollector::CandidateInfo
Definition: ValueProfileCollector.h:59
llvm::TargetLibraryInfo
Provides information about what library functions are available for the current target.
Definition: TargetLibraryInfo.h:226
llvm::CallBase::getArgOperand
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1342
llvm::CallInst
This class represents a function call, abstracting a target machine's calling convention.
Definition: Instructions.h:1474
MemOPOptMemcmpBcmp
cl::opt< bool > MemOPOptMemcmpBcmp("pgo-memop-optimize-memcmp-bcmp", cl::init(true), cl::Hidden, cl::desc("Size-specialize memcmp and bcmp calls"))
llvm::Value
LLVM Value Representation.
Definition: Value.h:74