Add SchedRW as an Instruction field.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 15 Mar 2013 22:51:13 +0000 (22:51 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 15 Mar 2013 22:51:13 +0000 (22:51 +0000)
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

include/llvm/TableGen/Record.h
include/llvm/Target/Target.td
utils/TableGen/CodeGenSchedule.cpp

index 3cf4f1f054658b87f5dd77b3353e3476474331c1..76ee69dd8dbd0e1312a706012b6637391a3b97ef 100644 (file)
@@ -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.
index 876479bf8a22e118d9184657b8ce1c8bc16f0316..deee2eb6debf52e33250f2196a3e3ff5b331833f 100644 (file)
@@ -397,6 +397,9 @@ class Instruction {
 
   InstrItinClass Itinerary = NoItinerary;// Execution steps used for scheduling.
 
+  // Scheduling information from TargetSchedule.td.
+  list<SchedReadWrite> SchedRW;
+
   string Constraints = "";  // OperandConstraint, e.g. $src = $dst.
 
   /// DisableEncoding - List of operand names (e.g. "$op1,$op2") that should not
index 92408c4041969b1a779a26eea6292e2d197a9d85..0b1fb6cd45139e4e5b31c9bb1f14f11c1a42de86 100644 (file)
@@ -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();