Skip to content
This repository was archived by the owner on Jan 1, 2023. It is now read-only.

Commit 0866a2f

Browse files
committed
[Tablegen] SubtargetEmitter: move the logic that prints predicates for variant scheduling classes to helper functions. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330968 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 6a3abbf commit 0866a2f

File tree

1 file changed

+47
-21
lines changed

1 file changed

+47
-21
lines changed

utils/TableGen/SubtargetEmitter.cpp

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,26 +1443,64 @@ void SubtargetEmitter::EmitSchedModel(raw_ostream &OS) {
14431443
OS << "\n#undef DBGFIELD";
14441444
}
14451445

1446+
static void emitPredicateProlog(const RecordKeeper &Records, raw_ostream &OS) {
1447+
std::string Buffer;
1448+
raw_string_ostream Stream(Buffer);
1449+
1450+
// Collect all the PredicateProlog records and print them to the output
1451+
// stream.
1452+
std::vector<Record *> Prologs =
1453+
Records.getAllDerivedDefinitions("PredicateProlog");
1454+
llvm::sort(Prologs.begin(), Prologs.end(), LessRecord());
1455+
for (Record *P : Prologs)
1456+
Stream << P->getValueAsString("Code") << '\n';
1457+
1458+
Stream.flush();
1459+
OS << Buffer;
1460+
}
1461+
1462+
static void emitPredicates(const CodeGenSchedTransition &T,
1463+
const CodeGenSchedClass &SC, unsigned ProcIdx,
1464+
raw_ostream &OS) {
1465+
if (ProcIdx && !count(T.ProcIndices, ProcIdx))
1466+
return;
1467+
1468+
std::string Buffer;
1469+
raw_string_ostream Stream(Buffer);
1470+
Stream << " if (";
1471+
for (RecIter RI = T.PredTerm.begin(), RE = T.PredTerm.end(); RI != RE; ++RI) {
1472+
if (RI != T.PredTerm.begin())
1473+
Stream << "\n && ";
1474+
Stream << "(" << (*RI)->getValueAsString("Predicate") << ")";
1475+
}
1476+
1477+
Stream << ")\n"
1478+
<< " return " << T.ToClassIdx << "; // " << SC.Name << '\n';
1479+
Stream.flush();
1480+
OS << Buffer;
1481+
}
1482+
14461483
void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
14471484
raw_ostream &OS) {
14481485
OS << "unsigned " << ClassName
14491486
<< "\n::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI,"
14501487
<< " const TargetSchedModel *SchedModel) const {\n";
14511488

1452-
std::vector<Record*> Prologs = Records.getAllDerivedDefinitions("PredicateProlog");
1453-
llvm::sort(Prologs.begin(), Prologs.end(), LessRecord());
1454-
for (Record *P : Prologs) {
1455-
OS << P->getValueAsString("Code") << '\n';
1456-
}
1489+
// Emit the predicate prolog code.
1490+
emitPredicateProlog(Records, OS);
1491+
1492+
// Collect Variant Classes.
14571493
IdxVec VariantClasses;
14581494
for (const CodeGenSchedClass &SC : SchedModels.schedClasses()) {
14591495
if (SC.Transitions.empty())
14601496
continue;
14611497
VariantClasses.push_back(SC.Index);
14621498
}
1499+
14631500
if (!VariantClasses.empty()) {
14641501
OS << " switch (SchedClass) {\n";
14651502
for (unsigned VC : VariantClasses) {
1503+
// Emit code for each variant scheduling class.
14661504
const CodeGenSchedClass &SC = SchedModels.getSchedClass(VC);
14671505
OS << " case " << VC << ": // " << SC.Name << '\n';
14681506
IdxVec ProcIndices;
@@ -1479,22 +1517,10 @@ void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
14791517
OS << "if (SchedModel->getProcessorID() == " << PI << ") ";
14801518
OS << "{ // " << (SchedModels.procModelBegin() + PI)->ModelName
14811519
<< '\n';
1482-
for (const CodeGenSchedTransition &T : SC.Transitions) {
1483-
if (PI != 0 && !std::count(T.ProcIndices.begin(),
1484-
T.ProcIndices.end(), PI)) {
1485-
continue;
1486-
}
1487-
OS << " if (";
1488-
for (RecIter RI = T.PredTerm.begin(), RE = T.PredTerm.end();
1489-
RI != RE; ++RI) {
1490-
if (RI != T.PredTerm.begin())
1491-
OS << "\n && ";
1492-
OS << "(" << (*RI)->getValueAsString("Predicate") << ")";
1493-
}
1494-
OS << ")\n"
1495-
<< " return " << T.ToClassIdx << "; // "
1496-
<< SchedModels.getSchedClass(T.ToClassIdx).Name << '\n';
1497-
}
1520+
1521+
for (const CodeGenSchedTransition &T : SC.Transitions)
1522+
emitPredicates(T, SchedModels.getSchedClass(T.ToClassIdx), PI, OS);
1523+
14981524
OS << " }\n";
14991525
if (PI == 0)
15001526
break;

0 commit comments

Comments
 (0)