TableGen subtarget emitter cleanup.
authorAndrew Trick <atrick@apple.com>
Wed, 10 Oct 2012 05:43:13 +0000 (05:43 +0000)
committerAndrew Trick <atrick@apple.com>
Wed, 10 Oct 2012 05:43:13 +0000 (05:43 +0000)
Consistently evaluate Aliases and Sequences recursively.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165604 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenSchedule.cpp
utils/TableGen/CodeGenSchedule.h

index b9b1c293f04b98051c7119f2da532f596bae6a93..bf4f2a39445930df1b9a96aeefe2152535a0f022 100644 (file)
@@ -1449,50 +1449,57 @@ void CodeGenSchedModels::collectItinProcResources(Record *ItinClassDef) {
   }
 }
 
-
-// Collect resources for a set of read/write types and processor indices.
-void CodeGenSchedModels::collectRWResources(const IdxVec &Writes,
-                                            const IdxVec &Reads,
+void CodeGenSchedModels::collectRWResources(unsigned RWIdx, bool IsRead,
                                             const IdxVec &ProcIndices) {
-
-  for (IdxIter WI = Writes.begin(), WE = Writes.end(); WI != WE; ++WI) {
-    const CodeGenSchedRW &SchedRW = getSchedRW(*WI, /*IsRead=*/false);
-    if (SchedRW.TheDef && SchedRW.TheDef->isSubClassOf("SchedWriteRes")) {
+  const CodeGenSchedRW &SchedRW = getSchedRW(RWIdx, IsRead);
+  if (SchedRW.TheDef) {
+    if (!IsRead && SchedRW.TheDef->isSubClassOf("SchedWriteRes")) {
       for (IdxIter PI = ProcIndices.begin(), PE = ProcIndices.end();
            PI != PE; ++PI) {
         addWriteRes(SchedRW.TheDef, *PI);
       }
     }
-    for (RecIter AI = SchedRW.Aliases.begin(), AE = SchedRW.Aliases.end();
-         AI != AE; ++AI) {
-      const CodeGenSchedRW &AliasRW =
-        getSchedRW((*AI)->getValueAsDef("AliasRW"));
-      if (AliasRW.TheDef && AliasRW.TheDef->isSubClassOf("SchedWriteRes")) {
-        Record *ModelDef = AliasRW.TheDef->getValueAsDef("SchedModel");
-        addWriteRes(AliasRW.TheDef, getProcModel(ModelDef).Index);
-      }
-    }
-  }
-  for (IdxIter RI = Reads.begin(), RE = Reads.end(); RI != RE; ++RI) {
-    const CodeGenSchedRW &SchedRW = getSchedRW(*RI, /*IsRead=*/true);
-    if (SchedRW.TheDef && SchedRW.TheDef->isSubClassOf("SchedReadAdvance")) {
+    else if (IsRead && SchedRW.TheDef->isSubClassOf("SchedReadAdvance")) {
       for (IdxIter PI = ProcIndices.begin(), PE = ProcIndices.end();
            PI != PE; ++PI) {
         addReadAdvance(SchedRW.TheDef, *PI);
       }
     }
-    for (RecIter AI = SchedRW.Aliases.begin(), AE = SchedRW.Aliases.end();
-         AI != AE; ++AI) {
-      const CodeGenSchedRW &AliasRW =
-        getSchedRW((*AI)->getValueAsDef("AliasRW"));
-      if (AliasRW.TheDef && AliasRW.TheDef->isSubClassOf("SchedReadAdvance")) {
-        Record *ModelDef = AliasRW.TheDef->getValueAsDef("SchedModel");
-        addReadAdvance(AliasRW.TheDef, getProcModel(ModelDef).Index);
-      }
+  }
+  for (RecIter AI = SchedRW.Aliases.begin(), AE = SchedRW.Aliases.end();
+       AI != AE; ++AI) {
+    IdxVec AliasProcIndices;
+    if ((*AI)->getValueInit("SchedModel")->isComplete()) {
+      AliasProcIndices.push_back(
+        getProcModel((*AI)->getValueAsDef("SchedModel")).Index);
+    }
+    else
+      AliasProcIndices = ProcIndices;
+    const CodeGenSchedRW &AliasRW = getSchedRW((*AI)->getValueAsDef("AliasRW"));
+    assert(AliasRW.IsRead == IsRead && "cannot alias reads to writes");
+
+    IdxVec ExpandedRWs;
+    expandRWSequence(AliasRW.Index, ExpandedRWs, IsRead);
+    for (IdxIter SI = ExpandedRWs.begin(), SE = ExpandedRWs.end();
+         SI != SE; ++SI) {
+      collectRWResources(*SI, IsRead, AliasProcIndices);
     }
   }
 }
 
+// Collect resources for a set of read/write types and processor indices.
+void CodeGenSchedModels::collectRWResources(const IdxVec &Writes,
+                                            const IdxVec &Reads,
+                                            const IdxVec &ProcIndices) {
+
+  for (IdxIter WI = Writes.begin(), WE = Writes.end(); WI != WE; ++WI)
+    collectRWResources(*WI, /*IsRead=*/false, ProcIndices);
+
+  for (IdxIter RI = Reads.begin(), RE = Reads.end(); RI != RE; ++RI)
+    collectRWResources(*RI, /*IsRead=*/true, ProcIndices);
+}
+
+
 // Find the processor's resource units for this kind of resource.
 Record *CodeGenSchedModels::findProcResUnits(Record *ProcResKind,
                                              const CodeGenProcModel &PM) const {
index cc3a10223b3b47f7d2c8cb3346abc66b2c276304..eed058971b807a086516cb8fa6a19f1b181306f8 100644 (file)
@@ -394,6 +394,9 @@ private:
 
   void collectItinProcResources(Record *ItinClassDef);
 
+  void collectRWResources(unsigned RWIdx, bool IsRead,
+                          const IdxVec &ProcIndices);
+
   void collectRWResources(const IdxVec &Writes, const IdxVec &Reads,
                           const IdxVec &ProcIndices);