Skip to content

Commit b20bbd4

Browse files
authored
[TableGen][DecoderEmitter] Store HW mode ID instead of name (NFC) (#154052)
This simplifies code a bit.
1 parent 378d240 commit b20bbd4

File tree

1 file changed

+29
-42
lines changed

1 file changed

+29
-42
lines changed

llvm/utils/TableGen/DecoderEmitter.cpp

Lines changed: 29 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -208,14 +208,14 @@ struct DecoderTableInfo {
208208
struct EncodingAndInst {
209209
const Record *EncodingDef;
210210
const CodeGenInstruction *Inst;
211-
StringRef HwModeName;
211+
unsigned HwModeID;
212212

213213
EncodingAndInst(const Record *EncodingDef, const CodeGenInstruction *Inst,
214-
StringRef HwModeName = "")
215-
: EncodingDef(EncodingDef), Inst(Inst), HwModeName(HwModeName) {}
214+
unsigned HwModeID = DefaultMode)
215+
: EncodingDef(EncodingDef), Inst(Inst), HwModeID(HwModeID) {}
216216
};
217217

218-
using NamespacesHwModesMap = std::map<std::string, std::set<StringRef>>;
218+
using NamespacesHwModesMap = std::map<std::string, std::set<unsigned>>;
219219

220220
class DecoderEmitter {
221221
const RecordKeeper &RK;
@@ -2386,63 +2386,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23862386
)";
23872387
}
23882388

2389-
// Collect all HwModes referenced by the target for encoding purposes,
2390-
// returning a vector of corresponding names.
2389+
// Collect all HwModes referenced by the target for encoding purposes.
23912390
static void collectHwModesReferencedForEncodings(
2392-
const CodeGenHwModes &HWM, std::vector<StringRef> &Names,
2391+
const CodeGenHwModes &HWM, std::vector<unsigned> &HwModeIDs,
23932392
NamespacesHwModesMap &NamespacesWithHwModes) {
23942393
SmallBitVector BV(HWM.getNumModeIds());
23952394
for (const auto &MS : HWM.getHwModeSelects()) {
23962395
for (auto [HwModeID, EncodingDef] : MS.second.Items) {
23972396
if (EncodingDef->isSubClassOf("InstructionEncoding")) {
23982397
std::string DecoderNamespace =
23992398
EncodingDef->getValueAsString("DecoderNamespace").str();
2400-
if (HwModeID == DefaultMode) {
2401-
NamespacesWithHwModes[DecoderNamespace].insert("");
2402-
} else {
2403-
NamespacesWithHwModes[DecoderNamespace].insert(
2404-
HWM.getMode(HwModeID).Name);
2405-
}
2399+
NamespacesWithHwModes[DecoderNamespace].insert(HwModeID);
24062400
BV.set(HwModeID);
24072401
}
24082402
}
24092403
}
2410-
transform(BV.set_bits(), std::back_inserter(Names), [&HWM](const int &M) {
2411-
if (M == DefaultMode)
2412-
return StringRef("");
2413-
return HWM.getModeName(M, /*IncludeDefault=*/true);
2414-
});
2404+
HwModeIDs.assign(BV.set_bits_begin(), BV.set_bits_end());
24152405
}
24162406

24172407
static void
24182408
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
2419-
ArrayRef<StringRef> HwModeNames,
2409+
ArrayRef<unsigned> HwModeIDs,
24202410
NamespacesHwModesMap &NamespacesWithHwModes,
24212411
std::vector<EncodingAndInst> &GlobalEncodings) {
24222412
const Record *InstDef = Instr->TheDef;
24232413

24242414
switch (DecoderEmitterSuppressDuplicates) {
24252415
case SUPPRESSION_DISABLE: {
2426-
for (StringRef HwModeName : HwModeNames)
2427-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2416+
for (unsigned HwModeID : HwModeIDs)
2417+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24282418
break;
24292419
}
24302420
case SUPPRESSION_LEVEL1: {
24312421
std::string DecoderNamespace =
24322422
InstDef->getValueAsString("DecoderNamespace").str();
24332423
auto It = NamespacesWithHwModes.find(DecoderNamespace);
24342424
if (It != NamespacesWithHwModes.end()) {
2435-
for (StringRef HwModeName : It->second)
2436-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2425+
for (unsigned HwModeID : It->second)
2426+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24372427
} else {
24382428
// Only emit the encoding once, as it's DecoderNamespace doesn't
24392429
// contain any HwModes.
2440-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2430+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24412431
}
24422432
break;
24432433
}
24442434
case SUPPRESSION_LEVEL2:
2445-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2435+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24462436
break;
24472437
}
24482438
}
@@ -2473,34 +2463,28 @@ namespace {
24732463

24742464
// First, collect all encoding-related HwModes referenced by the target.
24752465
// And establish a mapping table between DecoderNamespace and HwMode.
2476-
// If HwModeNames is empty, add the empty string so we always have one HwMode.
2466+
// If HwModeNames is empty, add the default mode so we always have one HwMode.
24772467
const CodeGenHwModes &HWM = Target.getHwModes();
2478-
std::vector<StringRef> HwModeNames;
2468+
std::vector<unsigned> HwModeIDs;
24792469
NamespacesHwModesMap NamespacesWithHwModes;
2480-
collectHwModesReferencedForEncodings(HWM, HwModeNames, NamespacesWithHwModes);
2481-
if (HwModeNames.empty())
2482-
HwModeNames.push_back("");
2470+
collectHwModesReferencedForEncodings(HWM, HwModeIDs, NamespacesWithHwModes);
2471+
if (HwModeIDs.empty())
2472+
HwModeIDs.push_back(DefaultMode);
24832473

24842474
const auto &NumberedInstructions = Target.getInstructions();
24852475
NumberedEncodings.reserve(NumberedInstructions.size());
24862476
for (const auto &NumberedInstruction : NumberedInstructions) {
24872477
const Record *InstDef = NumberedInstruction->TheDef;
24882478
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
24892479
EncodingInfoByHwMode EBM(RV, HWM);
2490-
for (auto [HwModeID, EncodingDef] : EBM) {
2491-
// DecoderTables with DefaultMode should not have any suffix.
2492-
if (HwModeID == DefaultMode) {
2493-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction, "");
2494-
} else {
2495-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2496-
HWM.getMode(HwModeID).Name);
2497-
}
2498-
}
2480+
for (auto [HwModeID, EncodingDef] : EBM)
2481+
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2482+
HwModeID);
24992483
continue;
25002484
}
25012485
// This instruction is encoded the same on all HwModes.
25022486
// According to user needs, provide varying degrees of suppression.
2503-
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeNames,
2487+
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeIDs,
25042488
NamespacesWithHwModes, NumberedEncodings);
25052489
}
25062490
for (const Record *NumberedAlias :
@@ -2547,8 +2531,11 @@ namespace {
25472531
}
25482532
std::string DecoderNamespace =
25492533
EncodingDef->getValueAsString("DecoderNamespace").str();
2550-
if (!NumberedEncoding.HwModeName.empty())
2551-
DecoderNamespace += "_" + NumberedEncoding.HwModeName.str();
2534+
// DecoderTables with DefaultMode should not have any suffix.
2535+
if (NumberedEncoding.HwModeID != DefaultMode) {
2536+
StringRef HwModeName = HWM.getModeName(NumberedEncoding.HwModeID);
2537+
DecoderNamespace += ("_" + HwModeName).str();
2538+
}
25522539
EncMap[{DecoderNamespace, Size}].push_back(NEI);
25532540
} else {
25542541
NumEncodingsOmitted++;

0 commit comments

Comments
 (0)