diff --git a/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h b/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h --- a/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h +++ b/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h @@ -16,6 +16,7 @@ #define LLVM_CODEGEN_SCOREBOARDHAZARDRECOGNIZER_H #include "llvm/CodeGen/ScheduleHazardRecognizer.h" +#include "llvm/MC/MCInstrItineraries.h" #include #include #include @@ -37,7 +38,7 @@ // bottom-up scheduler, then the scoreboard cycles are the inverse of the // scheduler's cycles. class Scoreboard { - unsigned *Data = nullptr; + InstrStage::FuncUnits *Data = nullptr; // The maximum number of cycles monitored by the Scoreboard. This // value is determined based on the target itineraries to ensure @@ -56,7 +57,7 @@ size_t getDepth() const { return Depth; } - unsigned& operator[](size_t idx) const { + InstrStage::FuncUnits& operator[](size_t idx) const { // Depth is expected to be a power-of-2. assert(Depth && !(Depth & (Depth - 1)) && "Scoreboard was not initialized properly!"); @@ -67,7 +68,7 @@ void reset(size_t d = 1) { if (!Data) { Depth = d; - Data = new unsigned[Depth]; + Data = new InstrStage::FuncUnits[Depth]; } memset(Data, 0, Depth * sizeof(Data[0])); diff --git a/llvm/include/llvm/MC/MCInstrItineraries.h b/llvm/include/llvm/MC/MCInstrItineraries.h --- a/llvm/include/llvm/MC/MCInstrItineraries.h +++ b/llvm/include/llvm/MC/MCInstrItineraries.h @@ -61,8 +61,11 @@ Reserved = 1 }; + /// Bitmask representing a set of functional units. + typedef uint64_t FuncUnits; + unsigned Cycles_; ///< Length of stage in machine cycles - unsigned Units_; ///< Choice of functional units + FuncUnits Units_; ///< Choice of functional units int NextCycles_; ///< Number of machine cycles to next stage ReservationKinds Kind_; ///< Kind of the FU reservation @@ -72,7 +75,7 @@ } /// Returns the choice of FUs. - unsigned getUnits() const { + FuncUnits getUnits() const { return Units_; } diff --git a/llvm/lib/CodeGen/MachinePipeliner.cpp b/llvm/lib/CodeGen/MachinePipeliner.cpp --- a/llvm/lib/CodeGen/MachinePipeliner.cpp +++ b/llvm/lib/CodeGen/MachinePipeliner.cpp @@ -909,7 +909,7 @@ struct FuncUnitSorter { const InstrItineraryData *InstrItins; const MCSubtargetInfo *STI; - DenseMap Resources; + DenseMap Resources; FuncUnitSorter(const TargetSubtargetInfo &TSI) : InstrItins(TSI.getInstrItineraryData()), STI(&TSI) {} @@ -917,14 +917,15 @@ // Compute the number of functional unit alternatives needed // at each stage, and take the minimum value. We prioritize the // instructions by the least number of choices first. - unsigned minFuncUnits(const MachineInstr *Inst, unsigned &F) const { + unsigned minFuncUnits(const MachineInstr *Inst, + InstrStage::FuncUnits &F) const { unsigned SchedClass = Inst->getDesc().getSchedClass(); unsigned min = UINT_MAX; if (InstrItins && !InstrItins->isEmpty()) { for (const InstrStage &IS : make_range(InstrItins->beginStage(SchedClass), InstrItins->endStage(SchedClass))) { - unsigned funcUnits = IS.getUnits(); + InstrStage::FuncUnits funcUnits = IS.getUnits(); unsigned numAlternatives = countPopulation(funcUnits); if (numAlternatives < min) { min = numAlternatives; @@ -970,7 +971,7 @@ for (const InstrStage &IS : make_range(InstrItins->beginStage(SchedClass), InstrItins->endStage(SchedClass))) { - unsigned FuncUnits = IS.getUnits(); + InstrStage::FuncUnits FuncUnits = IS.getUnits(); if (countPopulation(FuncUnits) == 1) Resources[FuncUnits]++; } @@ -998,7 +999,7 @@ /// Return true if IS1 has less priority than IS2. bool operator()(const MachineInstr *IS1, const MachineInstr *IS2) const { - unsigned F1 = 0, F2 = 0; + InstrStage::FuncUnits F1 = 0, F2 = 0; unsigned MFUs1 = minFuncUnits(IS1, F1); unsigned MFUs2 = minFuncUnits(IS2, F2); if (MFUs1 == MFUs2) diff --git a/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp b/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp --- a/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp +++ b/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp @@ -92,10 +92,11 @@ last--; for (unsigned i = 0; i <= last; i++) { - unsigned FUs = (*this)[i]; + InstrStage::FuncUnits FUs = (*this)[i]; dbgs() << "\t"; - for (int j = 31; j >= 0; j--) - dbgs() << ((FUs & (1 << j)) ? '1' : '0'); + for (int j = std::numeric_limits::digits - 1; + j >= 0; j--) + dbgs() << ((FUs & (1ULL << j)) ? '1' : '0'); dbgs() << '\n'; } } @@ -142,7 +143,7 @@ break; } - unsigned freeUnits = IS->getUnits(); + InstrStage::FuncUnits freeUnits = IS->getUnits(); switch (IS->getReservationKind()) { case InstrStage::Required: // Required FUs conflict with both reserved and required ones @@ -193,7 +194,7 @@ assert(((cycle + i) < RequiredScoreboard.getDepth()) && "Scoreboard depth exceeded!"); - unsigned freeUnits = IS->getUnits(); + InstrStage::FuncUnits freeUnits = IS->getUnits(); switch (IS->getReservationKind()) { case InstrStage::Required: // Required FUs conflict with both reserved and required ones @@ -206,7 +207,7 @@ } // reduce to a single unit - unsigned freeUnit = 0; + InstrStage::FuncUnits freeUnit = 0; do { freeUnit = freeUnits; freeUnits = freeUnit & (freeUnit - 1); diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h @@ -465,7 +465,7 @@ short getRegForm(const MachineInstr &MI) const; unsigned getSize(const MachineInstr &MI) const; uint64_t getType(const MachineInstr &MI) const; - unsigned getUnits(const MachineInstr &MI) const; + InstrStage::FuncUnits getUnits(const MachineInstr &MI) const; MachineBasicBlock::instr_iterator expandVGatherPseudo(MachineInstr &MI) const; diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -4485,7 +4485,7 @@ return (F >> HexagonII::TypePos) & HexagonII::TypeMask; } -unsigned HexagonInstrInfo::getUnits(const MachineInstr &MI) const { +InstrStage::FuncUnits HexagonInstrInfo::getUnits(const MachineInstr &MI) const { const InstrItineraryData &II = *Subtarget.getInstrItineraryData(); const InstrStage &IS = *II.beginStage(MI.getDesc().getSchedClass()); diff --git a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp --- a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp +++ b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp @@ -1060,8 +1060,7 @@ // we ignore the instruction. const MCInstrDesc& TID = MI.getDesc(); auto *IS = ResourceTracker->getInstrItins()->beginStage(TID.getSchedClass()); - unsigned FuncUnits = IS->getUnits(); - return !FuncUnits; + return !IS->getUnits(); } bool HexagonPacketizerList::isSoloInstruction(const MachineInstr &MI) { diff --git a/llvm/utils/TableGen/SubtargetEmitter.cpp b/llvm/utils/TableGen/SubtargetEmitter.cpp --- a/llvm/utils/TableGen/SubtargetEmitter.cpp +++ b/llvm/utils/TableGen/SubtargetEmitter.cpp @@ -396,8 +396,8 @@ << "namespace " << Name << "FU {\n"; for (unsigned j = 0, FUN = FUs.size(); j < FUN; ++j) - OS << " const unsigned " << FUs[j]->getName() - << " = 1 << " << j << ";\n"; + OS << " const InstrStage::FuncUnits " << FUs[j]->getName() + << " = 1ULL << " << j << ";\n"; OS << "} // end namespace " << Name << "FU\n";