Skip to content

Commit 5e2fb96

Browse files
[AIEX] Add mechanism to release resources from Scoreboard
1 parent c28f535 commit 5e2fb96

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

Diff for: llvm/lib/Target/AIE/AIEHazardRecognizer.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ FuncUnitWrapper &FuncUnitWrapper::operator|=(const FuncUnitWrapper &Other) {
108108
return *this;
109109
}
110110

111+
FuncUnitWrapper &FuncUnitWrapper::operator^=(const FuncUnitWrapper &Other) {
112+
// XOR operation with the same FuncUnitWrapper will release resources.
113+
Required ^= Other.Required;
114+
Reserved ^= Other.Reserved;
115+
Slots ^= Other.Slots;
116+
MemoryBanks ^= Other.MemoryBanks;
117+
return *this;
118+
}
119+
111120
bool FuncUnitWrapper::conflict(const FuncUnitWrapper &Other) const {
112121
if ((Required & Other.Required) != 0 || (Slots & Other.Slots) != 0 ||
113122
(MemoryBanks & Other.MemoryBanks) != 0 ||
@@ -591,6 +600,18 @@ void AIEHazardRecognizer::emitInScoreboard(
591600
TII->getMemoryCycles(SchedClass), DeltaCycles, FUDepthLimit);
592601
}
593602

603+
void AIEHazardRecognizer::releaseFromScoreboard(
604+
ResourceScoreboard<FuncUnitWrapper> &TheScoreboard, const MCInstrDesc &Desc,
605+
MemoryBankBits MemoryBanks,
606+
iterator_range<const MachineOperand *> MIOperands,
607+
const MachineRegisterInfo &MRI, int DeltaCycles) const {
608+
const unsigned SchedClass = TII->getSchedClass(Desc, MIOperands, MRI);
609+
const SlotBits SlotSet =
610+
getSlotSet(Desc, *TII->getFormatInterface(), IgnoreUnknownSlotSets);
611+
releaseResources(TheScoreboard, ItinData, SchedClass, SlotSet, MemoryBanks,
612+
TII->getMemoryCycles(SchedClass), DeltaCycles, FUDepthLimit);
613+
}
614+
594615
void AIEHazardRecognizer::enterResources(
595616
ResourceScoreboard<FuncUnitWrapper> &Scoreboard,
596617
const InstrItineraryData *ItinData, unsigned SchedClass, SlotBits SlotSet,
@@ -632,6 +653,47 @@ void AIEHazardRecognizer::enterResources(
632653
});
633654
}
634655

656+
void AIEHazardRecognizer::releaseResources(
657+
ResourceScoreboard<FuncUnitWrapper> &Scoreboard,
658+
const InstrItineraryData *ItinData, unsigned SchedClass, SlotBits SlotSet,
659+
MemoryBankBits MemoryBanks, SmallVector<int, 2> MemoryAccessCycles,
660+
int DeltaCycles, std::optional<int> FUDepthLimit) {
661+
assert(Scoreboard.isValidDelta(DeltaCycles));
662+
663+
// Remove slot usage
664+
FuncUnitWrapper EmissionCycle(/*Req=*/0, /*Res=*/0, SlotSet);
665+
Scoreboard[DeltaCycles] ^= EmissionCycle;
666+
667+
// Remove memory bank usage
668+
if (!MemoryAccessCycles.empty()) {
669+
FuncUnitWrapper MemoryBankAccessCycle(/*Req=*/0, /*Res=*/0, /*SlotSet=*/0,
670+
MemoryBanks);
671+
for (int Cycles : MemoryAccessCycles) {
672+
Scoreboard[DeltaCycles + Cycles - 1] ^= MemoryBankAccessCycle;
673+
}
674+
}
675+
676+
int Cycle = DeltaCycles;
677+
Scoreboard[Cycle].IssueCount--;
678+
for (const InstrStage &IS : ItinData->getStages(SchedClass)) {
679+
if (FUDepthLimit && (Cycle - DeltaCycles) >= *FUDepthLimit) {
680+
break;
681+
}
682+
const FuncUnitWrapper ResourceToRelease(IS);
683+
for (unsigned int C = 0; C < IS.getCycles(); ++C) {
684+
Scoreboard[Cycle + C] ^= ResourceToRelease;
685+
}
686+
687+
// Advance the cycle to the next stage.
688+
Cycle += IS.getNextCycles();
689+
}
690+
691+
LLVM_DEBUG({
692+
dbgs() << "Scoreboard after release resources:\n";
693+
Scoreboard.dump();
694+
});
695+
}
696+
635697
unsigned AIEHazardRecognizer::getPipelineDepth() const { return PipelineDepth; }
636698

637699
unsigned AIEHazardRecognizer::getMaxLatency() const { return MaxLatency; }

Diff for: llvm/lib/Target/AIE/AIEHazardRecognizer.h

+16
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class FuncUnitWrapper {
107107
void dump() const;
108108

109109
FuncUnitWrapper &operator|=(const FuncUnitWrapper &Other);
110+
FuncUnitWrapper &operator^=(const FuncUnitWrapper &Other);
110111
bool conflict(const FuncUnitWrapper &Other) const;
111112
};
112113

@@ -178,6 +179,13 @@ class AIEHazardRecognizer : public ScheduleHazardRecognizer {
178179
iterator_range<const MachineOperand *> MIOperands,
179180
const MachineRegisterInfo &MRI, int DeltaCycles);
180181

182+
void releaseFromScoreboard(ResourceScoreboard<FuncUnitWrapper> &Scoreboard,
183+
const MCInstrDesc &Desc,
184+
MemoryBankBits MemoryBanks,
185+
iterator_range<const MachineOperand *> MIOperands,
186+
const MachineRegisterInfo &MRI,
187+
int DeltaCycles) const;
188+
181189
/// Block all scoreboard resources at DeltaCycles
182190
void blockCycleInScoreboard(int DeltaCycle);
183191

@@ -254,6 +262,14 @@ class AIEHazardRecognizer : public ScheduleHazardRecognizer {
254262
SmallVector<int, 2> MemoryAccessCycles,
255263
int DeltaCycles, std::optional<int> FUDepthLimit);
256264

265+
static void releaseResources(ResourceScoreboard<FuncUnitWrapper> &Scoreboard,
266+
const InstrItineraryData *ItinData,
267+
unsigned SchedClass, SlotBits SlotSet,
268+
MemoryBankBits MemoryBanks,
269+
SmallVector<int, 2> MemoryAccessCycles,
270+
int DeltaCycles,
271+
std::optional<int> FUDepthLimit);
272+
257273
private:
258274
ResourceScoreboard<FuncUnitWrapper> Scoreboard;
259275
const AIEBaseInstrInfo *TII;

0 commit comments

Comments
 (0)