diff options
Diffstat (limited to 'llvm/lib/MCA/HardwareUnits/Scheduler.cpp')
-rw-r--r-- | llvm/lib/MCA/HardwareUnits/Scheduler.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/Scheduler.cpp b/llvm/lib/MCA/HardwareUnits/Scheduler.cpp index 5b2527b886e..9eeea9d0113 100644 --- a/llvm/lib/MCA/HardwareUnits/Scheduler.cpp +++ b/llvm/lib/MCA/HardwareUnits/Scheduler.cpp @@ -92,6 +92,7 @@ void Scheduler::issueInstructionImpl( void Scheduler::issueInstruction( InstRef &IR, SmallVectorImpl<std::pair<ResourceRef, ResourceCycles>> &UsedResources, + SmallVectorImpl<InstRef> &PendingInstructions, SmallVectorImpl<InstRef> &ReadyInstructions) { const Instruction &Inst = *IR.getInstruction(); bool HasDependentUsers = Inst.hasDependentUsers(); @@ -102,7 +103,7 @@ void Scheduler::issueInstruction( // other dependent instructions. Dependent instructions may be issued during // this same cycle if operands have ReadAdvance entries. Promote those // instructions to the ReadySet and notify the caller that those are ready. - if (HasDependentUsers && promoteToPendingSet()) + if (HasDependentUsers && promoteToPendingSet(PendingInstructions)) promoteToReadySet(ReadyInstructions); } @@ -147,7 +148,7 @@ bool Scheduler::promoteToReadySet(SmallVectorImpl<InstRef> &Ready) { return PromotedElements; } -bool Scheduler::promoteToPendingSet() { +bool Scheduler::promoteToPendingSet(SmallVectorImpl<InstRef> &Pending) { // Scan the set of waiting instructions and promote them to the // pending set if operands are all ready. unsigned RemovedElements = 0; @@ -166,6 +167,7 @@ bool Scheduler::promoteToPendingSet() { LLVM_DEBUG(dbgs() << "[SCHEDULER]: Instruction #" << IR << " promoted to the PENDING set.\n"); + Pending.emplace_back(IR); PendingSet.emplace_back(IR); IR.invalidate(); @@ -251,6 +253,7 @@ void Scheduler::analyzeDataDependencies(SmallVectorImpl<InstRef> &RegDeps, void Scheduler::cycleEvent(SmallVectorImpl<ResourceRef> &Freed, SmallVectorImpl<InstRef> &Executed, + SmallVectorImpl<InstRef> &Pending, SmallVectorImpl<InstRef> &Ready) { // Release consumed resources. Resources->cycleEvent(Freed); @@ -265,7 +268,7 @@ void Scheduler::cycleEvent(SmallVectorImpl<ResourceRef> &Freed, for (InstRef &IR : WaitSet) IR.getInstruction()->cycleEvent(); - promoteToPendingSet(); + promoteToPendingSet(Pending); promoteToReadySet(Ready); NumDispatchedToThePendingSet = 0; @@ -299,6 +302,8 @@ bool Scheduler::dispatch(const InstRef &IR) { return false; } + // Memory operations that are not in a ready state are initially assigned to + // the WaitSet. if (!IS.isReady() || (IS.isMemOp() && LSU.isReady(IR) != IR.getSourceIndex())) { LLVM_DEBUG(dbgs() << "[SCHEDULER] Adding #" << IR << " to the WaitSet\n"); |