38#define DEBUG_TYPE "machine-trace-metrics"
60 "Machine Trace Metrics",
false,
true)
78 TII = ST.getInstrInfo();
79 TRI = ST.getRegisterInfo();
89 MTM.
init(MF, getAnalysis<MachineLoopInfoWrapperPass>().getLI());
98 for (
auto &E : Ensembles)
125 for (
const auto &
MI : *
MBB) {
126 if (
MI.isTransient())
142 assert(PI->ProcResourceIdx < PRKinds &&
"Bad processor resource kind");
143 PRCycles[PI->ProcResourceIdx] += PI->ReleaseAtCycle;
150 for (
unsigned K = 0; K != PRKinds; ++K)
151 ProcReleaseAtCycles[PROffset + K] =
159 assert(BlockInfo[MBBNum].hasResources() &&
160 "getResources() must be called before getProcReleaseAtCycles()");
162 assert((MBBNum+1) * PRKinds <= ProcReleaseAtCycles.
size());
163 return ArrayRef(ProcReleaseAtCycles.
data() + MBBNum * PRKinds, PRKinds);
172 BlockInfo.resize(
MTM.BlockInfo.size());
174 ProcResourceDepths.
resize(
MTM.BlockInfo.size() * PRKinds);
175 ProcResourceHeights.
resize(
MTM.BlockInfo.size() * PRKinds);
183 return MTM.Loops->getLoopFor(
MBB);
188void MachineTraceMetrics::Ensemble::
191 unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
198 std::fill(ProcResourceDepths.begin() + PROffset,
199 ProcResourceDepths.begin() + PROffset + PRKinds, 0);
206 TraceBlockInfo *PredTBI = &BlockInfo[PredNum];
207 assert(PredTBI->hasValidDepth() &&
"Trace above has not been computed yet");
208 const FixedBlockInfo *PredFBI = MTM.getResources(TBI->
Pred);
209 TBI->
InstrDepth = PredTBI->InstrDepth + PredFBI->InstrCount;
210 TBI->
Head = PredTBI->Head;
215 for (
unsigned K = 0; K != PRKinds; ++K)
216 ProcResourceDepths[PROffset + K] = PredPRDepths[K] + PredPRCycles[K];
221void MachineTraceMetrics::Ensemble::
224 unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
228 TBI->InstrHeight = MTM.getResources(
MBB)->InstrCount;
234 llvm::copy(PRCycles, ProcResourceHeights.begin() + PROffset);
240 unsigned SuccNum = TBI->Succ->getNumber();
241 TraceBlockInfo *SuccTBI = &BlockInfo[SuccNum];
242 assert(SuccTBI->hasValidHeight() &&
"Trace below has not been computed yet");
243 TBI->InstrHeight += SuccTBI->InstrHeight;
244 TBI->Tail = SuccTBI->Tail;
248 for (
unsigned K = 0;
K != PRKinds; ++
K)
249 ProcResourceHeights[PROffset + K] = SuccPRHeights[K] + PRCycles[K];
279 unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
280 assert((MBBNum+1) * PRKinds <= ProcResourceDepths.size());
281 return ArrayRef(ProcResourceDepths.data() + MBBNum * PRKinds, PRKinds);
292 unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
293 assert((MBBNum+1) * PRKinds <= ProcResourceHeights.size());
294 return ArrayRef(ProcResourceHeights.data() + MBBNum * PRKinds, PRKinds);
326 const char *
getName()
const override {
return "MinInstr"; }
338 const char *
getName()
const override {
return "Local"; }
361 unsigned CurCount = MTM.getResources(
MBB)->InstrCount;
363 unsigned BestDepth = 0;
366 getDepthResources(Pred);
372 if (!Best ||
Depth < BestDepth) {
387 unsigned BestHeight = 0;
390 if (CurLoop && Succ == CurLoop->
getHeader())
396 getHeightResources(Succ);
402 if (!Best || Height < BestHeight) {
414 "Invalid trace strategy enum");
415 std::unique_ptr<MachineTraceMetrics::Ensemble> &E =
416 Ensembles[
static_cast<size_t>(strategy)];
423 E = std::make_unique<MinInstrCountEnsemble>(MinInstrCountEnsemble(
this));
426 E = std::make_unique<LocalEnsemble>(LocalEnsemble(
this));
437 for (
auto &E : Ensembles)
448 return !PAC.preserved() &&
458 for (
auto &E : Ensembles)
478 bool Downward =
false;
509 if ((LB.Downward ? To : *
From) == FromLoop->getHeader())
518 return LB.Visited.insert(To).second;
529 LoopBounds Bounds(BlockInfo, MTM.Loops);
532 Bounds.Downward =
false;
533 Bounds.Visited.clear();
536 TraceBlockInfo &TBI = BlockInfo[
I->getNumber()];
538 TBI.Pred = pickTracePred(
I);
546 computeDepthResources(
I);
550 Bounds.Downward =
true;
551 Bounds.Visited.clear();
554 TraceBlockInfo &TBI = BlockInfo[
I->getNumber()];
556 TBI.Succ = pickTraceSucc(
I);
564 computeHeightResources(
I);
596 }
while (!WorkList.
empty());
621 }
while (!WorkList.
empty());
629 for (
const auto &
I : *BadMBB)
635 assert(BlockInfo.size() == MTM.MF->getNumBlockIDs() &&
636 "Outdated BlockInfo size");
637 for (
unsigned Num = 0, e = BlockInfo.size(); Num != e; ++Num) {
643 "Trace is broken, depth should have been invalidated.");
651 "Trace is broken, height should have been invalidated.");
655 "Trace contains backedge");
690 assert((++DefI).atEnd() &&
"Register has multiple defs");
702 if (
UseMI.isDebugInstr())
705 bool HasPhysRegs =
false;
712 if (Reg.isPhysical()) {
734 for (
unsigned i = 1; i !=
UseMI.getNumOperands(); i += 2) {
735 if (
UseMI.getOperand(i + 1).getMBB() == Pred) {
753 if (!MO.isReg() || !MO.getReg().isPhysical())
762 }
else if (MO.isKill())
769 if (
I == RegUnits.
end())
771 Deps.
push_back(DataDep(
I->MI,
I->Op, MO.getOperandNo()));
780 RegUnits.
erase(Unit);
783 for (
unsigned DefOp : LiveDefOps) {
804unsigned MachineTraceMetrics::Ensemble::
805computeCrossBlockCriticalPath(
const TraceBlockInfo &TBI) {
806 assert(TBI.HasValidInstrDepths &&
"Missing depth info");
807 assert(TBI.HasValidInstrHeights &&
"Missing height info");
809 for (
const LiveInReg &LIR : TBI.LiveIns) {
810 if (!LIR.Reg.isVirtual())
815 if (!DefTBI.isUsefulDominator(TBI))
817 unsigned Len = LIR.Height + Cycles[
DefMI].Depth;
818 MaxLen = std::max(MaxLen, Len);
835 for (
const DataDep &Dep : Deps) {
837 BlockInfo[Dep.DefMI->getParent()->getNumber()];
842 unsigned DepCycle = Cycles.lookup(Dep.DefMI).Depth;
844 if (!Dep.DefMI->isTransient())
845 DepCycle += MTM.SchedModel
846 .computeOperandLatency(Dep.DefMI, Dep.DefOp, &
UseMI, Dep.UseOp);
872 for (; Start !=
End; Start++)
873 updateDepth(Start->getParent(), *Start, RegUnits);
878void MachineTraceMetrics::Ensemble::
889 Stack.push_back(
MBB);
901 while (!Stack.empty()) {
902 MBB = Stack.pop_back_val();
905 TBI.HasValidInstrDepths =
true;
906 TBI.CriticalPath = 0;
910 dbgs() <<
format(
"%7u Instructions\n", TBI.InstrDepth);
912 for (
unsigned K = 0; K != PRDepths.
size(); ++K)
914 unsigned Factor = MTM.SchedModel.getResourceFactor(K);
915 dbgs() <<
format(
"%6uc @ ", MTM.getCycles(PRDepths[K]))
916 << MTM.SchedModel.getProcResource(K)->Name <<
" ("
917 << PRDepths[K]/Factor <<
" ops x" << Factor <<
")\n";
922 if (TBI.HasValidInstrHeights)
923 TBI.CriticalPath = computeCrossBlockCriticalPath(TBI);
926 updateDepth(TBI,
UseMI, RegUnits);
945 if (!Reg.isPhysical())
955 if (
I == RegUnits.
end())
957 unsigned DepHeight =
I->Cycle;
958 if (!
MI.isTransient()) {
964 Height = std::max(Height, DepHeight);
971 for (
unsigned Op : ReadOps) {
976 if (LRU.
Cycle <= Height && LRU.
MI != &
MI) {
996 if (!Dep.DefMI->isTransient())
1003 std::tie(
I, New) = Heights.
insert(std::make_pair(Dep.DefMI, UseHeight));
1008 if (
I->second < UseHeight)
1009 I->second = UseHeight;
1016void MachineTraceMetrics::Ensemble::
1030 TBI.LiveIns.push_back(Reg);
1037void MachineTraceMetrics::Ensemble::
1044 assert(TBI.hasValidHeight() &&
"Incomplete trace");
1045 if (TBI.HasValidInstrHeights)
1048 TBI.LiveIns.clear();
1066 for (LiveInReg &LI : TBI.LiveIns) {
1067 if (LI.Reg.isVirtual()) {
1069 unsigned &Height = Heights[MTM.MRI->getVRegDef(LI.Reg)];
1070 if (Height < LI.Height)
1075 RegUnits[LI.Reg].Cycle = LI.Height;
1086 TBI.HasValidInstrHeights =
true;
1087 TBI.CriticalPath = 0;
1090 dbgs() <<
format(
"%7u Instructions\n", TBI.InstrHeight);
1092 for (
unsigned K = 0;
K != PRHeights.
size(); ++
K)
1094 unsigned Factor = MTM.SchedModel.getResourceFactor(K);
1095 dbgs() <<
format(
"%6uc @ ", MTM.getCycles(PRHeights[K]))
1096 << MTM.SchedModel.getProcResource(K)->Name <<
" ("
1097 << PRHeights[
K]/Factor <<
" ops x" << Factor <<
")\n";
1112 for (
const auto &
PHI : *Succ) {
1117 if (!Deps.
empty()) {
1119 unsigned Height = TBI.Succ ? Cycles.lookup(&
PHI).Height : 0;
1134 if (HeightI != Heights.
end()) {
1135 Cycle = HeightI->second;
1137 Heights.
erase(HeightI);
1151 for (
const DataDep &Dep : Deps)
1155 InstrCycles &MICycles = Cycles[&
MI];
1156 MICycles.Height =
Cycle;
1157 if (!TBI.HasValidInstrDepths) {
1162 TBI.CriticalPath = std::max(TBI.CriticalPath,
Cycle + MICycles.Depth);
1169 for (LiveInReg &LIR : TBI.LiveIns) {
1177 TBI.LiveIns.push_back(LiveInReg(RU.RegUnit, RU.Cycle));
1183 if (!TBI.HasValidInstrDepths)
1186 TBI.CriticalPath = std::max(TBI.CriticalPath,
1187 computeCrossBlockCriticalPath(TBI));
1188 LLVM_DEBUG(
dbgs() <<
"Critical path: " << TBI.CriticalPath <<
'\n');
1199 computeInstrDepths(
MBB);
1201 computeInstrHeights(
MBB);
1203 return Trace(*
this, TBI);
1208 assert(getBlockNum() ==
unsigned(
MI.getParent()->getNumber()) &&
1209 "MI must be in the trace center block");
1211 return getCriticalPath() - (Cyc.
Depth + Cyc.
Height);
1219 assert(Deps.
size() == 1 &&
"PHI doesn't have MBB as a predecessor");
1220 DataDep &Dep = Deps.
front();
1221 unsigned DepCycle = getInstrCycles(*Dep.DefMI).Depth;
1223 if (!Dep.DefMI->isTransient())
1224 DepCycle += TE.MTM.SchedModel.computeOperandLatency(Dep.DefMI, Dep.DefOp,
1237 for (
unsigned K = 0; K != PRDepths.
size(); ++K)
1238 PRMax = std::max(PRMax, PRDepths[K] + PRCycles[K]);
1240 for (
unsigned PRD : PRDepths)
1241 PRMax = std::max(PRMax, PRD);
1244 PRMax = TE.MTM.getCycles(PRMax);
1247 unsigned Instrs = TBI.InstrDepth;
1250 Instrs += TE.MTM.BlockInfo[getBlockNum()].InstrCount;
1251 if (
unsigned IW = TE.MTM.SchedModel.getIssueWidth())
1254 return std::max(Instrs, PRMax);
1268 unsigned ResourceIdx)
1270 unsigned Cycles = 0;
1275 PI = TE.MTM.SchedModel.getWriteProcResBegin(SC),
1276 PE = TE.MTM.SchedModel.getWriteProcResEnd(SC);
1278 if (PI->ProcResourceIdx != ResourceIdx)
1280 Cycles += (PI->ReleaseAtCycle *
1281 TE.MTM.SchedModel.getResourceFactor(ResourceIdx));
1287 for (
unsigned K = 0; K != PRDepths.
size(); ++K) {
1288 unsigned PRCycles = PRDepths[K] + PRHeights[K];
1290 PRCycles += TE.MTM.getProcReleaseAtCycles(
MBB->
getNumber())[K];
1291 PRCycles += extraCycles(ExtraInstrs, K);
1292 PRCycles -= extraCycles(RemoveInstrs, K);
1293 PRMax = std::max(PRMax, PRCycles);
1296 PRMax = TE.MTM.getCycles(PRMax);
1299 unsigned Instrs = TBI.InstrDepth + TBI.InstrHeight;
1302 Instrs += TE.MTM.getResources(
MBB)->InstrCount;
1303 Instrs += ExtraInstrs.
size();
1304 Instrs -= RemoveInstrs.
size();
1305 if (
unsigned IW = TE.MTM.SchedModel.getIssueWidth())
1308 return std::max(Instrs, PRMax);
1324 for (
unsigned i = 0, e = BlockInfo.size(); i != e; ++i) {
1325 OS <<
" %bb." << i <<
'\t';
1326 BlockInfo[i].print(
OS);
1332 if (hasValidDepth()) {
1333 OS <<
"depth=" << InstrDepth;
1338 OS <<
" head=%bb." << Head;
1339 if (HasValidInstrDepths)
1342 OS <<
"depth invalid";
1344 if (hasValidHeight()) {
1345 OS <<
"height=" << InstrHeight;
1350 OS <<
" tail=%bb." <<
Tail;
1351 if (HasValidInstrHeights)
1354 OS <<
"height invalid";
1355 if (HasValidInstrDepths && HasValidInstrHeights)
1356 OS <<
", crit=" << CriticalPath;
1360 unsigned MBBNum = &TBI - &TE.BlockInfo[0];
1362 OS << TE.getName() <<
" trace %bb." << TBI.Head <<
" --> %bb." << MBBNum
1363 <<
" --> %bb." << TBI.Tail <<
':';
1364 if (TBI.hasValidHeight() && TBI.hasValidDepth())
1365 OS <<
' ' << getInstrCount() <<
" instrs.";
1366 if (TBI.HasValidInstrDepths && TBI.HasValidInstrHeights)
1367 OS <<
' ' << TBI.CriticalPath <<
" cycles.";
1370 OS <<
"\n%bb." << MBBNum;
1371 while (
Block->hasValidDepth() &&
Block->Pred) {
1372 unsigned Num =
Block->Pred->getNumber();
1374 Block = &TE.BlockInfo[Num];
1379 while (
Block->hasValidHeight() &&
Block->Succ) {
1380 unsigned Num =
Block->Succ->getNumber();
1382 Block = &TE.BlockInfo[Num];
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
bbsections Prepares for basic block by splitting functions into clusters of basic blocks
BlockVerifier::State From
COFF::MachineTypes Machine
static unsigned InstrCount
This file defines the DenseMap class.
DenseMap< Block *, BlockRelaxAux > Blocks
unsigned const TargetRegisterInfo * TRI
static bool pushDepHeight(const DataDep &Dep, const MachineInstr &UseMI, unsigned UseHeight, MIHeightMap &Heights, const TargetSchedModel &SchedModel, const TargetInstrInfo *TII)
static void getPHIDeps(const MachineInstr &UseMI, SmallVectorImpl< DataDep > &Deps, const MachineBasicBlock *Pred, const MachineRegisterInfo *MRI)
static bool getDataDeps(const MachineInstr &UseMI, SmallVectorImpl< DataDep > &Deps, const MachineRegisterInfo *MRI)
static void updatePhysDepsDownwards(const MachineInstr *UseMI, SmallVectorImpl< DataDep > &Deps, SparseSet< LiveRegUnit > &RegUnits, const TargetRegisterInfo *TRI)
static unsigned updatePhysDepsUpwards(const MachineInstr &MI, unsigned Height, SparseSet< LiveRegUnit > &RegUnits, const TargetSchedModel &SchedModel, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI)
static bool isExitingLoop(const MachineLoop *From, const MachineLoop *To)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static StringRef getName(Value *V)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the SparseSet class derived from the version described in Briggs,...
This templated class represents "all analyses that operate over <a particular IR unit>" (e....
API to communicate dependencies between analyses during invalidation.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Represents analyses that only rely on functions' control flow.
This class represents an Operation in the Expression.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
A possibly irreducible generalization of a Loop.
BlockT * getHeader() const
Represents a single loop in the control flow graph.
Wrapper class representing physical registers. Should be passed by value.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
bool isPredecessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a predecessor of this block.
iterator_range< succ_iterator > successors()
bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
Register getReg(unsigned Idx) const
Get the register for the operand index.
Representation of each machine instruction.
const MachineBasicBlock * getParent() const
iterator_range< mop_iterator > operands()
const MachineOperand & getOperand(unsigned i) const
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
Register getReg() const
getReg - Returns the register number.
reg_begin/reg_end - Provide iteration support to walk over all definitions and uses of a register wit...
unsigned getOperandNo() const
getOperandNo - Return the operand # of this MachineOperand in its MachineInstr.
bool atEnd() const
atEnd - return true if this iterator is equal to reg_end() on the value.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
MachineTraceMetrics Result
void getAnalysisUsage(AnalysisUsage &) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
bool runOnMachineFunction(MachineFunction &) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
A trace ensemble is a collection of traces selected using the same strategy, for example 'minimum res...
void invalidate(const MachineBasicBlock *MBB)
Invalidate traces through BadMBB.
ArrayRef< unsigned > getProcResourceHeights(unsigned MBBNum) const
Get an array of processor resource heights for MBB.
void updateDepth(TraceBlockInfo &TBI, const MachineInstr &, SparseSet< LiveRegUnit > &RegUnits)
Updates the depth of an machine instruction, given RegUnits.
const MachineLoop * getLoopFor(const MachineBasicBlock *) const
const TraceBlockInfo * getHeightResources(const MachineBasicBlock *) const
void updateDepths(MachineBasicBlock::iterator Start, MachineBasicBlock::iterator End, SparseSet< LiveRegUnit > &RegUnits)
Updates the depth of the instructions from Start to End.
const TraceBlockInfo * getDepthResources(const MachineBasicBlock *) const
ArrayRef< unsigned > getProcResourceDepths(unsigned MBBNum) const
Get an array of processor resource depths for MBB.
Ensemble(MachineTraceMetrics *)
MachineTraceMetrics & MTM
void print(raw_ostream &) const
Trace getTrace(const MachineBasicBlock *MBB)
Get the trace that passes through MBB.
A trace represents a plausible sequence of executed basic blocks that passes through the current basi...
unsigned getResourceLength(ArrayRef< const MachineBasicBlock * > Extrablocks={}, ArrayRef< const MCSchedClassDesc * > ExtraInstrs={}, ArrayRef< const MCSchedClassDesc * > RemoveInstrs={}) const
Return the resource length of the trace.
unsigned getInstrSlack(const MachineInstr &MI) const
Return the slack of MI.
bool isDepInTrace(const MachineInstr &DefMI, const MachineInstr &UseMI) const
A dependence is useful if the basic block of the defining instruction is part of the trace of the use...
unsigned getPHIDepth(const MachineInstr &PHI) const
Return the Depth of a PHI instruction in a trace center block successor.
void print(raw_ostream &) const
unsigned getResourceDepth(bool Bottom) const
Return the resource depth of the top/bottom of the trace center block.
Ensemble * getEnsemble(MachineTraceStrategy)
Get the trace ensemble representing the given trace selection strategy.
void verifyAnalysis() const
void invalidate(const MachineBasicBlock *MBB)
Invalidate cached information about MBB.
const FixedBlockInfo * getResources(const MachineBasicBlock *)
Get the fixed resource information about MBB. Compute it on demand.
ArrayRef< unsigned > getProcReleaseAtCycles(unsigned MBBNum) const
Get the scaled number of cycles used per processor resource in MBB.
void init(MachineFunction &Func, const MachineLoopInfo &LI)
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
SparseSet - Fast set implementation for objects that can be identified by small unsigned keys.
iterator erase(iterator I)
erase - Erases an existing element identified by a valid iterator.
typename DenseT::iterator iterator
const_iterator end() const
void setUniverse(unsigned U)
setUniverse - Set the universe size which determines the largest key the set can hold.
iterator find(const KeyT &Key)
find - Find an element by its key.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Provide an instruction scheduling machine model to CodeGen passes.
ProcResIter getWriteProcResEnd(const MCSchedClassDesc *SC) const
bool hasInstrSchedModel() const
Return true if this machine model includes an instruction-level scheduling model.
unsigned getResourceFactor(unsigned ResIdx) const
Multiply the number of units consumed for a resource by this factor to normalize it relative to other...
const MCSchedClassDesc * resolveSchedClass(const MachineInstr *MI) const
Return the MCSchedClassDesc for this instruction.
void init(const TargetSubtargetInfo *TSInfo)
Initialize the machine model for instruction scheduling.
unsigned computeOperandLatency(const MachineInstr *DefMI, unsigned DefOperIdx, const MachineInstr *UseMI, unsigned UseOperIdx) const
Compute operand latency based on the available machine model.
unsigned getNumProcResourceKinds() const
Get the number of kinds of resources for this target.
ProcResIter getWriteProcResBegin(const MCSchedClassDesc *SC) const
TargetSubtargetInfo - Generic base class for all target subtargets.
bool insertEdge(std::optional< const MachineBasicBlock * > From, const MachineBasicBlock *To)
void finishPostorder(const MachineBasicBlock *)
po_iterator_storage(LoopBounds &lb)
Default po_iterator_storage implementation with an internal set object.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
MachineTraceStrategy
Strategies for selecting traces.
@ TS_MinInstrCount
Select the trace through a block that has the fewest instructions.
@ TS_Local
Select the trace that contains only the current basic block.
iterator_range< po_ext_iterator< T, SetType > > post_order_ext(const T &G, SetType &S)
iterator_range< ipo_ext_iterator< T, SetType > > inverse_post_order_ext(const T &G, SetType &S)
Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
auto reverse(ContainerTy &&C)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
char & MachineTraceMetricsID
MachineTraceMetrics - This pass computes critical path and CPU resource usage in an ensemble of trace...
DWARFExpression::Operation Op
OutputIt copy(R &&Range, OutputIt Out)
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Summarize the scheduling resources required for an instruction of a particular scheduling class.
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Per-basic block information that doesn't depend on the trace through the block.
bool hasResources() const
Returns true when resource information for this block has been computed.
unsigned InstrCount
The number of non-trivial instructions in the block.
bool HasCalls
True when the block contains calls.
InstrCycles represents the cycle height and depth of an instruction in a trace.
unsigned Height
Minimum number of cycles from this instruction is issued to the of the trace, as determined by data d...
unsigned Depth
Earliest issue cycle as determined by data dependencies and instruction latencies from the beginning ...
Per-basic block information that relates to a specific trace through the block.
unsigned InstrDepth
Accumulated number of instructions in the trace above this block.
void invalidateDepth()
Invalidate depth resources when some block above this one has changed.
const MachineBasicBlock * Pred
Trace predecessor, or NULL for the first block in the trace.
unsigned InstrHeight
Accumulated number of instructions in the trace below this block.
const MachineBasicBlock * Succ
Trace successor, or NULL for the last block in the trace.
bool hasValidDepth() const
Returns true if the depth resources have been computed from the trace above this block.
bool isUsefulDominator(const TraceBlockInfo &TBI) const
Assuming that this is a dominator of TBI, determine if it contains useful instruction depths.
void invalidateHeight()
Invalidate height resources when a block below this one has changed.
unsigned CriticalPath
Critical path length.
void print(raw_ostream &) const
unsigned Head
The block number of the head of the trace. (When hasValidDepth()).
bool HasValidInstrDepths
Instruction depths have been computed. This implies hasValidDepth().
bool hasValidHeight() const
Returns true if the height resources have been computed from the trace below this block.
bool HasValidInstrHeights
Instruction heights have been computed. This implies hasValidHeight().