[llvm] [TableGen][DecoderEmitter] Store HW mode ID instead of name (NFC) (PR #154052)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 17 23:36:33 PDT 2025
https://github.com/s-barannikov updated https://github.com/llvm/llvm-project/pull/154052
>From 98232cf1c476fe65ffbf56a9539aa7f2557289e8 Mon Sep 17 00:00:00 2001
From: Sergei Barannikov <barannikov88 at gmail.com>
Date: Mon, 18 Aug 2025 06:28:29 +0300
Subject: [PATCH] [TableGen][DecoderEmitter] Store HW mode ID instead of name
(NFC)
This simplifies code a bit.
---
llvm/utils/TableGen/DecoderEmitter.cpp | 71 +++++++++++---------------
1 file changed, 29 insertions(+), 42 deletions(-)
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index f69e47e49c1eb..29ee0087be916 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -208,14 +208,14 @@ struct DecoderTableInfo {
struct EncodingAndInst {
const Record *EncodingDef;
const CodeGenInstruction *Inst;
- StringRef HwModeName;
+ unsigned HwModeID;
EncodingAndInst(const Record *EncodingDef, const CodeGenInstruction *Inst,
- StringRef HwModeName = "")
- : EncodingDef(EncodingDef), Inst(Inst), HwModeName(HwModeName) {}
+ unsigned HwModeID = DefaultMode)
+ : EncodingDef(EncodingDef), Inst(Inst), HwModeID(HwModeID) {}
};
-using NamespacesHwModesMap = std::map<std::string, std::set<StringRef>>;
+using NamespacesHwModesMap = std::map<std::string, std::set<unsigned>>;
class DecoderEmitter {
const RecordKeeper &RK;
@@ -2393,10 +2393,9 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
)";
}
-// Collect all HwModes referenced by the target for encoding purposes,
-// returning a vector of corresponding names.
+// Collect all HwModes referenced by the target for encoding purposes.
static void collectHwModesReferencedForEncodings(
- const CodeGenHwModes &HWM, std::vector<StringRef> &Names,
+ const CodeGenHwModes &HWM, std::vector<unsigned> &HwModeIDs,
NamespacesHwModesMap &NamespacesWithHwModes) {
SmallBitVector BV(HWM.getNumModeIds());
for (const auto &MS : HWM.getHwModeSelects()) {
@@ -2404,34 +2403,25 @@ static void collectHwModesReferencedForEncodings(
if (EncodingDef->isSubClassOf("InstructionEncoding")) {
std::string DecoderNamespace =
EncodingDef->getValueAsString("DecoderNamespace").str();
- if (HwModeID == DefaultMode) {
- NamespacesWithHwModes[DecoderNamespace].insert("");
- } else {
- NamespacesWithHwModes[DecoderNamespace].insert(
- HWM.getMode(HwModeID).Name);
- }
+ NamespacesWithHwModes[DecoderNamespace].insert(HwModeID);
BV.set(HwModeID);
}
}
}
- transform(BV.set_bits(), std::back_inserter(Names), [&HWM](const int &M) {
- if (M == DefaultMode)
- return StringRef("");
- return HWM.getModeName(M, /*IncludeDefault=*/true);
- });
+ append_range(HwModeIDs, BV.set_bits());
}
static void
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
- ArrayRef<StringRef> HwModeNames,
+ ArrayRef<unsigned> HwModeIDs,
NamespacesHwModesMap &NamespacesWithHwModes,
std::vector<EncodingAndInst> &GlobalEncodings) {
const Record *InstDef = Instr->TheDef;
switch (DecoderEmitterSuppressDuplicates) {
case SUPPRESSION_DISABLE: {
- for (StringRef HwModeName : HwModeNames)
- GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
+ for (unsigned HwModeID : HwModeIDs)
+ GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
break;
}
case SUPPRESSION_LEVEL1: {
@@ -2439,17 +2429,17 @@ handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
InstDef->getValueAsString("DecoderNamespace").str();
auto It = NamespacesWithHwModes.find(DecoderNamespace);
if (It != NamespacesWithHwModes.end()) {
- for (StringRef HwModeName : It->second)
- GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
+ for (unsigned HwModeID : It->second)
+ GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
} else {
// Only emit the encoding once, as it's DecoderNamespace doesn't
// contain any HwModes.
- GlobalEncodings.emplace_back(InstDef, Instr, "");
+ GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
}
break;
}
case SUPPRESSION_LEVEL2:
- GlobalEncodings.emplace_back(InstDef, Instr, "");
+ GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
break;
}
}
@@ -2480,13 +2470,13 @@ namespace {
// First, collect all encoding-related HwModes referenced by the target.
// And establish a mapping table between DecoderNamespace and HwMode.
- // If HwModeNames is empty, add the empty string so we always have one HwMode.
+ // If HwModeNames is empty, add the default mode so we always have one HwMode.
const CodeGenHwModes &HWM = Target.getHwModes();
- std::vector<StringRef> HwModeNames;
+ std::vector<unsigned> HwModeIDs;
NamespacesHwModesMap NamespacesWithHwModes;
- collectHwModesReferencedForEncodings(HWM, HwModeNames, NamespacesWithHwModes);
- if (HwModeNames.empty())
- HwModeNames.push_back("");
+ collectHwModesReferencedForEncodings(HWM, HwModeIDs, NamespacesWithHwModes);
+ if (HwModeIDs.empty())
+ HwModeIDs.push_back(DefaultMode);
const auto &NumberedInstructions = Target.getInstructions();
NumberedEncodings.reserve(NumberedInstructions.size());
@@ -2494,20 +2484,14 @@ namespace {
const Record *InstDef = NumberedInstruction->TheDef;
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
EncodingInfoByHwMode EBM(RV, HWM);
- for (auto [HwModeID, EncodingDef] : EBM) {
- // DecoderTables with DefaultMode should not have any suffix.
- if (HwModeID == DefaultMode) {
- NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction, "");
- } else {
- NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
- HWM.getMode(HwModeID).Name);
- }
- }
+ for (auto [HwModeID, EncodingDef] : EBM)
+ NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
+ HwModeID);
continue;
}
// This instruction is encoded the same on all HwModes.
// According to user needs, provide varying degrees of suppression.
- handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeNames,
+ handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeIDs,
NamespacesWithHwModes, NumberedEncodings);
}
for (const Record *NumberedAlias :
@@ -2554,8 +2538,11 @@ namespace {
}
std::string DecoderNamespace =
EncodingDef->getValueAsString("DecoderNamespace").str();
- if (!NumberedEncoding.HwModeName.empty())
- DecoderNamespace += "_" + NumberedEncoding.HwModeName.str();
+ // DecoderTables with DefaultMode should not have any suffix.
+ if (NumberedEncoding.HwModeID != DefaultMode) {
+ StringRef HwModeName = HWM.getModeName(NumberedEncoding.HwModeID);
+ DecoderNamespace += ("_" + HwModeName).str();
+ }
EncMap[{DecoderNamespace, Size}].push_back(NEI);
} else {
NumEncodingsOmitted++;
More information about the llvm-commits
mailing list