[llvm] r324582 - [TargetSchedule] Expose sub-units of a ProcResGroup in MCProcResourceDesc.
Clement Courbet via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 8 00:46:48 PST 2018
Author: courbet
Date: Thu Feb 8 00:46:48 2018
New Revision: 324582
URL: http://llvm.org/viewvc/llvm-project?rev=324582&view=rev
Log:
[TargetSchedule] Expose sub-units of a ProcResGroup in MCProcResourceDesc.
Summary:
Right now using a ProcResource automatically counts as usage of all
super ProcResGroups. All this is done during codegen, so there is no
way for schedulers to get this information at runtime.
This adds the information of which individual ProcRes units are
contained in a ProcResGroup in MCProcResourceDesc.
Reviewers: gchatelet
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D43023
Modified:
llvm/trunk/include/llvm/MC/MCSchedule.h
llvm/trunk/include/llvm/Target/TargetSchedule.td
llvm/trunk/utils/TableGen/SubtargetEmitter.cpp
Modified: llvm/trunk/include/llvm/MC/MCSchedule.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSchedule.h?rev=324582&r1=324581&r2=324582&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSchedule.h (original)
+++ llvm/trunk/include/llvm/MC/MCSchedule.h Thu Feb 8 00:46:48 2018
@@ -44,6 +44,11 @@ struct MCProcResourceDesc {
// an out-of-order cpus.
int BufferSize;
+ // If the resource has sub-units, a pointer to the first element of an array
+ // of `NumUnits` elements containing the ProcResourceIdx of the sub units.
+ // nullptr if the resource does not have sub-units.
+ const unsigned *SubUnitsIdxBegin;
+
bool operator==(const MCProcResourceDesc &Other) const {
return NumUnits == Other.NumUnits && SuperIdx == Other.SuperIdx
&& BufferSize == Other.BufferSize;
Modified: llvm/trunk/include/llvm/Target/TargetSchedule.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetSchedule.td?rev=324582&r1=324581&r2=324582&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetSchedule.td (original)
+++ llvm/trunk/include/llvm/Target/TargetSchedule.td Thu Feb 8 00:46:48 2018
@@ -175,8 +175,7 @@ class ProcResourceKind;
// BufferSize=1.
//
// SchedModel ties these units to a processor for any stand-alone defs
-// of this class. Instances of subclass ProcResource will be automatically
-// attached to a processor, so SchedModel is not needed.
+// of this class.
class ProcResourceUnits<ProcResourceKind kind, int num> {
ProcResourceKind Kind = kind;
int NumUnits = num;
Modified: llvm/trunk/utils/TableGen/SubtargetEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/SubtargetEmitter.cpp?rev=324582&r1=324581&r2=324582&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/SubtargetEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/SubtargetEmitter.cpp Thu Feb 8 00:46:48 2018
@@ -92,6 +92,8 @@ class SubtargetEmitter {
&ProcItinLists);
void EmitProcessorProp(raw_ostream &OS, const Record *R, StringRef Name,
char Separator);
+ void EmitProcessorResourceSubUnits(const CodeGenProcModel &ProcModel,
+ raw_ostream &OS);
void EmitProcessorResources(const CodeGenProcModel &ProcModel,
raw_ostream &OS);
Record *FindWriteResources(const CodeGenSchedRW &SchedWrite,
@@ -578,24 +580,52 @@ void SubtargetEmitter::EmitProcessorProp
OS << '\n';
}
+void SubtargetEmitter::EmitProcessorResourceSubUnits(
+ const CodeGenProcModel &ProcModel, raw_ostream &OS) {
+ OS << "\nstatic const unsigned " << ProcModel.ModelName
+ << "ProcResourceSubUnits[] = {\n"
+ << " 0, // Invalid\n";
+
+ for (unsigned i = 0, e = ProcModel.ProcResourceDefs.size(); i < e; ++i) {
+ Record *PRDef = ProcModel.ProcResourceDefs[i];
+ if (!PRDef->isSubClassOf("ProcResGroup"))
+ continue;
+ RecVec ResUnits = PRDef->getValueAsListOfDefs("Resources");
+ for (Record *RUDef : ResUnits) {
+ Record *const RU =
+ SchedModels.findProcResUnits(RUDef, ProcModel, PRDef->getLoc());
+ for (unsigned J = 0; J < RU->getValueAsInt("NumUnits"); ++J) {
+ OS << " " << ProcModel.getProcResourceIdx(RU) << ", ";
+ }
+ }
+ OS << " // " << PRDef->getName() << "\n";
+ }
+ OS << "};\n";
+}
+
void SubtargetEmitter::EmitProcessorResources(const CodeGenProcModel &ProcModel,
raw_ostream &OS) {
- OS << "\n// {Name, NumUnits, SuperIdx, IsBuffered}\n";
+ EmitProcessorResourceSubUnits(ProcModel, OS);
+
+ OS << "\n// {Name, NumUnits, SuperIdx, IsBuffered, SubUnitsIdxBegin}\n";
OS << "static const llvm::MCProcResourceDesc "
<< ProcModel.ModelName << "ProcResources" << "[] = {\n"
<< " {DBGFIELD(\"InvalidUnit\") 0, 0, 0},\n";
+ unsigned SubUnitsOffset = 1;
for (unsigned i = 0, e = ProcModel.ProcResourceDefs.size(); i < e; ++i) {
Record *PRDef = ProcModel.ProcResourceDefs[i];
Record *SuperDef = nullptr;
unsigned SuperIdx = 0;
unsigned NumUnits = 0;
+ const unsigned SubUnitsBeginOffset = SubUnitsOffset;
int BufferSize = PRDef->getValueAsInt("BufferSize");
if (PRDef->isSubClassOf("ProcResGroup")) {
RecVec ResUnits = PRDef->getValueAsListOfDefs("Resources");
for (Record *RU : ResUnits) {
NumUnits += RU->getValueAsInt("NumUnits");
+ SubUnitsOffset += NumUnits;
}
}
else {
@@ -612,8 +642,14 @@ void SubtargetEmitter::EmitProcessorReso
OS << " {DBGFIELD(\"" << PRDef->getName() << "\") ";
if (PRDef->getName().size() < 15)
OS.indent(15 - PRDef->getName().size());
- OS << NumUnits << ", " << SuperIdx << ", "
- << BufferSize << "}, // #" << i+1;
+ OS << NumUnits << ", " << SuperIdx << ", " << BufferSize << ", ";
+ if (SubUnitsBeginOffset != SubUnitsOffset) {
+ OS << ProcModel.ModelName << "ProcResourceSubUnits + "
+ << SubUnitsBeginOffset;
+ } else {
+ OS << "nullptr";
+ }
+ OS << "}, // #" << i+1;
if (SuperDef)
OS << ", Super=" << SuperDef->getName();
OS << "\n";
More information about the llvm-commits
mailing list