[llvm] [TableGen] Add mapping from processor ID to resource index for packetizer (PR #158182)

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 15 23:57:31 PDT 2025


https://github.com/LuoYuanke updated https://github.com/llvm/llvm-project/pull/158182

>From 311a4b845c7405f66227b9e50a7168587ef25d3c Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Thu, 11 Sep 2025 19:57:20 +0800
Subject: [PATCH 1/7] [TableGen] Add mapping from processor ID to resource
 index for packetizer

Tablegen would generate code to access TargetResourceIndices with processor ID.
The TargetProcResourceIndexStart[] array is generated for each processor which
has itineraries. The processor which doesn't has itineraries is excluded from
the array. When a target has mixed processors, the processor ID may exceed the
array size and cause the error.
This patch is to generate a table mapping processor with itineraries to resource
index, so that scheduler can get the correct resource index with processor ID.
---
 llvm/test/TableGen/DFAPacketizer.td          | 31 ++++++++++++++++++++
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 19 +++++++++---
 2 files changed, 46 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/TableGen/DFAPacketizer.td

diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td
new file mode 100644
index 0000000000000..b4c05c63811b5
--- /dev/null
+++ b/llvm/test/TableGen/DFAPacketizer.td
@@ -0,0 +1,31 @@
+// 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<InstrItinData> ItinList = [
+    InstrItinData<OP0, [InstrStage<1, [FU0]>]>,
+    InstrItinData<OP1, [InstrStage<1, [FU1]>]>,
+  ];
+}
+
+// CHECK: std::map<unsigned, unsigned> TestTargetProcIdToResourceIndexStartMapping = {
+// CHECK-NEXT:   { 2,  1 }, // TestItinerariesModel
+// CHECK-NEXT: };
+
+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..0fd30411451a2 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -256,6 +256,16 @@ void DFAPacketizerEmitter::emitForItineraries(
   }
   OS << "\n};\n\n";
 
+  // Output the mapping from proc ID to ResourceIndexStart
+  Idx = 1;
+  OS << "std::map<unsigned, unsigned> " << TargetName << DFAName
+     << "ProcIdToResourceIndexStartMapping = {\n";
+  for (const CodeGenProcModel *Model : ProcModels) {
+    OS << "  { " << Model->Index << ",  " << Idx++ << " }, // "
+       << Model->ModelName << "\n";
+  }
+  OS << "};\n\n";
+
   // And the mapping from Itinerary index into the previous table.
   OS << "constexpr unsigned " << TargetName << DFAName
      << "ProcResourceIndexStart[] = {\n";
@@ -339,16 +349,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<uint64_t> A(ArrayRef<" << TargetAndDFAName
      << "Transition>(" << TargetAndDFAName << "Transitions), "
      << TargetAndDFAName << "TransitionInfo);\n"
+     << "  unsigned Index = " << TargetName << DFAName
+     << "ProcIdToResourceIndexStartMapping[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"

>From 9d25fe752c14616d81b27d757b2ad2d160af5d0b Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Mon, 15 Sep 2025 15:40:22 +0800
Subject: [PATCH 2/7] [TableGen] Address Matt and Haohai's comments

---
 llvm/test/TableGen/DFAPacketizer.td          | 26 ++++++++++--
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 44 +++++++++++++++-----
 2 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td
index b4c05c63811b5..2d7182b907a47 100644
--- a/llvm/test/TableGen/DFAPacketizer.td
+++ b/llvm/test/TableGen/DFAPacketizer.td
@@ -23,9 +23,29 @@ def Itin {
   ];
 }
 
