Skip to content

Commit b4d05db

Browse files
committed
[TableGen][DecoderEmitter] Store HW mode ID instead of name (NFC)
This simplifies code a bit.
1 parent 9ddc043 commit b4d05db

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;
@@ -2393,63 +2393,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23932393
)";
23942394
}
23952395

2396-
// Collect all HwModes referenced by the target for encoding purposes,
2397-
// returning a vector of corresponding names.
2396+
// Collect all HwModes referenced by the target for encoding purposes.
23982397
static void collectHwModesReferencedForEncodings(
2399-
const CodeGenHwModes &HWM, std::vector<StringRef> &Names,
2398+
const CodeGenHwModes &HWM, std::vector<unsigned> &HwModeIDs,
24002399
NamespacesHwModesMap &NamespacesWithHwModes) {
24012400
SmallBitVector BV(HWM.getNumModeIds());
24022401
for (const auto &MS : HWM.getHwModeSelects()) {
24032402
for (auto [HwModeID, EncodingDef] : MS.second.Items) {
24042403
if (EncodingDef->isSubClassOf("InstructionEncoding")) {
24052404
std::string DecoderNamespace =
24062405
EncodingDef->getValueAsString("DecoderNamespace").str();
2407-
if (HwModeID == DefaultMode) {
2408-
NamespacesWithHwModes[DecoderNamespace].insert("");
2409-
} else {
2410-
NamespacesWithHwModes[DecoderNamespace].insert(
2411-
HWM.getMode(HwModeID).Name);
2412-
}
2406+
NamespacesWithHwModes[DecoderNamespace].insert(HwModeID);
24132407
BV.set(HwModeID);
24142408
}
24152409
}
24162410
}
2417-
transform(BV.set_bits(), std::back_inserter(Names), [&HWM](const int &M) {
2418-
if (M == DefaultMode)
2419-
return StringRef("");
2420-
return HWM.getModeName(M, /*IncludeDefault=*/true);
2421-
});
2411+
HwModeIDs.assign(BV.set_bits_begin(), BV.set_bits_end());
24222412
}
24232413

24242414
static void
24252415
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
2426-
ArrayRef<StringRef> HwModeNames,
2416+
ArrayRef<unsigned> HwModeIDs,
24272417
NamespacesHwModesMap &NamespacesWithHwModes,
24282418
std::vector<EncodingAndInst> &GlobalEncodings) {
24292419
const Record *InstDef = Instr->TheDef;
24302420

24312421
switch (DecoderEmitterSuppressDuplicates) {
24322422
case SUPPRESSION_DISABLE: {
2433-
for (StringRef HwModeName : HwModeNames)
2434-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2423+
for (unsigned HwModeID : HwModeIDs)
2424+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24352425
break;
24362426
}
24372427
case SUPPRESSION_LEVEL1: {
24382428
std::string DecoderNamespace =
24392429
InstDef->getValueAsString("DecoderNamespace").str();
24402430
auto It = NamespacesWithHwModes.find(DecoderNamespace);
24412431
if (It != NamespacesWithHwModes.end()) {
2442-
for (StringRef HwModeName : It->second)
2443-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2432+
for (unsigned HwModeID : It->second)
2433+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24442434
} else {
24452435
// Only emit the encoding once, as it's DecoderNamespace doesn't
24462436
// contain any HwModes.
2447-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2437+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24482438
}
24492439
break;
24502440
}
24512441
case SUPPRESSION_LEVEL2:
2452-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2442+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24532443
break;
24542444
}
24552445
}
@@ -2480,34 +2470,28 @@ namespace {
24802470

24812471
// First, collect all encoding-related HwModes referenced by the target.
24822472
// And establish a mapping table between DecoderNamespace and HwMode.
2483-
// If HwModeNames is empty, add the empty string so we always have one HwMode.
2473+
// If HwModeNames is empty, add the default mode so we always have one HwMode.
24842474
const CodeGenHwModes &HWM = Target.getHwModes();
2485-
std::vector<StringRef> HwModeNames;
2475+
std::vector<unsigned> HwModeIDs;
24862476
NamespacesHwModesMap NamespacesWithHwModes;
2487-
collectHwModesReferencedForEncodings(HWM, HwModeNames, NamespacesWithHwModes);
2488-
if (HwModeNames.empty())
2489-
HwModeNames.push_back("");
2477+
collectHwModesReferencedForEncodings(HWM, HwModeIDs, NamespacesWithHwModes);
2478+
if (HwModeIDs.empty())
2479+
HwModeIDs.push_back(DefaultMode);
24902480

24912481
const auto &NumberedInstructions = Target.getInstructions();
24922482
NumberedEncodings.reserve(NumberedInstructions.size());
24932483
for (const auto &NumberedInstruction : NumberedInstructions) {
24942484
const Record *InstDef = NumberedInstruction->TheDef;
24952485
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
24962486
EncodingInfoByHwMode EBM(RV, HWM);
2497-
for (auto [HwModeID, EncodingDef] : EBM) {
2498-
// DecoderTables with DefaultMode should not have any suffix.
2499-
if (HwModeID == DefaultMode) {
2500-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction, "");
2501-
} else {
2502-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2503-
HWM.getMode(HwModeID).Name);
2504-
}
2505-
}
2487+
for (auto [HwModeID, EncodingDef] : EBM)
2488+
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2489+
HwModeID);
25062490
continue;
25072491
}
25082492
// This instruction is encoded the same on all HwModes.
25092493
// According to user needs, provide varying degrees of suppression.
2510-
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeNames,
2494+
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeIDs,
25112495
NamespacesWithHwModes, NumberedEncodings);
25122496
}
25132497
for (const Record *NumberedAlias :
@@ -2554,8 +2538,11 @@ namespace {
25542538
}
25552539
std::string DecoderNamespace =
25562540
EncodingDef->getValueAsString("DecoderNamespace").str();
2557-
if (!NumberedEncoding.HwModeName.empty())
2558-
DecoderNamespace += "_" + NumberedEncoding.HwModeName.str();
2541+
// DecoderTables with DefaultMode should not have any suffix.
2542+
if (NumberedEncoding.HwModeID != DefaultMode) {
2543+
StringRef HwModeName = HWM.getModeName(NumberedEncoding.HwModeID);
2544+
DecoderNamespace += ("_" + HwModeName).str();
2545+
}
25592546
EncMap[{DecoderNamespace, Size}].push_back(NEI);
25602547
} else {
25612548
NumEncodingsOmitted++;

0 commit comments

Comments
 (0)