33 using namespace sampleprof;
37 cl::desc(
"Path to the prefetch hints profile. See also " 38 "-x86-discriminate-memops"),
44 bool doInitialization(
Module &)
override;
48 unsigned InstructionID;
53 Prefetches &prefetches)
const;
57 X86InsertPrefetch(
const std::string &PrefetchHintsFilename);
59 return "X86 Insert Cache Prefetches";
64 std::unique_ptr<SampleProfileReader> Reader;
76 Loc->getBaseDiscriminator());
77 return std::error_code();
82 bool IsMemOpCompatibleWithPrefetch(
const MachineInstr &MI,
int Op) {
85 return (BaseReg == 0 ||
86 X86MCRegisterClasses[X86::GR64RegClassID].
contains(BaseReg) ||
87 X86MCRegisterClasses[X86::GR32RegClassID].
contains(BaseReg)) &&
89 X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg) ||
90 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg));
101 X86InsertPrefetch::X86InsertPrefetch(
const std::string &PrefetchHintsFilename)
107 bool X86InsertPrefetch::findPrefetchInfo(
const FunctionSamples *TopSamples,
109 Prefetches &Prefetches)
const {
110 assert(Prefetches.empty() &&
111 "Expected caller passed empty PrefetchInfo vector.");
112 static const std::pair<const StringRef, unsigned> HintTypes[] = {
113 {
"_nta_", X86::PREFETCHNTA},
114 {
"_t0_", X86::PREFETCHT0},
115 {
"_t1_", X86::PREFETCHT1},
116 {
"_t2_", X86::PREFETCHT2},
118 static const char *SerializedPrefetchPrefix =
"__prefetch";
123 int16_t max_index = -1;
126 for (
const auto &S_V : *T) {
129 int64_t
D =
static_cast<int64_t
>(S_V.second);
131 for (
const auto &HintType : HintTypes) {
133 Name = Name.
drop_front(HintType.first.size());
134 IID = HintType.second;
143 if (index >= Prefetches.size())
144 Prefetches.resize(index + 1);
145 Prefetches[index] = {IID, D};
146 max_index =
std::max(max_index, static_cast<int16_t>(index));
149 assert(max_index + 1 >= 0 &&
150 "Possible overflow: max_index + 1 should be positive.");
151 assert(static_cast<size_t>(max_index + 1) == Prefetches.size() &&
152 "The number of prefetch hints received should match the number of " 153 "PrefetchInfo objects returned");
154 return !Prefetches.empty();
157 bool X86InsertPrefetch::doInitialization(
Module &M) {
158 if (Filename.empty())
163 SampleProfileReader::create(Filename, Ctx);
164 if (std::error_code EC = ReaderOrErr.
getError()) {
165 std::string Msg =
"Could not open profile: " +
EC.message();
170 Reader = std::move(ReaderOrErr.
get());
175 void X86InsertPrefetch::getAnalysisUsage(
AnalysisUsage &AU)
const {
187 bool Changed =
false;
191 for (
auto &MBB : MF) {
192 for (
auto MI = MBB.instr_begin(); MI != MBB.instr_end();) {
200 int MemOpOffset = Offset + Bias;
202 if (!IsMemOpCompatibleWithPrefetch(*Current, MemOpOffset))
205 if (!findPrefetchInfo(Samples, *Current, Prefetches))
208 "The Prefetches vector should contain at least a value if " 209 "findPrefetchInfo returned true.");
210 for (
auto &PrefInfo : Prefetches) {
211 unsigned PFetchInstrID = PrefInfo.InstructionID;
212 int64_t Delta = PrefInfo.Delta;
215 MF.CreateMachineInstr(Desc, Current->getDebugLoc(),
true);
221 "Unexpected change in X86 operand offset order.");
231 .addImm(Current->getOperand(MemOpOffset +
X86::AddrDisp).getImm() +
236 if (!Current->memoperands_empty()) {
238 MIB.addMemOperand(MF.getMachineMemOperand(
244 MBB.insert(Current, PFetch);
Represents either an error or a value T.
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
This class represents lattice values for constants.
A Module instance is used to store all the information related to an LLVM module. ...
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Describe properties that are true of each instruction in the target description file.
unsigned getReg() const
getReg - Returns the register number.
StringMap< uint64_t > CallTargetMap
uint64_t getSize() const
Return the size in bytes of the memory reference.
return AArch64::GPR64RegClass contains(Reg)
Representation of the samples collected for a function.
AnalysisUsage & addRequired()
A description of a memory reference used in the backend.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const HexagonInstrInfo * TII
LLVMContext & getContext() const
Get the global data context.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
std::enable_if< std::numeric_limits< T >::is_signed, bool >::type consumeInteger(unsigned Radix, T &Result)
Parse the current string as an integer of the specified radix.
virtual const TargetInstrInfo * getInstrInfo() const
TargetInstrInfo - Interface to description of machine instruction set.
const FunctionSamples * findFunctionSamples(const DILocation *DIL) const
Get the FunctionSamples of the inline instance where DIL originates from.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
This is an important class for using LLVM in a threaded context.
std::error_code getError() const
Represent the analysis usage information of a pass.
FunctionPass class - This class is used to implement most global optimizations.
unsigned getOperandBias(const MCInstrDesc &Desc)
getOperandBias - compute whether all of the def operands are repeated in the uses and therefore shoul...
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
static cl::opt< std::string > PrefetchHintsFile("prefetch-hints-file", cl::desc("Path to the prefetch hints profile. See also " "-x86-discriminate-memops"), cl::Hidden)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
static unsigned getOffset(const DILocation *DIL)
Returns the line offset to the start line of the subprogram.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
const Function & getFunction() const
Return the LLVM function that this machine code represents.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Representation of each machine instruction.
FunctionPass * createX86InsertPrefetchPass()
This pass applies profiling information to insert cache prefetches.
LLVM_NODISCARD bool empty() const
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode...
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
StringRef - Represent a constant reference to a string, i.e.
AddrSegmentReg - The operand # of the segment in the memory operand.
Diagnostic information for the sample profiler.
const MachineOperand & getOperand(unsigned i) const
This file provides the interface for the sampled PGO loader pass.
This class contains meta information specific to a module.
int getMemoryOperandNo(uint64_t TSFlags)
getMemoryOperandNo - The function returns the MCInst operand # for the first field of the memory oper...