From: Jakob Stoklund Olesen Date: Fri, 15 Mar 2013 22:51:13 +0000 (+0000) Subject: Add SchedRW as an Instruction field. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=64110ffc9eecbe999c29ac9d9f6697447a110036;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177199 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/TableGen/Record.h b/include/llvm/TableGen/Record.h index 3cf4f1f0546..76ee69dd8db 100644 --- a/include/llvm/TableGen/Record.h +++ b/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/include/llvm/Target/Target.td b/include/llvm/Target/Target.td index 876479bf8a2..deee2eb6deb 100644 --- a/include/llvm/Target/Target.td +++ b/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/utils/TableGen/CodeGenSchedule.cpp b/utils/TableGen/CodeGenSchedule.cpp index 92408c40419..0b1fb6cd451 100644 --- a/utils/TableGen/CodeGenSchedule.cpp +++ b/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();