diff options
author | Andrew Trick <atrick@apple.com> | 2012-09-17 23:00:42 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2012-09-17 23:00:42 +0000 |
commit | e1b53287179b4b9b5c3c549586f688d3fa2ae8ef (patch) | |
tree | 3d76841b29da81f048e4a8da6149d48575efb2d8 /utils | |
parent | 419e5b9d4f8bd0e0724b7b2c2d8df0f534bc8d8d (diff) | |
download | llvm-e1b53287179b4b9b5c3c549586f688d3fa2ae8ef.tar.gz llvm-e1b53287179b4b9b5c3c549586f688d3fa2ae8ef.tar.bz2 llvm-e1b53287179b4b9b5c3c549586f688d3fa2ae8ef.tar.xz |
Revert r164061-r164067. Most of the new subtarget emitter.
I have to work out the Target/CodeGen header dependencies
before putting this back.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164072 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/CodeGenSchedule.h | 11 | ||||
-rw-r--r-- | utils/TableGen/InstrInfoEmitter.cpp | 3 | ||||
-rw-r--r-- | utils/TableGen/SubtargetEmitter.cpp | 119 |
3 files changed, 20 insertions, 113 deletions
diff --git a/utils/TableGen/CodeGenSchedule.h b/utils/TableGen/CodeGenSchedule.h index dd0bf72276..992ae82d4c 100644 --- a/utils/TableGen/CodeGenSchedule.h +++ b/utils/TableGen/CodeGenSchedule.h @@ -83,7 +83,7 @@ struct CodeGenSchedRW { #endif }; -/// Represent a transition between SchedClasses induced by SchedVariant. +/// Represent a transition between SchedClasses induced by SchedWriteVariant. struct CodeGenSchedTransition { unsigned ToClassIdx; IdxVec ProcIndices; @@ -304,6 +304,15 @@ public: return SchedClasses[Idx]; } + // Get an itinerary class's index. Value indices are '0' for NoItinerary up to + // and including numItineraryClasses(). + unsigned getItinClassIdx(Record *ItinDef) const { + assert(SchedClassIdxMap.count(ItinDef->getName()) && "missing ItinClass"); + unsigned Idx = SchedClassIdxMap.lookup(ItinDef->getName()); + assert(Idx <= NumItineraryClasses && "bad ItinClass index"); + return Idx; + } + // Get the SchedClass index for an instruction. Instructions with no // itinerary, no SchedReadWrites, and no InstrReadWrites references return 0 // for NoItinerary. diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp index 79602da92b..b41ad94aca 100644 --- a/utils/TableGen/InstrInfoEmitter.cpp +++ b/utils/TableGen/InstrInfoEmitter.cpp @@ -304,10 +304,11 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, MinOperands = Inst.Operands.back().MIOperandNo + Inst.Operands.back().MINumOperands; + Record *ItinDef = Inst.TheDef->getValueAsDef("Itinerary"); OS << " { "; OS << Num << ",\t" << MinOperands << ",\t" << Inst.Operands.NumDefs << ",\t" - << SchedModels.getSchedClassIdx(Inst) << ",\t" + << SchedModels.getItinClassIdx(ItinDef) << ",\t" << Inst.TheDef->getValueAsInt("Size") << ",\t0"; // Emit all of the target indepedent flags... diff --git a/utils/TableGen/SubtargetEmitter.cpp b/utils/TableGen/SubtargetEmitter.cpp index 9f88cc22e4..073d3ab0af 100644 --- a/utils/TableGen/SubtargetEmitter.cpp +++ b/utils/TableGen/SubtargetEmitter.cpp @@ -87,7 +87,6 @@ class SubtargetEmitter { void EmitSchedClassTables(SchedClassTables &SchedTables, raw_ostream &OS); void EmitProcessorModels(raw_ostream &OS); void EmitProcessorLookup(raw_ostream &OS); - void EmitSchedModelHelpers(std::string ClassName, raw_ostream &OS); void EmitSchedModel(raw_ostream &OS); void ParseFeaturesFunction(raw_ostream &OS, unsigned NumFeatures, unsigned NumProcs); @@ -709,7 +708,7 @@ void SubtargetEmitter::GenSchedClassTables(const CodeGenProcModel &ProcModel, SCE = SchedModels.schedClassEnd(); SCI != SCE; ++SCI) { SCTab.resize(SCTab.size() + 1); MCSchedClassDesc &SCDesc = SCTab.back(); - // SCDesc.Name is guarded by NDEBUG + SCDesc.Name = SCI->Name.c_str(); SCDesc.NumMicroOps = 0; SCDesc.BeginGroup = false; SCDesc.EndGroup = false; @@ -1020,15 +1019,6 @@ void SubtargetEmitter::EmitProcessorModels(raw_ostream &OS) { EmitProcessorProp(OS, PI->ModelDef, "LoadLatency", ','); EmitProcessorProp(OS, PI->ModelDef, "HighLatency", ','); EmitProcessorProp(OS, PI->ModelDef, "MispredictPenalty", ','); - OS << " " << PI->Index << ", // Processor ID\n"; - if (PI->hasInstrSchedModel()) - OS << " " << PI->ModelName << "ProcResources" << ",\n" - << " " << PI->ModelName << "SchedClasses" << ",\n" - << " " << PI->ProcResourceDefs.size()+1 << ",\n" - << " " << (SchedModels.schedClassEnd() - - SchedModels.schedClassBegin()) << ",\n"; - else - OS << " 0, 0, 0, 0, // No instruction-level machine model.\n"; if (SchedModels.hasItineraryClasses()) OS << " " << PI->ItinsDef->getName() << ");\n"; else @@ -1110,85 +1100,6 @@ void SubtargetEmitter::EmitSchedModel(raw_ostream &OS) { OS << "#undef DBGFIELD"; } -void SubtargetEmitter::EmitSchedModelHelpers(std::string ClassName, - raw_ostream &OS) { - OS << "unsigned " << ClassName - << "\n::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI," - << " const TargetSchedModel *SchedModel) const {\n"; - - std::vector<Record*> Prologs = Records.getAllDerivedDefinitions("PredicateProlog"); - std::sort(Prologs.begin(), Prologs.end(), LessRecord()); - for (std::vector<Record*>::const_iterator - PI = Prologs.begin(), PE = Prologs.end(); PI != PE; ++PI) { - OS << (*PI)->getValueAsString("Code") << '\n'; - } - IdxVec VariantClasses; - for (CodeGenSchedModels::SchedClassIter SCI = SchedModels.schedClassBegin(), - SCE = SchedModels.schedClassEnd(); SCI != SCE; ++SCI) { - if (SCI->Transitions.empty()) - continue; - VariantClasses.push_back(SCI - SchedModels.schedClassBegin()); - } - if (!VariantClasses.empty()) { - OS << " switch (SchedClass) {\n"; - for (IdxIter VCI = VariantClasses.begin(), VCE = VariantClasses.end(); - VCI != VCE; ++VCI) { - const CodeGenSchedClass &SC = SchedModels.getSchedClass(*VCI); - OS << " case " << *VCI << ": // " << SC.Name << '\n'; - IdxVec ProcIndices; - for (std::vector<CodeGenSchedTransition>::const_iterator - TI = SC.Transitions.begin(), TE = SC.Transitions.end(); - TI != TE; ++TI) { - IdxVec PI; - std::set_union(TI->ProcIndices.begin(), TI->ProcIndices.end(), - ProcIndices.begin(), ProcIndices.end(), - std::back_inserter(PI)); - ProcIndices.swap(PI); - } - for (IdxIter PI = ProcIndices.begin(), PE = ProcIndices.end(); - PI != PE; ++PI) { - OS << " "; - if (*PI != 0) - OS << "if (SchedModel->getProcessorID() == " << *PI << ") "; - OS << "{ // " << (SchedModels.procModelBegin() + *PI)->ModelName - << '\n'; - for (std::vector<CodeGenSchedTransition>::const_iterator - TI = SC.Transitions.begin(), TE = SC.Transitions.end(); - TI != TE; ++TI) { - OS << " if ("; - if (*PI != 0 && !std::count(TI->ProcIndices.begin(), - TI->ProcIndices.end(), *PI)) { - continue; - } - for (RecIter RI = TI->PredTerm.begin(), RE = TI->PredTerm.end(); - RI != RE; ++RI) { - if (RI != TI->PredTerm.begin()) - OS << "\n && "; - OS << "(" << (*RI)->getValueAsString("Predicate") << ")"; - } - OS << ")\n" - << " return " << TI->ToClassIdx << "; // " - << SchedModels.getSchedClass(TI->ToClassIdx).Name << '\n'; - } - OS << " }\n"; - if (*PI == 0) - break; - } - unsigned SCIdx = 0; - if (SC.ItinClassDef) - SCIdx = SchedModels.getSchedClassIdxForItin(SC.ItinClassDef); - else - SCIdx = SchedModels.findSchedClassIdx(SC.Writes, SC.Reads); - if (SCIdx != *VCI) - OS << " return " << SCIdx << ";\n"; - OS << " break;\n"; - } - OS << " };\n"; - } - OS << " report_fatal_error(\"Expected a variant SchedClass\");\n" - << "} // " << ClassName << "::resolveSchedClass\n"; -} - // // ParseFeaturesFunction - Produces a subtarget specific function for parsing // the subtarget features string. @@ -1213,8 +1124,7 @@ void SubtargetEmitter::ParseFeaturesFunction(raw_ostream &OS, return; } - OS << " InitMCProcessorInfo(CPU, FS);\n" - << " uint64_t Bits = getFeatureBits();\n"; + OS << " uint64_t Bits = ReInitMCSubtargetInfo(CPU, FS);\n"; for (unsigned i = 0; i < Features.size(); i++) { // Next record @@ -1282,17 +1192,13 @@ void SubtargetEmitter::run(raw_ostream &OS) { else OS << "0, "; OS << '\n'; OS.indent(22); - OS << Target << "ProcSchedKV, " - << Target << "WriteProcResTable, " - << Target << "WriteLatencyTable, " - << Target << "ReadAdvanceTable, "; if (SchedModels.hasItineraryClasses()) { - OS << '\n'; OS.indent(22); - OS << Target << "Stages, " + OS << Target << "ProcSchedKV, " + << Target << "Stages, " << Target << "OperandCycles, " << Target << "ForwardingPaths, "; } else - OS << "0, 0, 0, "; + OS << "0, 0, 0, 0, "; OS << NumFeatures << ", " << NumProcs << ");\n}\n\n"; OS << "} // End llvm namespace \n"; @@ -1319,8 +1225,6 @@ void SubtargetEmitter::run(raw_ostream &OS) { << " explicit " << ClassName << "(StringRef TT, StringRef CPU, " << "StringRef FS);\n" << "public:\n" - << " unsigned resolveSchedClass(unsigned SchedClass, const MachineInstr *DefMI," - << " const TargetSchedModel *SchedModel) const;\n" << " DFAPacketizer *createDFAPacketizer(const InstrItineraryData *IID)" << " const;\n" << "};\n"; @@ -1360,22 +1264,15 @@ void SubtargetEmitter::run(raw_ostream &OS) { OS << Target << "SubTypeKV, "; else OS << "0, "; - OS << '\n'; OS.indent(22); - OS << Target << "ProcSchedKV, " - << Target << "WriteProcResTable, " - << Target << "WriteLatencyTable, " - << Target << "ReadAdvanceTable, "; - OS << '\n'; OS.indent(22); if (SchedModels.hasItineraryClasses()) { - OS << Target << "Stages, " + OS << Target << "ProcSchedKV, " + << Target << "Stages, " << Target << "OperandCycles, " << Target << "ForwardingPaths, "; } else - OS << "0, 0, 0, "; + OS << "0, 0, 0, 0, "; OS << NumFeatures << ", " << NumProcs << ");\n}\n\n"; - EmitSchedModelHelpers(ClassName, OS); - OS << "} // End llvm namespace \n"; OS << "#endif // GET_SUBTARGETINFO_CTOR\n\n"; |