@@ -61,7 +61,8 @@ void FuncUnitWrapper::setFormatInterface(const AIEBaseMCFormats *Formats) {
6161
6262bool FuncUnitWrapper::operator ==(const FuncUnitWrapper &Other) const {
6363 return Required == Other.Required && Reserved == Other.Reserved &&
64- Slots == Other.Slots && MemoryBanks == Other.MemoryBanks &&
64+ Slots == Other.Slots && Conflicts == Other.Conflicts &&
65+ MemoryBanks == Other.MemoryBanks &&
6566 MemObjectsBits == Other.MemObjectsBits ;
6667}
6768
@@ -95,6 +96,7 @@ void FuncUnitWrapper::clearResources() {
9596 Required.clear ();
9697 Reserved.clear ();
9798 Slots = 0 ;
99+ Conflicts = 0 ;
98100 MemoryBanks = 0 ;
99101 MemObjectsBits = 0 ;
100102}
@@ -117,6 +119,7 @@ FuncUnitWrapper &FuncUnitWrapper::operator|=(const FuncUnitWrapper &Other) {
117119 Required |= Other.Required ;
118120 Reserved |= Other.Reserved ;
119121 Slots |= Other.Slots ;
122+ Conflicts |= Other.Conflicts ;
120123 MemoryBanks |= Other.MemoryBanks ;
121124 MemObjectsBits |= Other.MemObjectsBits ;
122125 return *this ;
@@ -125,6 +128,7 @@ FuncUnitWrapper &FuncUnitWrapper::operator|=(const FuncUnitWrapper &Other) {
125128bool FuncUnitWrapper::conflict (const FuncUnitWrapper &Other) const {
126129 if ((Slots & Other.Slots ) != 0 || (MemoryBanks & Other.MemoryBanks ) != 0 ||
127130 (MemObjectsBits & Other.MemObjectsBits ) != 0 ||
131+ (Conflicts & Other.Slots ) != 0 || (Slots & Other.Conflicts ) != 0 ||
128132 Required.overlap (Other.Required ) || Reserved.overlap (Other.Required ) ||
129133 Required.overlap (Other.Reserved )) {
130134
@@ -482,6 +486,15 @@ static SlotBits getSlotSet(const MCInstrDesc &Desc,
482486 return IgnoreUnkownSlotSets ? 0 : ~0 ;
483487}
484488
489+ static SlotBits getConflictSet (const MCInstrDesc &Desc,
490+ const AIEBaseMCFormats &Formats) {
491+ MCSlotKind SlotKind = Formats.getSlotKind (Desc.getOpcode ());
492+ if (SlotKind != MCSlotKind ())
493+ return Formats.getSlotInfo (SlotKind)->getConflictSet ();
494+
495+ return 0 ;
496+ }
497+
485498namespace {
486499auto toHazardType (bool Conflict) {
487500 return Conflict ? ScheduleHazardRecognizer::NoopHazard
@@ -525,8 +538,9 @@ ScheduleHazardRecognizer::HazardType AIEHazardRecognizer::getHazardType(
525538 return toHazardType (checkConflict (
526539 TheScoreboard, ItinData, SchedClass,
527540 getSlotSet (Desc, *TII->getFormatInterface (), IgnoreUnknownSlotSets),
528- MemoryBanks, MemObjectsBits, TII->getMemoryCycles (SchedClass),
529- DeltaCycles, FUDepthLimit));
541+ getConflictSet (Desc, *TII->getFormatInterface ()), MemoryBanks,
542+ MemObjectsBits, TII->getMemoryCycles (SchedClass), DeltaCycles,
543+ FUDepthLimit));
530544}
531545
532546bool AIEHazardRecognizer::checkConflict (
@@ -540,25 +554,28 @@ bool AIEHazardRecognizer::checkConflict(
540554 return checkConflict (
541555 Scoreboard, ItinData, SchedClass,
542556 getSlotSet (Desc, *TII->getFormatInterface (), IgnoreUnknownSlotSets),
543- MemoryBanks, MemObjectsBits, TII->getMemoryCycles (SchedClass),
544- DeltaCycles, std::nullopt );
557+ getConflictSet (Desc, *TII->getFormatInterface ()), MemoryBanks,
558+ MemObjectsBits, TII->getMemoryCycles (SchedClass), DeltaCycles,
559+ std::nullopt );
545560}
546561
547562bool AIEHazardRecognizer::checkConflict (
548563 const ResourceScoreboard<FuncUnitWrapper> &Scoreboard,
549564 const InstrItineraryData *ItinData, unsigned SchedClass, SlotBits SlotSet,
550- MemoryBankBits MemoryBanks, MemoryObjectsBits MemObjectsBits ,
551- SmallVector<int , 2 > MemoryAccessCycles, int DeltaCycles ,
552- std::optional<int > FUDepthLimit) {
565+ SlotBits ConflictSet, MemoryBankBits MemoryBanks ,
566+ MemoryObjectsBits MemObjectsBits, SmallVector<int , 2 > MemoryAccessCycles,
567+ int DeltaCycles, std::optional<int > FUDepthLimit) {
553568
554569 // Verify format hazards
555- FuncUnitWrapper EmissionCycle (SlotSet);
570+ FuncUnitWrapper EmissionCycle (SlotSet, ConflictSet );
556571 if (EmissionCycle.conflict (Scoreboard[DeltaCycles]))
557572 return true ;
558573
559574 // Verify memory bank and shared object hazards
560575 if (!MemoryAccessCycles.empty ()) {
561- FuncUnitWrapper MemoryAccessCycle (/* SlotSet=*/ 0 , MemoryBanks,
576+ const SlotBits Slots = 0 ;
577+ const SlotBits Conflicts = 0 ;
578+ FuncUnitWrapper MemoryAccessCycle (Slots, Conflicts, MemoryBanks,
562579 MemObjectsBits);
563580
564581 for (auto Cycles : MemoryAccessCycles) {
@@ -644,13 +661,16 @@ void AIEHazardRecognizer::enterResources(
644661 std::optional<int > FUDepthLimit) {
645662
646663 // Append slot usage
647- FuncUnitWrapper EmissionCycle (SlotSet);
664+ const SlotBits Conflicts = 0 ;
665+ FuncUnitWrapper EmissionCycle (SlotSet, Conflicts);
648666 Scoreboard[DeltaCycles] |= EmissionCycle;
649667
650668 // Append memory bank usage
651669 if (!MemoryAccessCycles.empty ()) {
670+ const SlotBits Slots = 0 ;
671+ const SlotBits Conflicts = 0 ;
652672 FuncUnitWrapper MemoryBankAndObjectsAccessCycle (
653- /* SlotSet= */ 0 , MemoryBanks, MemObjectsBits);
673+ Slots, Conflicts , MemoryBanks, MemObjectsBits);
654674 for (auto Cycles : MemoryAccessCycles) {
655675 assert (Scoreboard.isInRange (DeltaCycles + Cycles - 1 ));
656676 Scoreboard[DeltaCycles + Cycles - 1 ] |= MemoryBankAndObjectsAccessCycle;
0 commit comments