Skip to content

Commit 67beebf

Browse files
[TableGen][SubtargetEmitter] Refactor hasReadOfWrite to CodeGenProcModel (#92032)
SubtargetEmitter::GenSchedClassTables takes a CodeGenProcModel, but calls hasReadOfWrite which loops over all ProcModels. We move hasReadOfWrite to CodeGenProcModel and remove the loop over all ProcModels. This leads to a 144% speedup on the RISC-V backend of our downstream.
1 parent f918c05 commit 67beebf

File tree

3 files changed

+13
-18
lines changed

3 files changed

+13
-18
lines changed

llvm/utils/TableGen/Common/CodeGenSchedule.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -746,18 +746,6 @@ unsigned CodeGenSchedModels::getSchedRWIdx(const Record *Def,
746746
return I == RWVec.end() ? 0 : std::distance(RWVec.begin(), I);
747747
}
748748

749-
bool CodeGenSchedModels::hasReadOfWrite(Record *WriteDef) const {
750-
for (auto &ProcModel : ProcModels) {
751-
const RecVec &RADefs = ProcModel.ReadAdvanceDefs;
752-
for (auto &RADef : RADefs) {
753-
RecVec ValidWrites = RADef->getValueAsListOfDefs("ValidWrites");
754-
if (is_contained(ValidWrites, WriteDef))
755-
return true;
756-
}
757-
}
758-
return false;
759-
}
760-
761749
static void splitSchedReadWrites(const RecVec &RWDefs, RecVec &WriteDefs,
762750
RecVec &ReadDefs) {
763751
for (Record *RWDef : RWDefs) {
@@ -2226,6 +2214,15 @@ bool CodeGenProcModel::isUnsupported(const CodeGenInstruction &Inst) const {
22262214
return false;
22272215
}
22282216

2217+
bool CodeGenProcModel::hasReadOfWrite(Record *WriteDef) const {
2218+
for (auto &RADef : ReadAdvanceDefs) {
2219+
RecVec ValidWrites = RADef->getValueAsListOfDefs("ValidWrites");
2220+
if (is_contained(ValidWrites, WriteDef))
2221+
return true;
2222+
}
2223+
return false;
2224+
}
2225+
22292226
#ifndef NDEBUG
22302227
void CodeGenProcModel::dump() const {
22312228
dbgs() << Index << ": " << ModelName << " "

llvm/utils/TableGen/Common/CodeGenSchedule.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ struct CodeGenProcModel {
277277

278278
bool isUnsupported(const CodeGenInstruction &Inst) const;
279279

280+
// Return true if the given write record is referenced by a ReadAdvance.
281+
bool hasReadOfWrite(Record *WriteDef) const;
282+
280283
#ifndef NDEBUG
281284
void dump() const;
282285
#endif
@@ -536,9 +539,6 @@ class CodeGenSchedModels {
536539

537540
unsigned getSchedRWIdx(const Record *Def, bool IsRead) const;
538541

539-
// Return true if the given write record is referenced by a ReadAdvance.
540-
bool hasReadOfWrite(Record *WriteDef) const;
541-
542542
// Get a SchedClass from its index.
543543
CodeGenSchedClass &getSchedClass(unsigned Idx) {
544544
assert(Idx < SchedClasses.size() && "bad SchedClass index");

llvm/utils/TableGen/SubtargetEmitter.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,10 +1122,8 @@ void SubtargetEmitter::GenSchedClassTables(const CodeGenProcModel &ProcModel,
11221122
WriterNames.push_back(SchedModels.getSchedWrite(WriteID).Name);
11231123
// If this Write is not referenced by a ReadAdvance, don't distinguish it
11241124
// from other WriteLatency entries.
1125-
if (!SchedModels.hasReadOfWrite(
1126-
SchedModels.getSchedWrite(WriteID).TheDef)) {
1125+
if (!ProcModel.hasReadOfWrite(SchedModels.getSchedWrite(WriteID).TheDef))
11271126
WriteID = 0;
1128-
}
11291127
WLEntry.WriteResourceID = WriteID;
11301128

11311129
for (unsigned WS : WriteSeq) {

0 commit comments

Comments
 (0)