26 DependentWriteCyclesLeft = Cycles;
27 DependentWrite =
nullptr;
41 if (TotalCycles < Cycles) {
48 if (!DependentWrites) {
49 CyclesLeft = TotalCycles;
50 IsReady = !CyclesLeft;
61 for (
const std::pair<ReadState *, int> &
User : Users) {
63 unsigned ReadCycles = std::max(0, CyclesLeft -
User.second);
77 unsigned ReadCycles = std::max(0, CyclesLeft - ReadAdvance);
78 User->writeStartEvent(IID, RegisterID, ReadCycles);
82 Users.emplace_back(
User, ReadAdvance);
87 User->writeStartEvent(IID, RegisterID, std::max(0, CyclesLeft));
91 assert(!PartialWrite &&
"PartialWrite already set!");
93 User->setDependentWrite(
this);
103 if (DependentWriteCyclesLeft)
104 DependentWriteCyclesLeft--;
109 if (DependentWrites && TotalCycles) {
120 IsReady = !CyclesLeft;
134 <<
", Cycles Left=" << CyclesLeft <<
" }";
139 if (CriticalRegDep.
Cycles)
140 return CriticalRegDep;
142 unsigned MaxLatency = 0;
145 if (WriteCRD.
Cycles > MaxLatency)
146 CriticalRegDep = WriteCRD;
151 if (ReadCRD.
Cycles > MaxLatency)
152 CriticalRegDep = ReadCRD;
155 return CriticalRegDep;
166 CriticalResourceMask = 0;
167 IsEliminated =
false;
172 Stage = IS_DISPATCHED;
173 RCUTokenID = RCUToken;
182 Stage = IS_EXECUTING;
188 WS.onInstructionIssued(IID);
196 assert(
Stage == IS_READY &&
"Invalid internal state!");
219 return Use.isPending() ||
Use.isReady();
225 [](
const WriteState &Def) {
return !Def.getDependentWrite(); }))
255 assert(CyclesLeft &&
"Instruction already executed?");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines abstractions used by the Pipeline to model register reads, register writes and inst...
A Use represents the edge between a Value definition and its users.
SmallVectorImpl< WriteState > & getDefs()
unsigned getLatency() const
void clearOptimizableMove()
SmallVectorImpl< ReadState > & getUses()
LLVM_ABI void cycleEvent()
bool isDispatched() const
LLVM_ABI bool updateDispatched()
LLVM_ABI void forceExecuted()
LLVM_ABI const CriticalDependency & computeCriticalRegDep()
LLVM_ABI void execute(unsigned IID)
LLVM_ABI bool updatePending()
LLVM_ABI void dispatch(unsigned RCUTokenID)
Tracks register operand latency in cycles.
LLVM_ABI void writeStartEvent(unsigned IID, MCPhysReg RegID, unsigned Cycles)
LLVM_ABI void cycleEvent()
MCPhysReg getRegisterID() const
Tracks uses of a register definition (e.g.
LLVM_ABI void writeStartEvent(unsigned IID, MCPhysReg RegID, unsigned Cycles)
unsigned getLatency() const
int getCyclesLeft() const
LLVM_ABI void cycleEvent()
LLVM_ABI void onInstructionIssued(unsigned IID)
MCPhysReg getRegisterID() const
LLVM_ABI void addUser(unsigned IID, ReadState *Use, int ReadAdvance)
constexpr int UNKNOWN_CYCLES
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
A critical data dependency descriptor.