From a4a361df5b4cac952e725792938f0b4ef823393b Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 15 Mar 2013 22:51:13 +0000 Subject: [PATCH] Add SchedRW as an Instruction field. Don't require instructions to inherit Sched<...>. Sometimes it is more convenient to say: let SchedRW = ... in { ... } Which is now possible. llvm-svn: 177199 --- llvm/include/llvm/TableGen/Record.h | 5 +++++ llvm/include/llvm/Target/Target.td | 3 +++ llvm/utils/TableGen/CodeGenSchedule.cpp | 12 ++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h index 3cf4f1f05465..76ee69dd8dbd 100644 --- a/llvm/include/llvm/TableGen/Record.h +++ b/llvm/include/llvm/TableGen/Record.h @@ -1559,6 +1559,11 @@ public: /// Init *getValueInit(StringRef FieldName) const; + /// Return true if the named field is unset. + bool isValueUnset(StringRef FieldName) const { + return getValueInit(FieldName) == UnsetInit::get(); + } + /// getValueAsString - This method looks up the specified field and returns /// its value as a string, throwing an exception if the field does not exist /// or if the value is not a string. diff --git a/llvm/include/llvm/Target/Target.td b/llvm/include/llvm/Target/Target.td index 876479bf8a22..deee2eb6debf 100644 --- a/llvm/include/llvm/Target/Target.td +++ b/llvm/include/llvm/Target/Target.td @@ -397,6 +397,9 @@ class Instruction { InstrItinClass Itinerary = NoItinerary;// Execution steps used for scheduling. + // Scheduling information from TargetSchedule.td. + list SchedRW; + string Constraints = ""; // OperandConstraint, e.g. $src = $dst. /// DisableEncoding - List of operand names (e.g. "$op1,$op2") that should not diff --git a/llvm/utils/TableGen/CodeGenSchedule.cpp b/llvm/utils/TableGen/CodeGenSchedule.cpp index 92408c404196..0b1fb6cd4513 100644 --- a/llvm/utils/TableGen/CodeGenSchedule.cpp +++ b/llvm/utils/TableGen/CodeGenSchedule.cpp @@ -217,7 +217,7 @@ void CodeGenSchedModels::collectSchedRW() { for (CodeGenTarget::inst_iterator I = Target.inst_begin(), E = Target.inst_end(); I != E; ++I) { Record *SchedDef = (*I)->TheDef; - if (!SchedDef->isSubClassOf("Sched")) + if (SchedDef->isValueUnset("SchedRW")) continue; RecVec RWs = SchedDef->getValueAsListOfDefs("SchedRW"); for (RecIter RWI = RWs.begin(), RWE = RWs.end(); RWI != RWE; ++RWI) { @@ -529,7 +529,7 @@ void CodeGenSchedModels::collectSchedClasses() { // instruction definition that inherits from class Sched. for (CodeGenTarget::inst_iterator I = Target.inst_begin(), E = Target.inst_end(); I != E; ++I) { - if (!(*I)->TheDef->isSubClassOf("Sched")) + if ((*I)->TheDef->isValueUnset("SchedRW")) continue; IdxVec Writes, Reads; findRWs((*I)->TheDef->getValueAsListOfDefs("SchedRW"), Writes, Reads); @@ -553,7 +553,7 @@ void CodeGenSchedModels::collectSchedClasses() { E = Target.inst_end(); I != E; ++I) { Record *SchedDef = (*I)->TheDef; std::string InstName = (*I)->TheDef->getName(); - if (SchedDef->isSubClassOf("Sched")) { + if (!SchedDef->isValueUnset("SchedRW")) { IdxVec Writes; IdxVec Reads; findRWs((*I)->TheDef->getValueAsListOfDefs("SchedRW"), Writes, Reads); @@ -584,7 +584,7 @@ void CodeGenSchedModels::collectSchedClasses() { } continue; } - if (!SchedDef->isSubClassOf("Sched") + if (SchedDef->isValueUnset("SchedRW") && (SchedDef->getValueAsDef("Itinerary")->getName() == "NoItinerary")) { dbgs() << "No machine model for " << (*I)->TheDef->getName() << '\n'; } @@ -627,7 +627,7 @@ unsigned CodeGenSchedModels::getSchedClassIdx( // If this opcode isn't mapped by the subtarget fallback to the instruction // definition's SchedRW or ItinDef values. - if (Inst.TheDef->isSubClassOf("Sched")) { + if (!Inst.TheDef->isValueUnset("SchedRW")) { RecVec RWs = Inst.TheDef->getValueAsListOfDefs("SchedRW"); return getSchedClassIdx(RWs); } @@ -719,7 +719,7 @@ void CodeGenSchedModels::createInstRWClass(Record *InstRWDef) { // class because that is the fall-back class for other processors. Record *ItinDef = (*I)->getValueAsDef("Itinerary"); SCIdx = SchedClassIdxMap.lookup(ItinDef->getName()); - if (!SCIdx && (*I)->isSubClassOf("Sched")) + if (!SCIdx && !(*I)->isValueUnset("SchedRW")) SCIdx = getSchedClassIdx((*I)->getValueAsListOfDefs("SchedRW")); } unsigned CIdx = 0, CEnd = ClassInstrs.size();