Allow a zero cycle stage to reserve/require a FU without advancing the cycle counter.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78736 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/ExactHazardRecognizer.cpp b/lib/CodeGen/ExactHazardRecognizer.cpp
index 5a89d22..48043f2 100644
--- a/lib/CodeGen/ExactHazardRecognizer.cpp
+++ b/lib/CodeGen/ExactHazardRecognizer.cpp
@@ -39,7 +39,7 @@
 
       unsigned ItinDepth = 0;
       for (; IS != E; ++IS)
-        ItinDepth += IS->Cycles;
+        ItinDepth += std::max(1U, IS->Cycles);
 
       ScoreboardDepth = std::max(ScoreboardDepth, ItinDepth);
     }
@@ -89,9 +89,13 @@
   unsigned idx = SU->getInstr()->getDesc().getSchedClass();
   for (const InstrStage *IS = ItinData.begin(idx), *E = ItinData.end(idx);
        IS != E; ++IS) {
+    // If the stages cycles are 0, then we must have the FU free in
+    // the current cycle, but we don't advance the cycle time .
+    unsigned StageCycles = std::max(1U, IS->Cycles);
+
     // We must find one of the stage's units free for every cycle the
     // stage is occupied.
-    for (unsigned int i = 0; i < IS->Cycles; ++i) {
+    for (unsigned int i = 0; i < StageCycles; ++i) {
       assert((cycle < ScoreboardDepth) && "Scoreboard depth exceeded!");
 
       unsigned index = getFutureIndex(cycle);
@@ -103,7 +107,8 @@
         return Hazard;
       }
 
-      ++cycle;
+      if (IS->Cycles > 0)
+        ++cycle;
     }
   }
 
@@ -118,9 +123,13 @@
   unsigned idx = SU->getInstr()->getDesc().getSchedClass();
   for (const InstrStage *IS = ItinData.begin(idx), *E = ItinData.end(idx);
        IS != E; ++IS) {
+    // If the stages cycles are 0, then we must reserve the FU in the
+    // current cycle, but we don't advance the cycle time .
+    unsigned StageCycles = std::max(1U, IS->Cycles);
+
     // We must reserve one of the stage's units for every cycle the
     // stage is occupied.
-    for (unsigned int i = 0; i < IS->Cycles; ++i) {
+    for (unsigned int i = 0; i < StageCycles; ++i) {
       assert((cycle < ScoreboardDepth) && "Scoreboard depth exceeded!");
 
       unsigned index = getFutureIndex(cycle);
@@ -135,7 +144,9 @@
 
       assert(freeUnit && "No function unit available!");
       Scoreboard[index] |= freeUnit;
-      ++cycle;
+      
+      if (IS->Cycles > 0)
+        ++cycle;
     }
   }