Skip to content

Commit dfd45a7

Browse files
committed
Reland "[TableGen][DecoderEmitter] Store HW mode ID instead of name (NFC) (llvm#154052)"
This reverts commit 5612dc5.
1 parent 4823259 commit dfd45a7

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

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

24222412
static void
24232413
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
2424-
ArrayRef<StringRef> HwModeNames,
2414+
ArrayRef<unsigned> HwModeIDs,
24252415
NamespacesHwModesMap &NamespacesWithHwModes,
24262416
std::vector<EncodingAndInst> &GlobalEncodings) {
24272417
const Record *InstDef = Instr->TheDef;
24282418

24292419
switch (DecoderEmitterSuppressDuplicates) {
24302420
case SUPPRESSION_DISABLE: {
2431-
for (StringRef HwModeName : HwModeNames)
2432-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2421+
for (unsigned HwModeID : HwModeIDs)
2422+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24332423
break;
24342424
}
24352425
case SUPPRESSION_LEVEL1: {
24362426
std::string DecoderNamespace =
24372427
InstDef->getValueAsString("DecoderNamespace").str();
24382428
auto It = NamespacesWithHwModes.find(DecoderNamespace);
24392429
if (It != NamespacesWithHwModes.end()) {
2440-
for (StringRef HwModeName : It->second)
2441-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2430+
for (unsigned HwModeID : It->second)
2431+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24422432
} else {
24432433
// Only emit the encoding once, as it's DecoderNamespace doesn't
24442434
// contain any HwModes.
2445-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2435+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24462436
}
24472437
break;
24482438
}
24492439
case SUPPRESSION_LEVEL2:
2450-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2440+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24512441
break;
24522442
}
24532443
}
@@ -2478,34 +2468,28 @@ namespace {
24782468

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

24892479
const auto &NumberedInstructions = Target.getInstructions();
24902480
NumberedEncodings.reserve(NumberedInstructions.size());
24912481
for (const auto &NumberedInstruction : NumberedInstructions) {
24922482
const Record *InstDef = NumberedInstruction->TheDef;
24932483
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
24942484
EncodingInfoByHwMode EBM(RV, HWM);
2495-
for (auto [HwModeID, EncodingDef] : EBM) {
2496-
// DecoderTables with DefaultMode should not have any suffix.
2497-
if (HwModeID == DefaultMode) {
2498-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction, "");
2499-
} else {
2500-
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2501-
HWM.getMode(HwModeID).Name);
2502-
}
2503-
}
2485+
for (auto [HwModeID, EncodingDef] : EBM)
2486+
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2487+
HwModeID);
25042488
continue;
25052489
}
25062490
// This instruction is encoded the same on all HwModes.
25072491
// According to user needs, provide varying degrees of suppression.
2508-
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeNames,
2492+
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeIDs,
25092493
NamespacesWithHwModes, NumberedEncodings);
25102494
}
25112495
for (const Record *NumberedAlias :
@@ -2552,8 +2536,11 @@ namespace {
25522536
}
25532537
std::string DecoderNamespace =
25542538
EncodingDef->getValueAsString("DecoderNamespace").str();
2555-
if (!NumberedEncoding.HwModeName.empty())
2556-
DecoderNamespace += "_" + NumberedEncoding.HwModeName.str();
2539+
// DecoderTables with DefaultMode should not have any suffix.
2540+
if (NumberedEncoding.HwModeID != DefaultMode) {
2541+
StringRef HwModeName = HWM.getModeName(NumberedEncoding.HwModeID);
2542+
DecoderNamespace += ("_" + HwModeName).str();
2543+
}
25572544
EncMap[{DecoderNamespace, Size}].push_back(NEI);
25582545
} else {
25592546
NumEncodingsOmitted++;

0 commit comments

Comments
 (0)