OSDN Git Service

When a hazard recognizer needs noops to be inserted, do so. This represents
authorChris Lattner <sabre@nondot.org>
Sun, 5 Mar 2006 23:51:47 +0000 (23:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 5 Mar 2006 23:51:47 +0000 (23:51 +0000)
noops as null pointers in the instruction sequence.

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

lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp

index 611abc3..c9455a0 100644 (file)
@@ -370,6 +370,10 @@ void ScheduleDAG::EmitNode(NodeInfo *NI) {
   NI->VRBase = VRBase;
 }
 
+void ScheduleDAG::EmitNoop() {
+  TII->insertNoop(*BB, BB->end());
+}
+
 /// EmitAll - Emit all nodes in schedule sorted order.
 ///
 void ScheduleDAG::EmitAll() {
index 19516dd..34ac7de 100644 (file)
@@ -214,7 +214,7 @@ class ScheduleDAGList : public ScheduleDAG {
 private:
   // SDNode to SUnit mapping (many to one).
   std::map<SDNode*, SUnit*> SUnitMap;
-  // The schedule.
+  // The schedule.  Null SUnit*'s represend noop instructions.
   std::vector<SUnit*> Sequence;
   // Current scheduling cycle.
   unsigned CurrCycle;
@@ -523,7 +523,7 @@ void ScheduleDAGList::ListScheduleTopDown() {
       // processors without pipeline interlocks and other cases.
       DEBUG(std::cerr << "*** Emitting noop");
       HazardRec->EmitNoop();
-      // FIXME: Add a noop to the schedule!!
+      Sequence.push_back(0);   // NULL SUnit -> noop
       ++NumNoops;
     }
   }
@@ -688,21 +688,26 @@ void ScheduleDAGList::BuildSchedUnits() {
 /// EmitSchedule - Emit the machine code in scheduled order.
 void ScheduleDAGList::EmitSchedule() {
   for (unsigned i = 0, e = Sequence.size(); i != e; i++) {
-    SDNode *N;
-    SUnit *SU = Sequence[i];
-    for (unsigned j = 0, ee = SU->FlaggedNodes.size(); j != ee; j++) {
-      N = SU->FlaggedNodes[j];
-      EmitNode(getNI(N));
+    if (SUnit *SU = Sequence[i]) {
+      for (unsigned j = 0, ee = SU->FlaggedNodes.size(); j != ee; j++) {
+        SDNode *N = SU->FlaggedNodes[j];
+        EmitNode(getNI(N));
+      }
+      EmitNode(getNI(SU->Node));
+    } else {
+      // Null SUnit* is a noop.
+      EmitNoop();
     }
-    EmitNode(getNI(SU->Node));
   }
 }
 
 /// dump - dump the schedule.
 void ScheduleDAGList::dump() const {
   for (unsigned i = 0, e = Sequence.size(); i != e; i++) {
-    SUnit *SU = Sequence[i];
-    SU->dump(&DAG, false);
+    if (SUnit *SU = Sequence[i])
+      SU->dump(&DAG, false);
+    else
+      std::cerr << "**** NOOP ****\n";
   }
 }