-// CHECK: std::map<unsigned, unsigned> TestTargetProcIdToResourceIndexStartMapping = {
-// CHECK-NEXT:   { 2,  1 }, // TestItinerariesModel
-// CHECK-NEXT: };
+// CHECK:      int TestTargetGetResourceIndex(unsigned ProcID) {
+// CHECK-NEXT:   static const unsigned TestTargetProcIdToProcResourceIdxTable[][2] = {
+// CHECK-NEXT:     { 2,  1 }, // TestItinerariesModel
+// CHECK-NEXT:   };
+// CHECK-NEXT:   unsigned Mid;
+// CHECK-NEXT:   unsigned Start = 0;
+// CHECK-NEXT:   unsigned End = 1;
+// CHECK-NEXT:   while (Start < End) {
+// CHECK-NEXT:   Mid = Start + (End - Start) / 2;
+// CHECK-NEXT:   if (ProcID == TestTargetProcIdToProcResourceIdxTable[Mid][0]) {
+// CHECK-NEXT:     break;
+// CHECK-NEXT:   }
+// CHECK-NEXT:   if (ProcID < TestTargetProcIdToProcResourceIdxTable[Mid][0])
+// CHECK-NEXT:     End = Mid;
+// CHECK-NEXT:   else
+// CHECK-NEXT:     Start = Mid + 1;
+// CHECK-NEXT:   }
+// CHECK-NEXT:   if (Start == End)
+// CHECK-NEXT:     return -1; // Didn't find
+// CHECK-NEXT:   return TestTargetProcIdToProcResourceIdxTable[Mid][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 0fd30411451a2..b7fdf05a7e544 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -256,16 +256,6 @@ void DFAPacketizerEmitter::emitForItineraries(
   }
   OS << "\n};\n\n";
 
-  // Output the mapping from proc ID to ResourceIndexStart
-  Idx = 1;
-  OS << "std::map<unsigned, unsigned> " << TargetName << DFAName
-     << "ProcIdToResourceIndexStartMapping = {\n";
-  for (const CodeGenProcModel *Model : ProcModels) {
-    OS << "  { " << Model->Index << ",  " << Idx++ << " }, // "
-       << Model->ModelName << "\n";
-  }
-  OS << "};\n\n";
-
   // And the mapping from Itinerary index into the previous table.
   OS << "constexpr unsigned " << TargetName << DFAName
      << "ProcResourceIndexStart[] = {\n";
@@ -276,6 +266,38 @@ 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"
+     << "  unsigned Mid;\n"
+     << "  unsigned Start = 0;\n"
+     << "  unsigned End = " << ProcModels.size() << ";\n"
+     << "  while (Start < End) {\n"
+     << "  Mid = Start + (End - Start) / 2;\n"
+     << "  if (ProcID == " << TargetName << DFAName
+     << "ProcIdToProcResourceIdxTable[Mid][0]) {\n"
+     << "    break;\n"
+     << "  }\n"
+     << "  if (ProcID < " << TargetName << DFAName
+     << "ProcIdToProcResourceIdxTable[Mid][0])\n"
+     << "    End = Mid;\n"
+     << "  else\n"
+     << "    Start = Mid + 1;\n"
+     << "  }\n"
+     << "  if (Start == End)\n"
+     << "    return -1; // Didn't find\n"
+     << "  return " << TargetName << DFAName
+     << "ProcIdToProcResourceIdxTable[Mid][1];\n"
+     << "}\n\n";
+
   // The type of a state in the nondeterministic automaton we're defining.
   using NfaStateTy = uint64_t;
 
