Skip to content

Commit 0cd4ae9

Browse files
authored
Reland "[TableGen][DecoderEmitter] Store HW mode ID instead of name (NFC) (#154052)" (#154212)
This reverts commit 5612dc5. Reland with MacOS build fixed.
1 parent a26c3e9 commit 0cd4ae9

File tree

1 file changed

+32
-42
lines changed

1 file changed

+32
-42
lines changed

llvm/utils/TableGen/DecoderEmitter.cpp

Lines changed: 32 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,56 @@ 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+
// FIXME: Can't do `HwModeIDs.assign(BV.set_bits_begin(), BV.set_bits_end())`
2410+
// because const_set_bits_iterator_impl is not copy-assignable.
2411+
// This breaks some MacOS builds.
2412+
append_range(HwModeIDs, BV.set_bits());
24202413
}
24212414

24222415
static void
24232416
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
2424-
ArrayRef<StringRef> HwModeNames,
2417+
ArrayRef<unsigned> HwModeIDs,
24252418
NamespacesHwModesMap &NamespacesWithHwModes,
24262419
std::vector<EncodingAndInst> &GlobalEncodings) {
24272420
const Record *InstDef = Instr->TheDef;
24282421

24292422
switch (DecoderEmitterSuppressDuplicates) {
24302423
case SUPPRESSION_DISABLE: {
2431-
for (StringRef HwModeName : HwModeNames)
2432-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2424+
for (unsigned HwModeID : HwModeIDs)
2425+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24332426
break;
24342427
}
24352428
case SUPPRESSION_LEVEL1: {
24362429
std::string DecoderNamespace =
24372430
InstDef->getValueAsString("DecoderNamespace").str();
24382431
auto It = NamespacesWithHwModes.find(DecoderNamespace);
24392432
if (It != NamespacesWithHwModes.end()) {
2440-
for (StringRef HwModeName : It->second)
2441-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeName);
2433+
for (unsigned HwModeID : It->second)
2434+
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
24422435
} else {
24432436
// Only emit the encoding once, as it's DecoderNamespace doesn't
24442437
// contain any HwModes.
2445-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2438+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24462439
}
24472440
break;
24482441
}
24492442
case SUPPRESSION_LEVEL2:
2450-
GlobalEncodings.emplace_back(InstDef, Instr, "");
2443+
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
24512444
break;
24522445
}
24532446
}
@@ -2478,34 +2471,28 @@ namespace {
24782471

24792472
// First, collect all encoding-related HwModes referenced by the target.
24802473
// And establish a mapping table between DecoderNamespace and HwMode.
2481-
// If HwModeNames is empty, add the empty string so we always have one HwMode.
2474+
// If HwModeNames is empty, add the default mode so we always have one HwMode.
24822475
const CodeGenHwModes &HWM = Target.getHwModes();
2483-
std::vector<StringRef> HwModeNames;
2476+
std::vector<unsigned> HwModeIDs;
24842477
NamespacesHwModesMap NamespacesWithHwModes;
2485-
collectHwModesReferencedForEncodings(HWM, HwModeNames, NamespacesWithHwModes);
2486-
if (HwModeNames.empty())
2487-
HwModeNames.push_back("");
2478+
collectHwModesReferencedForEncodings(HWM, HwModeIDs, NamespacesWithHwModes);
2479+
if (HwModeIDs.empty())
2480+
HwModeIDs.push_back(DefaultMode);
24882481

24892482
const auto &NumberedInstructions = Target.getInstructions();
24902483
NumberedEncodings.reserve(NumberedInstructions.size());
24912484
for (const auto &NumberedInstruction : NumberedInstructions) {
24922485
const Record *InstDef = NumberedInstruction->TheDef;
24932486
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
24942487
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-
}
2488+
for (auto [HwModeID, EncodingDef] : EBM)
2489+
NumberedEncodings.emplace_back(EncodingDef, NumberedInstruction,
2490+
HwModeID);
25042491
continue;
25052492
}
25062493
// This instruction is encoded the same on all HwModes.
25072494
// According to user needs, provide varying degrees of suppression.
2508-
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeNames,
2495+
handleHwModesUnrelatedEncodings(NumberedInstruction, HwModeIDs,
25092496
NamespacesWithHwModes, NumberedEncodings);
25102497
}
25112498
for (const Record *NumberedAlias :
@@ -2552,8 +2539,11 @@ namespace {
25522539
}
25532540
std::string DecoderNamespace =
25542541
EncodingDef->getValueAsString("DecoderNamespace").str();
2555-
if (!NumberedEncoding.HwModeName.empty())
2556-
DecoderNamespace += "_" + NumberedEncoding.HwModeName.str();
2542+
// DecoderTables with DefaultMode should not have any suffix.
2543+
if (NumberedEncoding.HwModeID != DefaultMode) {
2544+
StringRef HwModeName = HWM.getModeName(NumberedEncoding.HwModeID);
2545+
DecoderNamespace += ("_" + HwModeName).str();
2546+
}
25572547
EncMap[{DecoderNamespace, Size}].push_back(NEI);
25582548
} else {
25592549
NumEncodingsOmitted++;

0 commit comments

Comments
 (0)