[llvm] [CodeGen][NFC] Store CPU model index in SubTypeKV (PR #207351)

Alexis Engelke via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 5 04:08:50 PDT 2026


https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/207351

>From 409705abf564822ec4b22ea2d13d67cee297a34d Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Fri, 3 Jul 2026 08:40:03 +0000
Subject: [PATCH] [spr] initial version

Created using spr 1.3.8-wip
---
 .../llvm/CodeGen/TargetSubtargetInfo.h        |  3 +-
 llvm/include/llvm/MC/MCSubtargetInfo.h        | 12 +++----
 llvm/lib/CodeGen/TargetSubtargetInfo.cpp      | 11 +++---
 llvm/lib/MC/MCSubtargetInfo.cpp               | 16 ++++-----
 llvm/unittests/CodeGen/MFCommon.inc           |  5 +--
 llvm/unittests/CodeGen/MachineInstrTest.cpp   |  3 +-
 llvm/unittests/CodeGen/MachineOperandTest.cpp |  2 +-
 .../Target/AArch64/AArch64InstPrinterTest.cpp |  2 +-
 llvm/utils/TableGen/Common/CodeGenSchedule.h  |  4 +--
 llvm/utils/TableGen/SubtargetEmitter.cpp      | 34 +++++++++++--------
 10 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h b/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h
index 8b8f64f49b595..8f13b0efaa068 100644
--- a/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h
+++ b/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h
@@ -43,6 +43,7 @@ class LibcallLoweringInfo;
 class MachineInstr;
 struct MachineSchedPolicy;
 struct MCReadAdvanceEntry;
+struct MCSchedModel;
 struct MCWriteLatencyEntry;
 struct MCWriteProcResEntry;
 class RegisterBankInfo;
@@ -70,7 +71,7 @@ class LLVM_ABI TargetSubtargetInfo : public MCSubtargetInfo {
   TargetSubtargetInfo(const Triple &TT, StringRef CPU, StringRef TuneCPU,
                       StringRef FS, ArrayRef<StringRef> PN,
                       ArrayRef<SubtargetFeatureKV> PF,
-                      ArrayRef<SubtargetSubTypeKV> PD,
+                      ArrayRef<SubtargetSubTypeKV> PD, const MCSchedModel *PSM,
                       const MCWriteProcResEntry *WPR,
                       const MCWriteLatencyEntry *WL,
                       const MCReadAdvanceEntry *RA, const InstrStage *IS,
diff --git a/llvm/include/llvm/MC/MCSubtargetInfo.h b/llvm/include/llvm/MC/MCSubtargetInfo.h
index 7f55ab7cd9d89..195bd29dd3ccb 100644
--- a/llvm/include/llvm/MC/MCSubtargetInfo.h
+++ b/llvm/include/llvm/MC/MCSubtargetInfo.h
@@ -68,24 +68,23 @@ struct SubtargetFeatureKV {
 struct SubtargetSubTypeKV {
 private:
   const char *Key; ///< K-V key string
-  const MCSchedModel *SchedModel;
 
 public:
   FeatureBitArray Implies;              ///< K-V bit mask
   FeatureBitArray TuneImplies;          ///< K-V bit mask
+  unsigned SchedModelIdx;
 
   constexpr SubtargetSubTypeKV(const char *Key, FeatureBitArray Implies,
                                FeatureBitArray TuneImplies,
-                               const MCSchedModel *SchedModel)
-      : Key(Key), SchedModel(SchedModel), Implies(Implies),
-        TuneImplies(TuneImplies) {}
+                               unsigned SchedModelIdx)
+      : Key(Key), Implies(Implies), TuneImplies(TuneImplies),
+        SchedModelIdx(SchedModelIdx) {}
 
   // Because of relative string offsets, this type is not copyable.
   SubtargetSubTypeKV(const SubtargetSubTypeKV &) = delete;
   SubtargetSubTypeKV &operator=(const SubtargetSubTypeKV &) = delete;
 
   const char *key() const { return Key; }
-  const MCSchedModel *schedModel() const { return SchedModel; }
 
   /// Compare routine for std::lower_bound
   bool operator<(StringRef S) const { return StringRef(key()) < S; }
@@ -107,6 +106,7 @@ class LLVM_ABI MCSubtargetInfo {
   ArrayRef<StringRef> ProcNames; // Processor list, including aliases
   ArrayRef<SubtargetFeatureKV> ProcFeatures;  // Processor feature list
   ArrayRef<SubtargetSubTypeKV> ProcDesc;  // Processor descriptions
+  const MCSchedModel *ProcSchedModels;    ///< Processor scheduling models.
 
   // Scheduler machine model
   const MCWriteProcResEntry *WriteProcResTable;
@@ -125,7 +125,7 @@ class LLVM_ABI MCSubtargetInfo {
   MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef TuneCPU,
                   StringRef FS, ArrayRef<StringRef> PN,
                   ArrayRef<SubtargetFeatureKV> PF,
-                  ArrayRef<SubtargetSubTypeKV> PD,
+                  ArrayRef<SubtargetSubTypeKV> PD, const MCSchedModel *PSM,
                   const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL,
                   const MCReadAdvanceEntry *RA, const InstrStage *IS,
                   const unsigned *OC, const unsigned *FP);
diff --git a/llvm/lib/CodeGen/TargetSubtargetInfo.cpp b/llvm/lib/CodeGen/TargetSubtargetInfo.cpp
index f85d456122780..56757962277b5 100644
--- a/llvm/lib/CodeGen/TargetSubtargetInfo.cpp
+++ b/llvm/lib/CodeGen/TargetSubtargetInfo.cpp
@@ -18,11 +18,12 @@ using namespace llvm;
 TargetSubtargetInfo::TargetSubtargetInfo(
     const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS,
     ArrayRef<StringRef> PN, ArrayRef<SubtargetFeatureKV> PF,
-    ArrayRef<SubtargetSubTypeKV> PD, const MCWriteProcResEntry *WPR,
-    const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
-    const InstrStage *IS, const unsigned *OC, const unsigned *FP)
-    : MCSubtargetInfo(TT, CPU, TuneCPU, FS, PN, PF, PD, WPR, WL, RA, IS, OC,
-                      FP) {}
+    ArrayRef<SubtargetSubTypeKV> PD, const MCSchedModel *PSM,
+    const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL,
+    const MCReadAdvanceEntry *RA, const InstrStage *IS, const unsigned *OC,
+    const unsigned *FP)
+    : MCSubtargetInfo(TT, CPU, TuneCPU, FS, PN, PF, PD, PSM, WPR, WL, RA, IS,
+                      OC, FP) {}
 
 TargetSubtargetInfo::~TargetSubtargetInfo() = default;
 
diff --git a/llvm/lib/MC/MCSubtargetInfo.cpp b/llvm/lib/MC/MCSubtargetInfo.cpp
index 013a2330a96d1..2b6875185c06e 100644
--- a/llvm/lib/MC/MCSubtargetInfo.cpp
+++ b/llvm/lib/MC/MCSubtargetInfo.cpp
@@ -259,13 +259,14 @@ void MCSubtargetInfo::setDefaultFeatures(StringRef CPU, StringRef TuneCPU,
 MCSubtargetInfo::MCSubtargetInfo(
     const Triple &TT, StringRef C, StringRef TC, StringRef FS,
     ArrayRef<StringRef> PN, ArrayRef<SubtargetFeatureKV> PF,
-    ArrayRef<SubtargetSubTypeKV> PD, const MCWriteProcResEntry *WPR,
-    const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
-    const InstrStage *IS, const unsigned *OC, const unsigned *FP)
+    ArrayRef<SubtargetSubTypeKV> PD, const MCSchedModel *PSM,
+    const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL,
+    const MCReadAdvanceEntry *RA, const InstrStage *IS, const unsigned *OC,
+    const unsigned *FP)
     : TargetTriple(TT), CPU(std::string(C)), TuneCPU(std::string(TC)),
-      ProcNames(PN), ProcFeatures(PF), ProcDesc(PD), WriteProcResTable(WPR),
-      WriteLatencyTable(WL), ReadAdvanceTable(RA), Stages(IS),
-      OperandCycles(OC), ForwardingPaths(FP) {
+      ProcNames(PN), ProcFeatures(PF), ProcDesc(PD), ProcSchedModels(PSM),
+      WriteProcResTable(WPR), WriteLatencyTable(WL), ReadAdvanceTable(RA),
+      Stages(IS), OperandCycles(OC), ForwardingPaths(FP) {
   InitMCProcessorInfo(CPU, TuneCPU, FS);
 }
 
@@ -449,8 +450,7 @@ const MCSchedModel &MCSubtargetInfo::getSchedModelForCPU(StringRef CPU) const {
              << " (ignoring processor)\n";
     return MCSchedModel::Default;
   }
-  assert(CPUEntry->schedModel() && "Missing processor SchedModel value");
-  return *CPUEntry->schedModel();
+  return ProcSchedModels[CPUEntry->SchedModelIdx];
 }
 
 InstrItineraryData
diff --git a/llvm/unittests/CodeGen/MFCommon.inc b/llvm/unittests/CodeGen/MFCommon.inc
index 4499574276421..d773471a8e157 100644
--- a/llvm/unittests/CodeGen/MFCommon.inc
+++ b/llvm/unittests/CodeGen/MFCommon.inc
@@ -89,7 +89,8 @@ class BogusSubtarget : public TargetSubtargetInfo {
 public:
   BogusSubtarget(TargetMachine &TM)
       : TargetSubtargetInfo(Triple(""), "", "", "", {}, {}, {}, nullptr,
-                            nullptr, nullptr, nullptr, nullptr, nullptr),
+                            nullptr, nullptr, nullptr, nullptr, nullptr,
+                            nullptr),
         FL(), TL(TM, *this) {}
   ~BogusSubtarget() override = default;
 
@@ -144,7 +145,7 @@ public:
     STI = std::make_unique<MCSubtargetInfo>(
         Triple(""), "", "", "", ArrayRef<StringRef>{},
         ArrayRef<SubtargetFeatureKV>{}, ArrayRef<SubtargetSubTypeKV>{}, nullptr,
-        nullptr, nullptr, nullptr, nullptr, nullptr);
+        nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
   }
 
   ~BogusTargetMachine() override = default;
diff --git a/llvm/unittests/CodeGen/MachineInstrTest.cpp b/llvm/unittests/CodeGen/MachineInstrTest.cpp
index 9fd7b1980929c..bdb6a1dfaf42f 100644
--- a/llvm/unittests/CodeGen/MachineInstrTest.cpp
+++ b/llvm/unittests/CodeGen/MachineInstrTest.cpp
@@ -44,7 +44,8 @@ std::unique_ptr<MCContext> createMCContext(const MCAsmInfo &AsmInfo) {
                    /*EnvironmentStr=*/"elf");
   static MCRegisterInfo MRI;
   static const MCSubtargetInfo STI(TheTriple, "", "", "", {}, {}, {}, nullptr,
-                                   nullptr, nullptr, nullptr, nullptr, nullptr);
+                                   nullptr, nullptr, nullptr, nullptr, nullptr,
+                                   nullptr);
   return std::make_unique<MCContext>(TheTriple, AsmInfo, MRI, STI, nullptr,
                                      false);
 }
diff --git a/llvm/unittests/CodeGen/MachineOperandTest.cpp b/llvm/unittests/CodeGen/MachineOperandTest.cpp
index 585d8f1a82dd3..bff2f86be726a 100644
--- a/llvm/unittests/CodeGen/MachineOperandTest.cpp
+++ b/llvm/unittests/CodeGen/MachineOperandTest.cpp
@@ -354,7 +354,7 @@ TEST(MachineOperandTest, PrintMCSymbol) {
   MCRegisterInfo MRI;
   Triple T = Triple("unknown-unknown-unknown");
   MCSubtargetInfo STI(T, "", "", "", {}, {}, {}, nullptr, nullptr, nullptr,
-                      nullptr, nullptr, nullptr);
+                      nullptr, nullptr, nullptr, nullptr);
   MCContext Ctx(T, MAI, MRI, STI);
   MCSymbol *Sym = Ctx.getOrCreateSymbol("foo");
 
diff --git a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
index 6f035a1525d08..912056b1ca560 100644
--- a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
+++ b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
@@ -39,7 +39,7 @@ static std::string AArch64InstPrinterTestPrintAlignedLabel(uint64_t value) {
   MCInstrInfo MII;
   MCRegisterInfo MRI;
   MCSubtargetInfo STI(Triple(""), "", "", "", {}, {}, {}, nullptr, nullptr,
-                      nullptr, nullptr, nullptr, nullptr);
+                      nullptr, nullptr, nullptr, nullptr, nullptr);
   MCContext Ctx(Triple(""), MAI, MRI, STI);
   MCInst MI;
 
diff --git a/llvm/utils/TableGen/Common/CodeGenSchedule.h b/llvm/utils/TableGen/Common/CodeGenSchedule.h
index 1d5e953cf70c7..7372d5698c0da 100644
--- a/llvm/utils/TableGen/Common/CodeGenSchedule.h
+++ b/llvm/utils/TableGen/Common/CodeGenSchedule.h
@@ -478,11 +478,11 @@ class CodeGenSchedModels {
     return ModelDef;
   }
 
-  const CodeGenProcModel &getModelForProc(const Record *ProcDef) const {
+  unsigned getModelIndexForProc(const Record *ProcDef) const {
     const Record *ModelDef = getModelOrItinDef(ProcDef);
     auto I = ProcModelMap.find(ModelDef);
     assert(I != ProcModelMap.end() && "missing machine model");
-    return ProcModels[I->second];
+    return I->second;
   }
 
   const CodeGenProcModel &getProcModel(const Record *ModelDef) const {
diff --git a/llvm/utils/TableGen/SubtargetEmitter.cpp b/llvm/utils/TableGen/SubtargetEmitter.cpp
index bede5ebc44007..cc346635c6efd 100644
--- a/llvm/utils/TableGen/SubtargetEmitter.cpp
+++ b/llvm/utils/TableGen/SubtargetEmitter.cpp
@@ -328,10 +328,8 @@ unsigned SubtargetEmitter::cpuKeyValues(raw_ostream &OS,
     OS << ", ";
     printFeatureMask(OS, TuneFeatureList, FeatureMap);
 
-    // Emit the scheduler model pointer.
-    const std::string &ProcModelName =
-        SchedModels.getModelForProc(Processor).ModelName;
-    OS << ", &" << ProcModelName << " },\n";
+    // Emit the scheduler model index.
+    OS << ", " << SchedModels.getModelIndexForProc(Processor) << " },\n";
   }
 
   // End processor table.
@@ -1448,10 +1446,13 @@ void SubtargetEmitter::emitProcessorModels(raw_ostream &OS) {
       PrintFatalError(PM.ModelDef->getLoc(),
                       "SchedMachineModel defines "
                       "ProcResources without defining WriteRes SchedWriteRes");
+  }
 
+  OS << "\n";
+  OS << "extern const llvm::MCSchedModel " << Target << "SchedModels[] = {\n";
+  for (const CodeGenProcModel &PM : SchedModels.procModels()) {
     // Begin processor itinerary properties
-    OS << "\n";
-    OS << "static const llvm::MCSchedModel " << PM.ModelName << " = {\n";
+    OS << "{ // " << PM.ModelName << "\n";
     emitProcessorProp(OS, PM.ModelDef, "IssueWidth", ',');
     emitProcessorProp(OS, PM.ModelDef, "MicroOpBufferSize", ',');
     emitProcessorProp(OS, PM.ModelDef, "LoopMicroOpBufferSize", ',');
@@ -1496,8 +1497,9 @@ void SubtargetEmitter::emitProcessorModels(raw_ostream &OS) {
       OS << "  &" << PM.ModelName << "ExtraInfo,\n";
     else
       OS << "  nullptr // No extra processor descriptor\n";
-    OS << "};\n";
+    OS << "  },\n";
   }
+  OS << "};\n";
 }
 
 //
@@ -2028,11 +2030,12 @@ void SubtargetEmitter::emitGenMCSubtargetInfo(raw_ostream &OS) {
      << "    ArrayRef<StringRef> PN,\n"
      << "    ArrayRef<SubtargetFeatureKV> PF,\n"
      << "    ArrayRef<SubtargetSubTypeKV> PD,\n"
+     << "    const MCSchedModel *PSM,\n"
      << "    const MCWriteProcResEntry *WPR,\n"
      << "    const MCWriteLatencyEntry *WL,\n"
      << "    const MCReadAdvanceEntry *RA, const InstrStage *IS,\n"
      << "    const unsigned *OC, const unsigned *FP) :\n"
-     << "      MCSubtargetInfo(TT, CPU, TuneCPU, FS, PN, PF, PD,\n"
+     << "      MCSubtargetInfo(TT, CPU, TuneCPU, FS, PN, PF, PD, PSM,\n"
      << "                      WPR, WL, RA, IS, OC, FP) { }\n\n"
      << "  unsigned resolveVariantSchedClass(unsigned SchedClass,\n"
      << "      const MCInst *MI, const MCInstrInfo *MCII,\n"
@@ -2115,9 +2118,9 @@ SubtargetEmitter::emitMCDesc(raw_ostream &OS, const FeatureMapTy &FeatureMap) {
   else
     OS << "{}, ";
   if (NumProcs)
-    OS << Target << "SubTypeKV, ";
+    OS << Target << "SubTypeKV, " << Target << "SchedModels, ";
   else
-    OS << "{}, ";
+    OS << "{}, nullptr, ";
   OS << '\n';
   OS.indent(22);
   OS << Target << "WriteProcResTable, " << Target << "WriteLatencyTable, "
@@ -2218,6 +2221,7 @@ void SubtargetEmitter::emitCtor(raw_ostream &OS, unsigned NumNames,
   OS << "extern const llvm::StringRef " << Target << "Names[];\n";
   OS << "extern const llvm::SubtargetFeatureKV " << Target << "FeatureKV[];\n";
   OS << "extern const llvm::SubtargetSubTypeKV " << Target << "SubTypeKV[];\n";
+  OS << "extern const llvm::MCSchedModel " << Target << "SchedModels[];\n";
   OS << "extern const llvm::MCWriteProcResEntry " << Target
      << "WriteProcResTable[];\n";
   OS << "extern const llvm::MCWriteLatencyEntry " << Target
@@ -2248,10 +2252,12 @@ void SubtargetEmitter::emitCtor(raw_ostream &OS, unsigned NumNames,
     OS << "ArrayRef(" << Target << "FeatureKV, " << NumFeatures << "), ";
   else
     OS << "{}, ";
-  if (NumProcs)
-    OS << "ArrayRef(" << Target << "SubTypeKV, " << NumProcs << "), ";
-  else
-    OS << "{}, ";
+  if (NumProcs) {
+    OS << "ArrayRef(" << Target << "SubTypeKV, " << NumProcs << "), " << Target
+       << "SchedModels, ";
+  } else {
+    OS << "{}, nullptr, ";
+  }
   OS << '\n';
   OS.indent(24);
   OS << Target << "WriteProcResTable, " << Target << "WriteLatencyTable, "



More information about the llvm-commits mailing list