@@ -355,7 +377,7 @@ void DFAPacketizerEmitter::emitForItineraries(
      << "Transition>(" << TargetAndDFAName << "Transitions), "
      << TargetAndDFAName << "TransitionInfo);\n"
      << "  unsigned Index = " << TargetName << DFAName
-     << "ProcIdToResourceIndexStartMapping[IID->SchedModel.ProcID];\n"
+     << "GetResourceIndex(IID->SchedModel.ProcID);\n"
      << "  unsigned ProcResIdxStart = " << TargetAndDFAName
      << "ProcResourceIndexStart[Index];\n"
      << "  unsigned ProcResIdxNum = " << TargetAndDFAName

>From 26ac7b634050cce4f825654f8946a70828fe7741 Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Mon, 15 Sep 2025 19:11:34 +0800
Subject: [PATCH 3/7] [TableGen] Address Haohai's comments

---
 llvm/test/TableGen/DFAPacketizer.td          | 21 ++++-------------
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 24 ++++----------------
 2 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td
index 2d7182b907a47..dd3b08ef4d77d 100644
--- a/llvm/test/TableGen/DFAPacketizer.td
+++ b/llvm/test/TableGen/DFAPacketizer.td
@@ -27,22 +27,11 @@ def Itin {
 // CHECK-NEXT:   static const unsigned TestTargetProcIdToProcResourceIdxTable[][2] = {
 // CHECK-NEXT:     { 2,  1 }, // TestItinerariesModel
 // CHECK-NEXT:   };
-// CHECK-NEXT:   unsigned Mid;
-// CHECK-NEXT:   unsigned Start = 0;
-// CHECK-NEXT:   unsigned End = 1;
-// CHECK-NEXT:   while (Start < End) {
-// CHECK-NEXT:   Mid = Start + (End - Start) / 2;
-// CHECK-NEXT:   if (ProcID == TestTargetProcIdToProcResourceIdxTable[Mid][0]) {
-// CHECK-NEXT:     break;
-// CHECK-NEXT:   }
-// CHECK-NEXT:   if (ProcID < TestTargetProcIdToProcResourceIdxTable[Mid][0])
-// CHECK-NEXT:     End = Mid;
-// CHECK-NEXT:   else
-// CHECK-NEXT:     Start = Mid + 1;
-// CHECK-NEXT:   }
-// CHECK-NEXT:   if (Start == End)
-// CHECK-NEXT:     return -1; // Didn't find
-// CHECK-NEXT:   return TestTargetProcIdToProcResourceIdxTable[Mid][1];
+// CHECK-NEXT:   auto It = std::lower_bound(
+// CHECK-NEXT:       std::begin(TestTargetProcIdToProcResourceIdxTable),
+// CHECK-NEXT:       std::end(TestTargetProcIdToProcResourceIdxTable), ProcID,
+// CHECK-NEXT:       [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; });
+// CHECK-NEXT:   return (*It)[1];
 // CHECK-NEXT: }
 
 // CHECK:  unsigned Index = TestTargetGetResourceIndex(IID->SchedModel.ProcID);
diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
index b7fdf05a7e544..c8816423cf34b 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -277,25 +277,11 @@ void DFAPacketizerEmitter::emitForItineraries(
        << Model->ModelName << "\n";
   }
   OS << "  };\n"
-     << "  unsigned Mid;\n"
-     << "  unsigned Start = 0;\n"
-     << "  unsigned End = " << ProcModels.size() << ";\n"
-     << "  while (Start < End) {\n"
-     << "  Mid = Start + (End - Start) / 2;\n"
-     << "  if (ProcID == " << TargetName << DFAName
-     << "ProcIdToProcResourceIdxTable[Mid][0]) {\n"
-     << "    break;\n"
-     << "  }\n"
-     << "  if (ProcID < " << TargetName << DFAName
-     << "ProcIdToProcResourceIdxTable[Mid][0])\n"
-     << "    End = Mid;\n"
-     << "  else\n"
-     << "    Start = Mid + 1;\n"
-     << "  }\n"
-     << "  if (Start == End)\n"
-     << "    return -1; // Didn't find\n"
-     << "  return " << TargetName << DFAName
-     << "ProcIdToProcResourceIdxTable[Mid][1];\n"
+     << "  auto It = std::lower_bound(\n"
+     << "      std::begin(" << TargetName << DFAName << "ProcIdToProcResourceIdxTable),\n"
+     << "      std::end(" << TargetName << DFAName << "ProcIdToProcResourceIdxTable), ProcID,\n"
+     << "      [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; });\n"
+     << "  return (*It)[1];\n"
      << "}\n\n";
 
   // The type of a state in the nondeterministic automaton we're defining.

>From 64e6793b267fed8c9ef0b729f15d62dac607e20c Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Mon, 15 Sep 2025 19:37:26 +0800
Subject: [PATCH 4/7] [TableGen] Fix clang format issue

---
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
index c8816423cf34b..a6b48bc4d2740 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -278,9 +278,12 @@ void DFAPacketizerEmitter::emitForItineraries(
   }
   OS << "  };\n"
      << "  auto It = std::lower_bound(\n"
-     << "      std::begin(" << TargetName << DFAName << "ProcIdToProcResourceIdxTable),\n"
-     << "      std::end(" << TargetName << DFAName << "ProcIdToProcResourceIdxTable), ProcID,\n"
-     << "      [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; });\n"
+     << "      std::begin(" << TargetName << DFAName
+     << "ProcIdToProcResourceIdxTable),\n"
+     << "      std::end(" << TargetName << DFAName
+     << "ProcIdToProcResourceIdxTable), ProcID,\n"
+     << "      [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; "
+        "});\n"
      << "  return (*It)[1];\n"
      << "}\n\n";
 

>From a04ae2333f330d898921f633b671b39875a106dc Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Tue, 16 Sep 2025 10:05:34 +0800
Subject: [PATCH 5/7] [TableGen] Address Haohai's comments

---
 llvm/test/TableGen/DFAPacketizer.td          | 1 +
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 1 +
 2 files changed, 2 insertions(+)

diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td
index dd3b08ef4d77d..2aec6f54c1ccc 100644
--- a/llvm/test/TableGen/DFAPacketizer.td
+++ b/llvm/test/TableGen/DFAPacketizer.td
@@ -31,6 +31,7 @@ def Itin {
 // CHECK-NEXT:       std::begin(TestTargetProcIdToProcResourceIdxTable),
 // CHECK-NEXT:       std::end(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: }
 
diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
index a6b48bc4d2740..ba6ceb2dc8166 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -284,6 +284,7 @@ void DFAPacketizerEmitter::emitForItineraries(
      << "ProcIdToProcResourceIdxTable), ProcID,\n"
      << "      [](const unsigned LHS[], unsigned Val) { return LHS[0] < Val; "
         "});\n"
+     << "  assert(*It[0] == ProcID);\n"
      << "  return (*It)[1];\n"
      << "}\n\n";
 

>From 409b19f5645946d3c5fe7017b7b3096785d175e5 Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Tue, 16 Sep 2025 14:37:21 +0800
Subject: [PATCH 6/7] [Packetizer] Fix lit test failure

---
 llvm/lib/Target/AMDGPU/R600Packetizer.cpp | 5 +++++
 1 file changed, 5 insertions(+)

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<MachineLoopInfoWrapperPass>().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);
 

>From 65159da8ca740c055c49456fc39792c1331589ed Mon Sep 17 00:00:00 2001
From: Yuanke Luo <ykluo at birentech.com>
Date: Tue, 16 Sep 2025 14:55:54 +0800
Subject: [PATCH 7/7] [TableGen] Address Haohai's comments

---
 llvm/test/TableGen/DFAPacketizer.td          | 4 +---
 llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 7 ++-----
 2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/llvm/test/TableGen/DFAPacketizer.td b/llvm/test/TableGen/DFAPacketizer.td
index 2aec6f54c1ccc..6237bfbea9a0f 100644
--- a/llvm/test/TableGen/DFAPacketizer.td
+++ b/llvm/test/TableGen/DFAPacketizer.td
@@ -27,9 +27,7 @@ def Itin {
 // CHECK-NEXT:   static const unsigned TestTargetProcIdToProcResourceIdxTable[][2] = {
 // CHECK-NEXT:     { 2,  1 }, // TestItinerariesModel
 // CHECK-NEXT:   };
-// CHECK-NEXT:   auto It = std::lower_bound(
-// CHECK-NEXT:       std::begin(TestTargetProcIdToProcResourceIdxTable),
-// CHECK-NEXT:       std::end(TestTargetProcIdToProcResourceIdxTable), ProcID,
+// 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];
diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
index ba6ceb2dc8166..1bf4c7a8fd80a 100644
--- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
+++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp
@@ -277,11 +277,8 @@ void DFAPacketizerEmitter::emitForItineraries(
        << Model->ModelName << "\n";
   }
   OS << "  };\n"
-     << "  auto It = std::lower_bound(\n"
-     << "      std::begin(" << TargetName << DFAName
-     << "ProcIdToProcResourceIdxTable),\n"
-     << "      std::end(" << TargetName << DFAName
-     << "ProcIdToProcResourceIdxTable), ProcID,\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"



More information about the llvm-commits mailing list