Skip to content

Commit 7c6592f

Browse files
authored
[TableGen] Change CodeGenRegister to use const Record pointer (#108027)
Change CodeGenRegister to use const Record pointer. 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 2b452b4 commit 7c6592f

File tree

5 files changed

+43
-43
lines changed

5 files changed

+43
-43
lines changed

llvm/utils/TableGen/AsmMatcherEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1338,7 +1338,7 @@ void AsmMatcherInfo::buildRegisterClasses(
13381338
// Name the register classes which correspond to a user defined RegisterClass.
13391339
for (const CodeGenRegisterClass &RC : RegClassList) {
13401340
// Def will be NULL for non-user defined register classes.
1341-
Record *Def = RC.getDef();
1341+
const Record *Def = RC.getDef();
13421342
if (!Def)
13431343
continue;
13441344
ClassInfo *CI = RegisterSetClasses[RegisterSet(RC.getOrder().begin(),

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include <iterator>
3535
#include <map>
3636
#include <queue>
37-
#include <set>
3837
#include <string>
3938
#include <tuple>
4039
#include <utility>
@@ -48,7 +47,7 @@ using namespace llvm;
4847
// CodeGenSubRegIndex
4948
//===----------------------------------------------------------------------===//
5049

51-
CodeGenSubRegIndex::CodeGenSubRegIndex(Record *R, unsigned Enum,
50+
CodeGenSubRegIndex::CodeGenSubRegIndex(const Record *R, unsigned Enum,
5251
const CodeGenHwModes &CGH)
5352
: TheDef(R), EnumValue(Enum), AllSuperRegsCovered(true), Artificial(true) {
5453
Name = std::string(R->getName());
@@ -99,7 +98,7 @@ void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
9998
PrintFatalError(TheDef->getLoc(),
10099
"CoveredBySubRegs must have two or more entries");
101100
SmallVector<CodeGenSubRegIndex *, 8> IdxParts;
102-
for (Record *Part : Parts)
101+
for (const Record *Part : Parts)
103102
IdxParts.push_back(RegBank.getSubRegIdx(Part));
104103
setConcatenationOf(IdxParts);
105104
}
@@ -190,8 +189,7 @@ void CodeGenRegister::buildObjectGraph(CodeGenRegBank &RegBank) {
190189

191190
// Add ad hoc alias links. This is a symmetric relationship between two
192191
// registers, so build a symmetric graph by adding links in both ends.
193-
std::vector<Record *> Aliases = TheDef->getValueAsListOfDefs("Aliases");
194-
for (Record *Alias : Aliases) {
192+
for (const Record *Alias : TheDef->getValueAsListOfDefs("Aliases")) {
195193
CodeGenRegister *Reg = RegBank.getReg(Alias);
196194
ExplicitAliases.push_back(Reg);
197195
Reg->ExplicitAliases.push_back(this);
@@ -757,15 +755,16 @@ static void sortAndUniqueRegisters(CodeGenRegister::Vec &M) {
757755
M.erase(llvm::unique(M, deref<std::equal_to<>>()), M.end());
758756
}
759757

760-
CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank, Record *R)
758+
CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
759+
const Record *R)
761760
: TheDef(R), Name(std::string(R->getName())),
762761
TopoSigs(RegBank.getNumTopoSigs()), EnumValue(-1), TSFlags(0) {
763762
GeneratePressureSet = R->getValueAsBit("GeneratePressureSet");
764763
std::vector<Record *> TypeList = R->getValueAsListOfDefs("RegTypes");
765764
if (TypeList.empty())
766765
PrintFatalError(R->getLoc(), "RegTypes list must not be empty!");
767766
for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
768-
Record *Type = TypeList[i];
767+
const Record *Type = TypeList[i];
769768
if (!Type->isSubClassOf("ValueType"))
770769
PrintFatalError(R->getLoc(),
771770
"RegTypes list member '" + Type->getName() +
@@ -1168,17 +1167,17 @@ void CodeGenRegisterClass::buildRegUnitSet(
11681167
//===----------------------------------------------------------------------===//
11691168

11701169
CodeGenRegisterCategory::CodeGenRegisterCategory(CodeGenRegBank &RegBank,
1171-
Record *R)
1170+
const Record *R)
11721171
: TheDef(R), Name(std::string(R->getName())) {
1173-
for (Record *RegClass : R->getValueAsListOfDefs("Classes"))
1172+
for (const Record *RegClass : R->getValueAsListOfDefs("Classes"))
11741173
Classes.push_back(RegBank.getRegClass(RegClass));
11751174
}
11761175

11771176
//===----------------------------------------------------------------------===//
11781177
// CodeGenRegBank
11791178
//===----------------------------------------------------------------------===//
11801179

1181-
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
1180+
CodeGenRegBank::CodeGenRegBank(const RecordKeeper &Records,
11821181
const CodeGenHwModes &Modes)
11831182
: CGH(Modes) {
11841183
// Configure register Sets to understand register classes and tuples.
@@ -1189,10 +1188,8 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
11891188

11901189
// Read in the user-defined (named) sub-register indices.
11911190
// More indices will be synthesized later.
1192-
std::vector<Record *> SRIs = Records.getAllDerivedDefinitions("SubRegIndex");
1193-
llvm::sort(SRIs, LessRecord());
1194-
for (unsigned i = 0, e = SRIs.size(); i != e; ++i)
1195-
getSubRegIdx(SRIs[i]);
1191+
for (const Record *SRI : Records.getAllDerivedDefinitions("SubRegIndex"))
1192+
getSubRegIdx(SRI);
11961193
// Build composite maps from ComposedOf fields.
11971194
for (auto &Idx : SubRegIndices)
11981195
Idx.updateComponents(*this);
@@ -1223,7 +1220,7 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
12231220
getReg(Regs[i]);
12241221

12251222
// Expand tuples and number the new registers.
1226-
for (Record *R : Records.getAllDerivedDefinitions("RegisterTuples")) {
1223+
for (const Record *R : Records.getAllDerivedDefinitions("RegisterTuples")) {
12271224
std::vector<const Record *> TupRegs = *Sets.expand(R);
12281225
llvm::sort(TupRegs, LessRecordRegister());
12291226
for (const Record *RC : TupRegs)
@@ -1288,7 +1285,8 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
12881285
NumNativeRegUnits = RegUnits.size();
12891286

12901287
// Read in register class definitions.
1291-
std::vector<Record *> RCs = Records.getAllDerivedDefinitions("RegisterClass");
1288+
ArrayRef<const Record *> RCs =
1289+
Records.getAllDerivedDefinitions("RegisterClass");
12921290
if (RCs.empty())
12931291
PrintFatalError("No 'RegisterClass' subclasses defined!");
12941292

@@ -1311,9 +1309,7 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
13111309
CodeGenRegisterClass::computeSubClasses(*this);
13121310

13131311
// Read in the register category definitions.
1314-
std::vector<Record *> RCats =
1315-
Records.getAllDerivedDefinitions("RegisterCategory");
1316-
for (auto *R : RCats)
1312+
for (const Record *R : Records.getAllDerivedDefinitions("RegisterCategory"))
13171313
RegCategories.emplace_back(*this, R);
13181314
}
13191315

@@ -1324,7 +1320,7 @@ CodeGenSubRegIndex *CodeGenRegBank::createSubRegIndex(StringRef Name,
13241320
return &SubRegIndices.back();
13251321
}
13261322

1327-
CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(Record *Def) {
1323+
CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(const Record *Def) {
13281324
CodeGenSubRegIndex *&Idx = Def2SubRegIdx[Def];
13291325
if (Idx)
13301326
return Idx;
@@ -2450,7 +2446,8 @@ void CodeGenRegBank::computeInferredRegisterClasses() {
24502446
/// return null. If the register is in multiple classes, and the classes have a
24512447
/// superset-subset relationship and the same set of types, return the
24522448
/// superclass. Otherwise return null.
2453-
const CodeGenRegisterClass *CodeGenRegBank::getRegClassForRegister(Record *R) {
2449+
const CodeGenRegisterClass *
2450+
CodeGenRegBank::getRegClassForRegister(const Record *R) {
24542451
const CodeGenRegister *Reg = getReg(R);
24552452
const CodeGenRegisterClass *FoundRC = nullptr;
24562453
for (const auto &RC : getRegClasses()) {
@@ -2490,7 +2487,7 @@ const CodeGenRegisterClass *CodeGenRegBank::getRegClassForRegister(Record *R) {
24902487
}
24912488

24922489
const CodeGenRegisterClass *
2493-
CodeGenRegBank::getMinimalPhysRegClass(Record *RegRecord,
2490+
CodeGenRegBank::getMinimalPhysRegClass(const Record *RegRecord,
24942491
ValueTypeByHwMode *VT) {
24952492
const CodeGenRegister *Reg = getReg(RegRecord);
24962493
const CodeGenRegisterClass *BestRC = nullptr;

llvm/utils/TableGen/Common/CodeGenRegisters.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ struct MaskRolPair {
6363

6464
/// CodeGenSubRegIndex - Represents a sub-register index.
6565
class CodeGenSubRegIndex {
66-
Record *const TheDef;
66+
const Record *const TheDef;
6767
std::string Name;
6868
std::string Namespace;
6969

@@ -85,7 +85,7 @@ class CodeGenSubRegIndex {
8585
// indexes are not used to create new register classes.
8686
bool Artificial;
8787

88-
CodeGenSubRegIndex(Record *R, unsigned Enum, const CodeGenHwModes &CGH);
88+
CodeGenSubRegIndex(const Record *R, unsigned Enum, const CodeGenHwModes &CGH);
8989
CodeGenSubRegIndex(StringRef N, StringRef Nspace, unsigned Enum);
9090
CodeGenSubRegIndex(CodeGenSubRegIndex &) = delete;
9191

@@ -320,7 +320,7 @@ class CodeGenRegisterClass {
320320
// List of super-classes, topologocally ordered to have the larger classes
321321
// first. This is the same as sorting by EnumValue.
322322
SmallVector<CodeGenRegisterClass *, 4> SuperClasses;
323-
Record *TheDef;
323+
const Record *TheDef;
324324
std::string Name;
325325

326326
// For a synthesized class, inherit missing properties from the nearest
@@ -368,7 +368,7 @@ class CodeGenRegisterClass {
368368

369369
// Return the Record that defined this class, or NULL if the class was
370370
// created by TableGen.
371-
Record *getDef() const { return TheDef; }
371+
const Record *getDef() const { return TheDef; }
372372

373373
std::string getNamespaceQualification() const;
374374
const std::string &getName() const { return Name; }
@@ -473,7 +473,7 @@ class CodeGenRegisterClass {
473473
void buildRegUnitSet(const CodeGenRegBank &RegBank,
474474
std::vector<unsigned> &RegUnits) const;
475475

476-
CodeGenRegisterClass(CodeGenRegBank &, Record *R);
476+
CodeGenRegisterClass(CodeGenRegBank &, const Record *R);
477477
CodeGenRegisterClass(CodeGenRegisterClass &) = delete;
478478

479479
// A key representing the parts of a register class used for forming
@@ -511,17 +511,17 @@ class CodeGenRegisterClass {
511511
// register falls into (GPR, vector, fixed, etc.) without having to know
512512
// specific information about the target architecture.
513513
class CodeGenRegisterCategory {
514-
Record *TheDef;
514+
const Record *TheDef;
515515
std::string Name;
516516
std::list<CodeGenRegisterClass *> Classes;
517517

518518
public:
519-
CodeGenRegisterCategory(CodeGenRegBank &, Record *R);
519+
CodeGenRegisterCategory(CodeGenRegBank &, const Record *R);
520520
CodeGenRegisterCategory(CodeGenRegisterCategory &) = delete;
521521

522522
// Return the Record that defined this class, or NULL if the class was
523523
// created by TableGen.
524-
Record *getDef() const { return TheDef; }
524+
const Record *getDef() const { return TheDef; }
525525

526526
std::string getName() const { return Name; }
527527
std::list<CodeGenRegisterClass *> getClasses() const { return Classes; }
@@ -585,7 +585,7 @@ class CodeGenRegBank {
585585
const CodeGenHwModes &CGH;
586586

587587
std::deque<CodeGenSubRegIndex> SubRegIndices;
588-
DenseMap<Record *, CodeGenSubRegIndex *> Def2SubRegIdx;
588+
DenseMap<const Record *, CodeGenSubRegIndex *> Def2SubRegIdx;
589589

590590
CodeGenSubRegIndex *createSubRegIndex(StringRef Name, StringRef NameSpace);
591591

@@ -612,7 +612,6 @@ class CodeGenRegBank {
612612

613613
// Register categories.
614614
std::list<CodeGenRegisterCategory> RegCategories;
615-
DenseMap<Record *, CodeGenRegisterCategory *> Def2RCat;
616615
using RCatKeyMap =
617616
std::map<CodeGenRegisterClass::Key, CodeGenRegisterCategory *>;
618617
RCatKeyMap Key2RCat;
@@ -677,7 +676,7 @@ class CodeGenRegBank {
677676
void computeRegUnitLaneMasks();
678677

679678
public:
680-
CodeGenRegBank(RecordKeeper &, const CodeGenHwModes &);
679+
CodeGenRegBank(const RecordKeeper &, const CodeGenHwModes &);
681680
CodeGenRegBank(CodeGenRegBank &) = delete;
682681

683682
SetTheory &getSets() { return Sets; }
@@ -693,7 +692,7 @@ class CodeGenRegBank {
693692

694693
// Find a SubRegIndex from its Record def or add to the list if it does
695694
// not exist there yet.
696-
CodeGenSubRegIndex *getSubRegIdx(Record *);
695+
CodeGenSubRegIndex *getSubRegIdx(const Record *);
697696

698697
// Find a SubRegIndex from its Record def.
699698
const CodeGenSubRegIndex *findSubRegIdx(const Record *Def) const;
@@ -785,14 +784,15 @@ class CodeGenRegBank {
785784
/// class, return null. If the register is in multiple classes, and the
786785
/// classes have a superset-subset relationship and the same set of types,
787786
/// return the superclass. Otherwise return null.
788-
const CodeGenRegisterClass *getRegClassForRegister(Record *R);
787+
const CodeGenRegisterClass *getRegClassForRegister(const Record *R);
789788

790789
// Analog of TargetRegisterInfo::getMinimalPhysRegClass. Unlike
791790
// getRegClassForRegister, this tries to find the smallest class containing
792791
// the physical register. If \p VT is specified, it will only find classes
793792
// with a matching type
794793
const CodeGenRegisterClass *
795-
getMinimalPhysRegClass(Record *RegRecord, ValueTypeByHwMode *VT = nullptr);
794+
getMinimalPhysRegClass(const Record *RegRecord,
795+
ValueTypeByHwMode *VT = nullptr);
796796

797797
// Get the sum of unit weights.
798798
unsigned getRegUnitSetWeight(const std::vector<unsigned> &Units) const {

llvm/utils/TableGen/Common/InfoByHwMode.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ std::string llvm::getModeName(unsigned Mode) {
2828
return (Twine('m') + Twine(Mode)).str();
2929
}
3030

31-
ValueTypeByHwMode::ValueTypeByHwMode(Record *R, const CodeGenHwModes &CGH) {
31+
ValueTypeByHwMode::ValueTypeByHwMode(const Record *R,
32+
const CodeGenHwModes &CGH) {
3233
const HwModeSelect &MS = CGH.getHwModeSelect(R);
3334
for (const HwModeSelect::PairType &P : MS.Items) {
3435
auto I = Map.insert({P.first, MVT(llvm::getValueType(P.second))});
@@ -39,7 +40,8 @@ ValueTypeByHwMode::ValueTypeByHwMode(Record *R, const CodeGenHwModes &CGH) {
3940
PtrAddrSpace = R->getValueAsInt("AddrSpace");
4041
}
4142

42-
ValueTypeByHwMode::ValueTypeByHwMode(Record *R, MVT T) : ValueTypeByHwMode(T) {
43+
ValueTypeByHwMode::ValueTypeByHwMode(const Record *R, MVT T)
44+
: ValueTypeByHwMode(T) {
4345
if (R->isSubClassOf("PtrValueType"))
4446
PtrAddrSpace = R->getValueAsInt("AddrSpace");
4547
}
@@ -102,7 +104,7 @@ void ValueTypeByHwMode::writeToStream(raw_ostream &OS) const {
102104
LLVM_DUMP_METHOD
103105
void ValueTypeByHwMode::dump() const { dbgs() << *this << '\n'; }
104106

105-
ValueTypeByHwMode llvm::getValueTypeByHwMode(Record *Rec,
107+
ValueTypeByHwMode llvm::getValueTypeByHwMode(const Record *Rec,
106108
const CodeGenHwModes &CGH) {
107109
#ifndef NDEBUG
108110
if (!Rec->isSubClassOf("ValueType"))

llvm/utils/TableGen/Common/InfoByHwMode.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ template <typename InfoT> struct InfoByHwMode {
152152
};
153153

154154
struct ValueTypeByHwMode : public InfoByHwMode<MVT> {
155-
ValueTypeByHwMode(Record *R, const CodeGenHwModes &CGH);
156-
ValueTypeByHwMode(Record *R, MVT T);
155+
ValueTypeByHwMode(const Record *R, const CodeGenHwModes &CGH);
156+
ValueTypeByHwMode(const Record *R, MVT T);
157157
ValueTypeByHwMode(MVT T) { Map.insert({DefaultMode, T}); }
158158
ValueTypeByHwMode() = default;
159159

@@ -174,7 +174,8 @@ struct ValueTypeByHwMode : public InfoByHwMode<MVT> {
174174
}
175175
};
176176

177-
ValueTypeByHwMode getValueTypeByHwMode(Record *Rec, const CodeGenHwModes &CGH);
177+
ValueTypeByHwMode getValueTypeByHwMode(const Record *Rec,
178+
const CodeGenHwModes &CGH);
178179

179180
raw_ostream &operator<<(raw_ostream &OS, const ValueTypeByHwMode &T);
180181

0 commit comments

Comments
 (0)