diff --git a/llvm/lib/Target/AMDGPU/R600Packetizer.cpp b/llvm/lib/Target/AMDGPU/R600Packetizer.cpp index c1ed176ed29d2..301cb21a808f8 100644 --- a/llvm/lib/Target/AMDGPU/R600Packetizer.cpp +++ b/llvm/lib/Target/AMDGPU/R600Packetizer.cpp @@ -319,6 +319,11 @@ bool R600Packetizer::runOnMachineFunction(MachineFunction &Fn) { MachineLoopInfo &MLI = getAnalysis().getLI(); + const InstrItineraryData *II = ST.getInstrItineraryData(); + // If there is no itineraries information, abandon. + if (II->Itineraries == nullptr) + return false; + // Instantiate the packetizer. R600PacketizerList Packetizer(Fn, ST, MLI); diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td new file mode 100644 index 0000000000000..6237bfbea9a0f --- /dev/null +++ b/llvm/test/TableGen/DFAPacketizer.td @@ -0,0 +1,39 @@ +// RUN: llvm-tblgen -gen-dfa-packetizer -I %p/../../include %s | FileCheck %s + +include "llvm/Target/Target.td" + +def TestTarget : Target; + +def TestSchedModel : SchedMachineModel { + let CompleteModel = 0; +} + +def TestProcessor1 : ProcessorModel<"testprocessor1", TestSchedModel, []>; + +def FU0 : FuncUnit; +def FU1 : FuncUnit; + +def OP0 : InstrItinClass; +def OP1 : InstrItinClass; + +def Itin { + list ItinList = [ + InstrItinData]>, + InstrItinData]>, + ]; +} + +// CHECK: int TestTargetGetResourceIndex(unsigned ProcID) { +// CHECK-NEXT: static const unsigned TestTargetProcIdToProcResourceIdxTable[][2] = { +// CHECK-NEXT: { 2, 1 }, // TestItinerariesModel +// CHECK-NEXT: }; +// CHECK-NEXT: auto It = llvm::lower_bound(TestTargetProcIdToProcResourceIdxTable, ProcID, +// CHECK-NEXT: [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; }); +// CHECK-NEXT: assert(*It[0] == ProcID); +// CHECK-NEXT: return (*It)[1]; +// CHECK-NEXT: } + +// CHECK: unsigned Index = TestTargetGetResourceIndex(IID->SchedModel.ProcID); + +def TestItineraries: ProcessorItineraries<[], [], Itin.ItinList>; +def TestProcessor2 : Processor<"testprocessor2", TestItineraries, []>; diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp index 8cb2c22736f8a..1bf4c7a8fd80a 100644 --- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp +++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp @@ -266,6 +266,25 @@ void DFAPacketizerEmitter::emitForItineraries( } OS << " " << ScheduleClasses.size() << "\n};\n\n"; + // Output the mapping from proc ID to ResourceIndexStart + Idx = 1; + OS << "int " << TargetName << DFAName + << "GetResourceIndex(unsigned ProcID) { \n" + << " static const unsigned " << TargetName << DFAName + << "ProcIdToProcResourceIdxTable[][2] = {\n"; + for (const CodeGenProcModel *Model : ProcModels) { + OS << " { " << Model->Index << ", " << Idx++ << " }, // " + << Model->ModelName << "\n"; + } + OS << " };\n" + << " auto It = llvm::lower_bound(" << TargetName << DFAName + << "ProcIdToProcResourceIdxTable, ProcID,\n" + << " [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; " + "});\n" + << " assert(*It[0] == ProcID);\n" + << " return (*It)[1];\n" + << "}\n\n"; + // The type of a state in the nondeterministic automaton we're defining. using NfaStateTy = uint64_t; @@ -339,16 +358,17 @@ void DFAPacketizerEmitter::emitForItineraries( std::string SubTargetClassName = TargetName + "GenSubtargetInfo"; OS << "namespace llvm {\n"; - OS << "DFAPacketizer *" << SubTargetClassName << "::" - << "create" << DFAName + OS << "DFAPacketizer *" << SubTargetClassName << "::" << "create" << DFAName << "DFAPacketizer(const InstrItineraryData *IID) const {\n" << " static Automaton A(ArrayRef<" << TargetAndDFAName << "Transition>(" << TargetAndDFAName << "Transitions), " << TargetAndDFAName << "TransitionInfo);\n" + << " unsigned Index = " << TargetName << DFAName + << "GetResourceIndex(IID->SchedModel.ProcID);\n" << " unsigned ProcResIdxStart = " << TargetAndDFAName - << "ProcResourceIndexStart[IID->SchedModel.ProcID];\n" + << "ProcResourceIndexStart[Index];\n" << " unsigned ProcResIdxNum = " << TargetAndDFAName - << "ProcResourceIndexStart[IID->SchedModel.ProcID + 1] - " + << "ProcResourceIndexStart[Index + 1] - " "ProcResIdxStart;\n" << " return new DFAPacketizer(IID, A, {&" << TargetAndDFAName << "ResourceIndices[ProcResIdxStart], ProcResIdxNum});\n"