[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