Skip to content

Commit c29dfb3

Browse files
authored
[LLVM][TableGen] Change CodeGenSchedule to use const Record pointers (#108782)
Change CodeGenSchedule to use const Record pointers. This is a part of effort to have better const correctness in TableGen backends: https://discourse.llvm.org/t/psa-planned-changes-to-tablegen-getallderiveddefinitions-api-potential-downstream-breakages/81089
1 parent 5e23b66 commit c29dfb3

File tree

5 files changed

+107
-98
lines changed

5 files changed

+107
-98
lines changed

llvm/utils/TableGen/Common/CodeGenSchedule.cpp

+61-55
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,7 @@ void CodeGenSchedModels::checkSTIPredicates() const {
271271
// Disallow InstructionEquivalenceClasses with an empty instruction list.
272272
for (const Record *R :
273273
Records.getAllDerivedDefinitions("InstructionEquivalenceClass")) {
274-
RecVec Opcodes = R->getValueAsListOfDefs("Opcodes");
275-
if (Opcodes.empty()) {
274+
if (R->getValueAsListOfDefs("Opcodes").empty()) {
276275
PrintFatalError(R->getLoc(), "Invalid InstructionEquivalenceClass "
277276
"defined with an empty opcode list.");
278277
}
@@ -311,13 +310,13 @@ static void processSTIPredicate(STIPredicateFunction &Fn,
311310
// definitions. Each unique opcode will be associated with an OpcodeInfo
312311
// object.
313312
for (const Record *Def : Fn.getDefinitions()) {
314-
RecVec Classes = Def->getValueAsListOfDefs("Classes");
313+
ConstRecVec Classes = Def->getValueAsListOfConstDefs("Classes");
315314
for (const Record *EC : Classes) {
316315
const Record *Pred = EC->getValueAsDef("Predicate");
317316
if (!Predicate2Index.contains(Pred))
318317
Predicate2Index[Pred] = NumUniquePredicates++;
319318

320-
RecVec Opcodes = EC->getValueAsListOfDefs("Opcodes");
319+
ConstRecVec Opcodes = EC->getValueAsListOfConstDefs("Opcodes");
321320
for (const Record *Opcode : Opcodes) {
322321
if (!Opcode2Index.contains(Opcode)) {
323322
Opcode2Index[Opcode] = OpcodeMappings.size();
@@ -342,14 +341,14 @@ static void processSTIPredicate(STIPredicateFunction &Fn,
342341
// Construct a OpcodeInfo object for every unique opcode declared by an
343342
// InstructionEquivalenceClass definition.
344343
for (const Record *Def : Fn.getDefinitions()) {
345-
RecVec Classes = Def->getValueAsListOfDefs("Classes");
344+
ConstRecVec Classes = Def->getValueAsListOfConstDefs("Classes");
346345
const Record *SchedModel = Def->getValueAsDef("SchedModel");
347346
unsigned ProcIndex = ProcModelMap.find(SchedModel)->second;
348347
APInt ProcMask(ProcModelMap.size(), 0);
349348
ProcMask.setBit(ProcIndex);
350349

351350
for (const Record *EC : Classes) {
352-
RecVec Opcodes = EC->getValueAsListOfDefs("Opcodes");
351+
ConstRecVec Opcodes = EC->getValueAsListOfConstDefs("Opcodes");
353352

354353
std::vector<int64_t> OpIndices =
355354
EC->getValueAsListOfInts("OperandIndices");
@@ -579,8 +578,7 @@ static void scanSchedRW(const Record *RWDef, ConstRecVec &RWDefs,
579578
// Visit each variant (guarded by a different predicate).
580579
for (const Record *Variant : RWDef->getValueAsListOfDefs("Variants")) {
581580
// Visit each RW in the sequence selected by the current variant.
582-
RecVec Selected = Variant->getValueAsListOfDefs("Selected");
583-
for (Record *SelDef : Selected)
581+
for (const Record *SelDef : Variant->getValueAsListOfDefs("Selected"))
584582
scanSchedRW(SelDef, RWDefs, RWSet);
585583
}
586584
}
@@ -601,8 +599,7 @@ void CodeGenSchedModels::collectSchedRW() {
601599
const Record *SchedDef = Inst->TheDef;
602600
if (SchedDef->isValueUnset("SchedRW"))
603601
continue;
604-
RecVec RWs = SchedDef->getValueAsListOfDefs("SchedRW");
605-
for (Record *RW : RWs) {
602+
for (const Record *RW : SchedDef->getValueAsListOfDefs("SchedRW")) {
606603
if (RW->isSubClassOf("SchedWrite"))
607604
scanSchedRW(RW, SWDefs, RWSet);
608605
else {
@@ -614,8 +611,8 @@ void CodeGenSchedModels::collectSchedRW() {
614611
// Find all ReadWrites referenced by InstRW.
615612
for (const Record *InstRWDef : Records.getAllDerivedDefinitions("InstRW")) {
616613
// For all OperandReadWrites.
617-
RecVec RWDefs = InstRWDef->getValueAsListOfDefs("OperandReadWrites");
618-
for (Record *RWDef : RWDefs) {
614+
for (const Record *RWDef :
615+
InstRWDef->getValueAsListOfDefs("OperandReadWrites")) {
619616
if (RWDef->isSubClassOf("SchedWrite"))
620617
scanSchedRW(RWDef, SWDefs, RWSet);
621618
else {
@@ -627,8 +624,8 @@ void CodeGenSchedModels::collectSchedRW() {
627624
// Find all ReadWrites referenced by ItinRW.
628625
for (const Record *ItinRWDef : Records.getAllDerivedDefinitions("ItinRW")) {
629626
// For all OperandReadWrites.
630-
RecVec RWDefs = ItinRWDef->getValueAsListOfDefs("OperandReadWrites");
631-
for (Record *RWDef : RWDefs) {
627+
for (const Record *RWDef :
628+
ItinRWDef->getValueAsListOfDefs("OperandReadWrites")) {
632629
if (RWDef->isSubClassOf("SchedWrite"))
633630
scanSchedRW(RWDef, SWDefs, RWSet);
634631
else {
@@ -672,7 +669,7 @@ void CodeGenSchedModels::collectSchedRW() {
672669
for (CodeGenSchedRW &CGRW : SchedWrites) {
673670
if (!CGRW.IsSequence)
674671
continue;
675-
findRWs(CGRW.TheDef->getValueAsListOfDefs("Writes"), CGRW.Sequence,
672+
findRWs(CGRW.TheDef->getValueAsListOfConstDefs("Writes"), CGRW.Sequence,
676673
/*IsRead=*/false);
677674
}
678675
// Initialize Aliases vectors.
@@ -726,9 +723,10 @@ unsigned CodeGenSchedModels::getSchedRWIdx(const Record *Def,
726723
return I == RWVec.end() ? 0 : std::distance(RWVec.begin(), I);
727724
}
728725

729-
static void splitSchedReadWrites(const RecVec &RWDefs, RecVec &WriteDefs,
730-
RecVec &ReadDefs) {
731-
for (Record *RWDef : RWDefs) {
726+
static void splitSchedReadWrites(const ConstRecVec &RWDefs,
727+
ConstRecVec &WriteDefs,
728+
ConstRecVec &ReadDefs) {
729+
for (const Record *RWDef : RWDefs) {
732730
if (RWDef->isSubClassOf("SchedWrite"))
733731
WriteDefs.push_back(RWDef);
734732
else {
@@ -739,19 +737,19 @@ static void splitSchedReadWrites(const RecVec &RWDefs, RecVec &WriteDefs,
739737
}
740738

741739
// Split the SchedReadWrites defs and call findRWs for each list.
742-
void CodeGenSchedModels::findRWs(const RecVec &RWDefs, IdxVec &Writes,
740+
void CodeGenSchedModels::findRWs(const ConstRecVec &RWDefs, IdxVec &Writes,
743741
IdxVec &Reads) const {
744-
RecVec WriteDefs;
745-
RecVec ReadDefs;
742+
ConstRecVec WriteDefs;
743+
ConstRecVec ReadDefs;
746744
splitSchedReadWrites(RWDefs, WriteDefs, ReadDefs);
747745
findRWs(WriteDefs, Writes, false);
748746
findRWs(ReadDefs, Reads, true);
749747
}
750748

751749
// Call getSchedRWIdx for all elements in a sequence of SchedRW defs.
752-
void CodeGenSchedModels::findRWs(const RecVec &RWDefs, IdxVec &RWs,
750+
void CodeGenSchedModels::findRWs(const ConstRecVec &RWDefs, IdxVec &RWs,
753751
bool IsRead) const {
754-
for (Record *RWDef : RWDefs) {
752+
for (const Record *RWDef : RWDefs) {
755753
unsigned Idx = getSchedRWIdx(RWDef, IsRead);
756754
assert(Idx && "failed to collect SchedReadWrite");
757755
RWs.push_back(Idx);
@@ -859,7 +857,8 @@ void CodeGenSchedModels::collectSchedClasses() {
859857
Record *ItinDef = Inst->TheDef->getValueAsDef("Itinerary");
860858
IdxVec Writes, Reads;
861859
if (!Inst->TheDef->isValueUnset("SchedRW"))
862-
findRWs(Inst->TheDef->getValueAsListOfDefs("SchedRW"), Writes, Reads);
860+
findRWs(Inst->TheDef->getValueAsListOfConstDefs("SchedRW"), Writes,
861+
Reads);
863862

864863
// ProcIdx == 0 indicates the class applies to all processors.
865864
unsigned SCIdx = addSchedClass(ItinDef, Writes, Reads, /*ProcIndices*/ {0});
@@ -921,7 +920,8 @@ void CodeGenSchedModels::collectSchedClasses() {
921920
<< InstName);
922921
IdxVec Writes;
923922
IdxVec Reads;
924-
findRWs(RWDef->getValueAsListOfDefs("OperandReadWrites"), Writes, Reads);
923+
findRWs(RWDef->getValueAsListOfConstDefs("OperandReadWrites"), Writes,
924+
Reads);
925925
LLVM_DEBUG({
926926
for (unsigned WIdx : Writes)
927927
dbgs() << " " << SchedWrites[WIdx].Name;
@@ -950,10 +950,9 @@ CodeGenSchedModels::getSchedClassIdx(const CodeGenInstruction &Inst) const {
950950
}
951951

952952
std::string
953-
CodeGenSchedModels::createSchedClassName(Record *ItinClassDef,
953+
CodeGenSchedModels::createSchedClassName(const Record *ItinClassDef,
954954
ArrayRef<unsigned> OperWrites,
955955
ArrayRef<unsigned> OperReads) {
956-
957956
std::string Name;
958957
if (ItinClassDef && ItinClassDef->getName() != "NoItinerary")
959958
Name = std::string(ItinClassDef->getName());
@@ -983,7 +982,7 @@ CodeGenSchedModels::createSchedClassName(const ConstRecVec &InstDefs) {
983982
/// Add an inferred sched class from an itinerary class and per-operand list of
984983
/// SchedWrites and SchedReads. ProcIndices contains the set of IDs of
985984
/// processors that may utilize this class.
986-
unsigned CodeGenSchedModels::addSchedClass(Record *ItinClassDef,
985+
unsigned CodeGenSchedModels::addSchedClass(const Record *ItinClassDef,
987986
ArrayRef<unsigned> OperWrites,
988987
ArrayRef<unsigned> OperReads,
989988
ArrayRef<unsigned> ProcIndices) {
@@ -1131,15 +1130,16 @@ void CodeGenSchedModels::collectProcItins() {
11311130
if (!ProcModel.hasItineraries())
11321131
continue;
11331132

1134-
RecVec ItinRecords = ProcModel.ItinsDef->getValueAsListOfDefs("IID");
1133+
ConstRecVec ItinRecords =
1134+
ProcModel.ItinsDef->getValueAsListOfConstDefs("IID");
11351135
assert(!ItinRecords.empty() && "ProcModel.hasItineraries is incorrect");
11361136

11371137
// Populate ItinDefList with Itinerary records.
11381138
ProcModel.ItinDefList.resize(NumInstrSchedClasses);
11391139

11401140
// Insert each itinerary data record in the correct position within
11411141
// the processor model's ItinDefList.
1142-
for (Record *ItinData : ItinRecords) {
1142+
for (const Record *ItinData : ItinRecords) {
11431143
const Record *ItinDef = ItinData->getValueAsDef("TheClass");
11441144
bool FoundClass = false;
11451145

@@ -1217,14 +1217,15 @@ void CodeGenSchedModels::inferSchedClasses() {
12171217
}
12181218

12191219
/// Infer classes from per-processor itinerary resources.
1220-
void CodeGenSchedModels::inferFromItinClass(Record *ItinClassDef,
1220+
void CodeGenSchedModels::inferFromItinClass(const Record *ItinClassDef,
12211221
unsigned FromClassIdx) {
12221222
for (unsigned PIdx = 0, PEnd = ProcModels.size(); PIdx != PEnd; ++PIdx) {
12231223
const CodeGenProcModel &PM = ProcModels[PIdx];
12241224
// For all ItinRW entries.
12251225
bool HasMatch = false;
12261226
for (const Record *Rec : PM.ItinRWDefs) {
1227-
RecVec Matched = Rec->getValueAsListOfDefs("MatchedItinClasses");
1227+
ConstRecVec Matched =
1228+
Rec->getValueAsListOfConstDefs("MatchedItinClasses");
12281229
if (!llvm::is_contained(Matched, ItinClassDef))
12291230
continue;
12301231
if (HasMatch)
@@ -1233,7 +1234,8 @@ void CodeGenSchedModels::inferFromItinClass(Record *ItinClassDef,
12331234
" in ItinResources for " + PM.ModelName);
12341235
HasMatch = true;
12351236
IdxVec Writes, Reads;
1236-
findRWs(Rec->getValueAsListOfDefs("OperandReadWrites"), Writes, Reads);
1237+
findRWs(Rec->getValueAsListOfConstDefs("OperandReadWrites"), Writes,
1238+
Reads);
12371239
inferFromRW(Writes, Reads, FromClassIdx, PIdx);
12381240
}
12391241
}
@@ -1255,7 +1257,7 @@ void CodeGenSchedModels::inferFromInstRWs(unsigned SCIdx) {
12551257
if (II == IE)
12561258
continue;
12571259
IdxVec Writes, Reads;
1258-
findRWs(Rec->getValueAsListOfDefs("OperandReadWrites"), Writes, Reads);
1260+
findRWs(Rec->getValueAsListOfConstDefs("OperandReadWrites"), Writes, Reads);
12591261
unsigned PIdx = getProcModel(Rec->getValueAsDef("SchedModel")).Index;
12601262
inferFromRW(Writes, Reads, SCIdx, PIdx); // May mutate SchedClasses.
12611263
SchedClasses[SCIdx].InstRWProcIndices.insert(PIdx);
@@ -1348,7 +1350,8 @@ bool PredTransitions::mutuallyExclusive(Record *PredDef,
13481350

13491351
const CodeGenSchedRW &SchedRW = SchedModels.getSchedRW(PC.RWIdx, PC.IsRead);
13501352
assert(SchedRW.HasVariants && "PredCheck must refer to a SchedVariant");
1351-
RecVec Variants = SchedRW.TheDef->getValueAsListOfDefs("Variants");
1353+
ConstRecVec Variants =
1354+
SchedRW.TheDef->getValueAsListOfConstDefs("Variants");
13521355
if (any_of(Variants, [PredDef](const Record *R) {
13531356
return R->getValueAsDef("Predicate") == PredDef;
13541357
})) {
@@ -1414,8 +1417,8 @@ void PredTransitions::getIntersectingVariants(
14141417
}
14151418
if (VarProcIdx == 0 || VarProcIdx == TransVec[TransIdx].ProcIndex) {
14161419
// Push each variant. Assign TransVecIdx later.
1417-
const RecVec VarDefs = SchedRW.TheDef->getValueAsListOfDefs("Variants");
1418-
for (Record *VarDef : VarDefs)
1420+
for (const Record *VarDef :
1421+
SchedRW.TheDef->getValueAsListOfDefs("Variants"))
14191422
Variants.emplace_back(VarDef, SchedRW.Index, VarProcIdx, 0);
14201423
if (VarProcIdx == 0)
14211424
GenericRW = true;
@@ -1446,8 +1449,7 @@ void PredTransitions::getIntersectingVariants(
14461449
SchedModels.getSchedRW((*AI)->getValueAsDef("AliasRW"));
14471450

14481451
if (AliasRW.HasVariants) {
1449-
const RecVec VarDefs = AliasRW.TheDef->getValueAsListOfDefs("Variants");
1450-
for (Record *VD : VarDefs)
1452+
for (const Record *VD : AliasRW.TheDef->getValueAsListOfDefs("Variants"))
14511453
Variants.emplace_back(VD, AliasRW.Index, AliasProcIdx, 0);
14521454
}
14531455
if (AliasRW.IsSequence)
@@ -1495,7 +1497,8 @@ void PredTransitions::pushVariant(const TransVariant &VInfo, bool IsRead) {
14951497
if (VInfo.VarOrSeqDef->isSubClassOf("SchedVar")) {
14961498
Record *PredDef = VInfo.VarOrSeqDef->getValueAsDef("Predicate");
14971499
Trans.PredTerm.emplace_back(IsRead, VInfo.RWIdx, PredDef);
1498-
RecVec SelectedDefs = VInfo.VarOrSeqDef->getValueAsListOfDefs("Selected");
1500+
ConstRecVec SelectedDefs =
1501+
VInfo.VarOrSeqDef->getValueAsListOfConstDefs("Selected");
14991502
SchedModels.findRWs(SelectedDefs, SelectedRWs, IsRead);
15001503
} else {
15011504
assert(VInfo.VarOrSeqDef->isSubClassOf("WriteSequence") &&
@@ -1761,12 +1764,14 @@ void CodeGenSchedModels::inferFromRW(ArrayRef<unsigned> OperWrites,
17611764

17621765
// Check if any processor resource group contains all resource records in
17631766
// SubUnits.
1764-
bool CodeGenSchedModels::hasSuperGroup(RecVec &SubUnits, CodeGenProcModel &PM) {
1767+
bool CodeGenSchedModels::hasSuperGroup(ConstRecVec &SubUnits,
1768+
CodeGenProcModel &PM) {
17651769
for (const Record *ProcResourceDef : PM.ProcResourceDefs) {
17661770
if (!ProcResourceDef->isSubClassOf("ProcResGroup"))
17671771
continue;
1768-
RecVec SuperUnits = ProcResourceDef->getValueAsListOfDefs("Resources");
1769-
RecIter RI = SubUnits.begin(), RE = SubUnits.end();
1772+
ConstRecVec SuperUnits =
1773+
ProcResourceDef->getValueAsListOfConstDefs("Resources");
1774+
auto RI = SubUnits.begin(), RE = SubUnits.end();
17701775
for (; RI != RE; ++RI) {
17711776
if (!is_contained(SuperUnits, *RI)) {
17721777
break;
@@ -1783,13 +1788,13 @@ void CodeGenSchedModels::verifyProcResourceGroups(CodeGenProcModel &PM) {
17831788
for (unsigned i = 0, e = PM.ProcResourceDefs.size(); i < e; ++i) {
17841789
if (!PM.ProcResourceDefs[i]->isSubClassOf("ProcResGroup"))
17851790
continue;
1786-
RecVec CheckUnits =
1787-
PM.ProcResourceDefs[i]->getValueAsListOfDefs("Resources");
1791+
ConstRecVec CheckUnits =
1792+
PM.ProcResourceDefs[i]->getValueAsListOfConstDefs("Resources");
17881793
for (unsigned j = i + 1; j < e; ++j) {
17891794
if (!PM.ProcResourceDefs[j]->isSubClassOf("ProcResGroup"))
17901795
continue;
1791-
RecVec OtherUnits =
1792-
PM.ProcResourceDefs[j]->getValueAsListOfDefs("Resources");
1796+
ConstRecVec OtherUnits =
1797+
PM.ProcResourceDefs[j]->getValueAsListOfConstDefs("Resources");
17931798
if (std::find_first_of(CheckUnits.begin(), CheckUnits.end(),
17941799
OtherUnits.begin(),
17951800
OtherUnits.end()) != CheckUnits.end()) {
@@ -1828,7 +1833,7 @@ void CodeGenSchedModels::collectRegisterFiles() {
18281833
"Invalid RegisterFile with zero physical registers");
18291834
}
18301835

1831-
RecVec RegisterClasses = RF->getValueAsListOfDefs("RegClasses");
1836+
ConstRecVec RegisterClasses = RF->getValueAsListOfConstDefs("RegClasses");
18321837
std::vector<int64_t> RegisterCosts = RF->getValueAsListOfInts("RegCosts");
18331838
ListInit *MoveElimInfo = RF->getValueAsListInit("AllowMoveElimination");
18341839
for (unsigned I = 0, E = RegisterClasses.size(); I < E; ++I) {
@@ -1866,7 +1871,8 @@ void CodeGenSchedModels::collectProcResources() {
18661871
Record *RWModelDef = RW->getValueAsDef("SchedModel");
18671872
unsigned PIdx = getProcModel(RWModelDef).Index;
18681873
IdxVec Writes, Reads;
1869-
findRWs(RW->getValueAsListOfDefs("OperandReadWrites"), Writes, Reads);
1874+
findRWs(RW->getValueAsListOfConstDefs("OperandReadWrites"), Writes,
1875+
Reads);
18701876
collectRWResources(Writes, Reads, PIdx);
18711877
}
18721878

@@ -2004,13 +2010,13 @@ void CodeGenSchedModels::checkCompleteness() {
20042010
}
20052011

20062012
// Collect itinerary class resources for each processor.
2007-
void CodeGenSchedModels::collectItinProcResources(Record *ItinClassDef) {
2013+
void CodeGenSchedModels::collectItinProcResources(const Record *ItinClassDef) {
20082014
for (unsigned PIdx = 0, PEnd = ProcModels.size(); PIdx != PEnd; ++PIdx) {
20092015
const CodeGenProcModel &PM = ProcModels[PIdx];
20102016
// For all ItinRW entries.
20112017
bool HasMatch = false;
20122018
for (const Record *R : PM.ItinRWDefs) {
2013-
RecVec Matched = R->getValueAsListOfDefs("MatchedItinClasses");
2019+
ConstRecVec Matched = R->getValueAsListOfConstDefs("MatchedItinClasses");
20142020
if (!llvm::is_contained(Matched, ItinClassDef))
20152021
continue;
20162022
if (HasMatch)
@@ -2019,7 +2025,7 @@ void CodeGenSchedModels::collectItinProcResources(Record *ItinClassDef) {
20192025
" in ItinResources for " + PM.ModelName);
20202026
HasMatch = true;
20212027
IdxVec Writes, Reads;
2022-
findRWs(R->getValueAsListOfDefs("OperandReadWrites"), Writes, Reads);
2028+
findRWs(R->getValueAsListOfConstDefs("OperandReadWrites"), Writes, Reads);
20232029
collectRWResources(Writes, Reads, PIdx);
20242030
}
20252031
}
@@ -2139,8 +2145,8 @@ void CodeGenSchedModels::addWriteRes(const Record *ProcWriteResDef,
21392145
WRDefs.push_back(ProcWriteResDef);
21402146

21412147
// Visit ProcResourceKinds referenced by the newly discovered WriteRes.
2142-
RecVec ProcResDefs = ProcWriteResDef->getValueAsListOfDefs("ProcResources");
2143-
for (const Record *ProcResDef : ProcResDefs) {
2148+
for (const Record *ProcResDef :
2149+
ProcWriteResDef->getValueAsListOfDefs("ProcResources")) {
21442150
addProcResource(ProcResDef, ProcModels[PIdx], ProcWriteResDef->getLoc());
21452151
}
21462152
}
@@ -2186,7 +2192,7 @@ bool CodeGenProcModel::isUnsupported(const CodeGenInstruction &Inst) const {
21862192

21872193
bool CodeGenProcModel::hasReadOfWrite(const Record *WriteDef) const {
21882194
for (auto &RADef : ReadAdvanceDefs) {
2189-
RecVec ValidWrites = RADef->getValueAsListOfDefs("ValidWrites");
2195+
ConstRecVec ValidWrites = RADef->getValueAsListOfConstDefs("ValidWrites");
21902196
if (is_contained(ValidWrites, WriteDef))
21912197
return true;
21922198
}

0 commit comments

Comments
 (0)