Skip to content

Commit 683fe14

Browse files
committed
Only store direct superclasses in Record
1 parent 2a96ff4 commit 683fe14

File tree

5 files changed

+30
-73
lines changed

5 files changed

+30
-73
lines changed

llvm/include/llvm/TableGen/Record.h

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,9 +1630,9 @@ class Record {
16301630
SmallVector<AssertionInfo, 0> Assertions;
16311631
SmallVector<DumpInfo, 0> Dumps;
16321632

1633-
// All superclasses in the inheritance forest in post-order (yes, it
1633+
// Direct superclasses, which are roots of the inheritance forest (yes, it
16341634
// must be a forest; diamond-shaped inheritance is not allowed).
1635-
SmallVector<std::pair<const Record *, SMRange>, 0> SuperClasses;
1635+
SmallVector<std::pair<const Record *, SMRange>, 0> DirectSuperClasses;
16361636

16371637
// Tracks Record instances. Not owned by Record.
16381638
RecordKeeper &TrackedRecords;
@@ -1666,8 +1666,9 @@ class Record {
16661666
Record(const Record &O)
16671667
: Name(O.Name), Locs(O.Locs), TemplateArgs(O.TemplateArgs),
16681668
Values(O.Values), Assertions(O.Assertions),
1669-
SuperClasses(O.SuperClasses), TrackedRecords(O.TrackedRecords),
1670-
ID(getNewUID(O.getRecords())), Kind(O.Kind) {}
1669+
DirectSuperClasses(O.DirectSuperClasses),
1670+
TrackedRecords(O.TrackedRecords), ID(getNewUID(O.getRecords())),
1671+
Kind(O.Kind) {}
16711672

16721673
static unsigned getNewUID(RecordKeeper &RK);
16731674

@@ -1720,15 +1721,22 @@ class Record {
17201721

17211722
void getSuperClasses(
17221723
SmallVectorImpl<std::pair<const Record *, SMRange>> &Classes) const {
1723-
Classes.append(SuperClasses);
1724+
for (const auto &[SC, R] : DirectSuperClasses) {
1725+
SC->getSuperClasses(Classes);
1726+
Classes.emplace_back(SC, R);
1727+
}
17241728
}
17251729

17261730
/// Determine whether this record has the specified direct superclass.
1727-
bool hasDirectSuperClass(const Record *SuperClass) const;
1731+
bool hasDirectSuperClass(const Record *SuperClass) const {
1732+
return is_contained(make_first_range(DirectSuperClasses), SuperClass);
1733+
}
17281734

17291735
/// Append the direct superclasses of this record to Classes.
17301736
void getDirectSuperClasses(
1731-
SmallVectorImpl<std::pair<const Record *, SMRange>> &Classes) const;
1737+
SmallVectorImpl<std::pair<const Record *, SMRange>> &Classes) const {
1738+
Classes.append(DirectSuperClasses);
1739+
}
17321740

17331741
bool isTemplateArg(const Init *Name) const {
17341742
return llvm::is_contained(TemplateArgs, Name);
@@ -1796,29 +1804,32 @@ class Record {
17961804
void checkUnusedTemplateArgs();
17971805

17981806
bool isSubClassOf(const Record *R) const {
1799-
for (const auto &[SC, _] : SuperClasses)
1800-
if (SC == R)
1807+
for (const auto &[SC, _] : DirectSuperClasses) {
1808+
if (SC == R || SC->isSubClassOf(R))
18011809
return true;
1810+
}
18021811
return false;
18031812
}
18041813

18051814
bool isSubClassOf(StringRef Name) const {
1806-
for (const auto &[SC, _] : SuperClasses) {
1815+
for (const auto &[SC, _] : DirectSuperClasses) {
18071816
if (const auto *SI = dyn_cast<StringInit>(SC->getNameInit())) {
18081817
if (SI->getValue() == Name)
18091818
return true;
18101819
} else if (SC->getNameInitAsString() == Name) {
18111820
return true;
18121821
}
1822+
if (SC->isSubClassOf(Name))
1823+
return true;
18131824
}
18141825
return false;
18151826
}
18161827

1817-
void addSuperClass(const Record *R, SMRange Range) {
1828+
void addDirectSuperClass(const Record *R, SMRange Range) {
18181829
assert(!CorrespondingDefInit &&
18191830
"changing type of record after it has been referenced");
18201831
assert(!isSubClassOf(R) && "Already subclassing record!");
1821-
SuperClasses.push_back(std::make_pair(R, Range));
1832+
DirectSuperClasses.emplace_back(R, Range);
18221833
}
18231834

18241835
/// If there are any field references that refer to fields that have been

llvm/lib/TableGen/Record.cpp

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,13 +2398,8 @@ const DefInit *VarDefInit::instantiate() {
23982398

23992399
NewRec->resolveReferences(R);
24002400

2401-
// Add superclasses.
2402-
SmallVector<std::pair<const Record *, SMRange>> SCs;
2403-
Class->getSuperClasses(SCs);
2404-
for (const auto &[SC, Loc] : SCs)
2405-
NewRec->addSuperClass(SC, Loc);
2406-
2407-
NewRec->addSuperClass(
2401+
// Add superclass.
2402+
NewRec->addDirectSuperClass(
24082403
Class, SMRange(Class->getLoc().back(), Class->getLoc().back()));
24092404

24102405
// Resolve internal references and store in record keeper
@@ -2914,46 +2909,6 @@ void Record::setName(const Init *NewName) {
29142909
// this. See TGParser::ParseDef and TGParser::ParseDefm.
29152910
}
29162911

2917-
// NOTE for the next two functions:
2918-
// Superclasses are in post-order, so the final one is a direct
2919-
// superclass. All of its transitive superclases immediately precede it,
2920-
// so we can step through the direct superclasses in reverse order.
2921-
2922-
bool Record::hasDirectSuperClass(const Record *Superclass) const {
2923-
SmallVector<std::pair<const Record *, SMRange>> SCs;
2924-
getSuperClasses(SCs);
2925-
2926-
SmallVector<std::pair<const Record *, SMRange>> SSCs;
2927-
2928-
for (int I = SCs.size() - 1; I >= 0; --I) {
2929-
const Record *SC = SCs[I].first;
2930-
if (SC == Superclass)
2931-
return true;
2932-
SC->getSuperClasses(SSCs);
2933-
I -= SSCs.size();
2934-
SSCs.clear();
2935-
}
2936-
2937-
return false;
2938-
}
2939-
2940-
void Record::getDirectSuperClasses(
2941-
SmallVectorImpl<std::pair<const Record *, SMRange>> &Classes) const {
2942-
SmallVector<std::pair<const Record *, SMRange>> SCVec;
2943-
getSuperClasses(SCVec);
2944-
ArrayRef<std::pair<const Record *, SMRange>> SCs = SCVec;
2945-
2946-
SmallVector<std::pair<const Record *, SMRange>> SSCs;
2947-
2948-
while (!SCs.empty()) {
2949-
auto [SC, Range] = SCs.back();
2950-
SC->getSuperClasses(SSCs);
2951-
SCs = SCs.drop_back(1 + SSCs.size());
2952-
SSCs.clear();
2953-
Classes.emplace_back(SC, Range);
2954-
}
2955-
}
2956-
29572912
void Record::resolveReferences(Resolver &R, const RecordVal *SkipVal) {
29582913
const Init *OldName = getNameInit();
29592914
const Init *NewName = Name->resolveReferences(R);

llvm/lib/TableGen/TGParser.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -330,19 +330,10 @@ bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) {
330330

331331
// Since everything went well, we can now set the "superclass" list for the
332332
// current record.
333-
SmallVector<std::pair<const Record *, SMRange>> SCs;
334-
SC->getSuperClasses(SCs);
335-
for (const auto &[SC, Loc] : SCs) {
336-
if (CurRec->isSubClassOf(SC))
337-
return Error(SubClass.RefRange.Start,
338-
"Already subclass of '" + SC->getName() + "'!\n");
339-
CurRec->addSuperClass(SC, Loc);
340-
}
341-
342333
if (CurRec->isSubClassOf(SC))
343334
return Error(SubClass.RefRange.Start,
344335
"Already subclass of '" + SC->getName() + "'!\n");
345-
CurRec->addSuperClass(SC, SubClass.RefRange);
336+
CurRec->addDirectSuperClass(SC, SubClass.RefRange);
346337
return false;
347338
}
348339

@@ -4005,7 +3996,7 @@ bool TGParser::ParseClass() {
40053996
if (CurRec) {
40063997
// If the body was previously defined, this is an error.
40073998
SmallVector<std::pair<const Record *, SMRange>> SCs;
4008-
CurRec->getSuperClasses(SCs);
3999+
CurRec->getDirectSuperClasses(SCs);
40094000
if (!CurRec->getValues().empty() || !SCs.empty() ||
40104001
!CurRec->getTemplateArgs().empty())
40114002
return TokError("Class '" + CurRec->getNameInitAsString() +

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,9 +704,9 @@ struct TupleExpander : SetTheory::Expander {
704704

705705
// Copy Proto super-classes.
706706
SmallVector<std::pair<const Record *, SMRange>> SCs;
707-
Proto->getSuperClasses(SCs);
707+
Proto->getDirectSuperClasses(SCs);
708708
for (const auto &[Super, Loc] : SCs)
709-
NewReg->addSuperClass(Super, Loc);
709+
NewReg->addDirectSuperClass(Super, Loc);
710710

711711
// Copy Proto fields.
712712
for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {

llvm/utils/TableGen/SearchableTableEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ void SearchableTableEmitter::run(raw_ostream &OS) {
840840
for (auto &NameRec : Records.getClasses()) {
841841
const Record *Class = NameRec.second.get();
842842
SmallVector<std::pair<const Record *, SMRange>> SCs;
843-
Class->getSuperClasses(SCs);
843+
Class->getDirectSuperClasses(SCs);
844844
if (SCs.size() != 1 || !Class->isSubClassOf(SearchableTable))
845845
continue;
846846

0 commit comments

Comments
 (0)