Don't crash when target has no itineraries.
authorDavid Goodwin <david_goodwin@apple.com>
Thu, 3 Sep 2009 22:48:51 +0000 (22:48 +0000)
committerDavid Goodwin <david_goodwin@apple.com>
Thu, 3 Sep 2009 22:48:51 +0000 (22:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80962 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ExactHazardRecognizer.cpp

index 2d07b76a362d69bd87efdabdec93dc0366e817f6..0ea0968820aa436585827c85d7d7bed299524f13 100644 (file)
@@ -83,71 +83,75 @@ void ExactHazardRecognizer::dumpScoreboard() {
 }
 
 ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU) {
-  unsigned cycle = 0;
-
-  // Use the itinerary for the underlying instruction to check for
-  // free FU's in the scoreboard at the appropriate future cycles.
-  unsigned idx = SU->getInstr()->getDesc().getSchedClass();
-  for (const InstrStage *IS = ItinData.beginStage(idx),
-         *E = ItinData.endStage(idx); IS != E; ++IS) {
-    // We must find one of the stage's units free for every cycle the
-    // stage is occupied. FIXME it would be more accurate to find the
-    // same unit free in all the cycles.
-    for (unsigned int i = 0; i < IS->getCycles(); ++i) {
-      assert(((cycle + i) < ScoreboardDepth) && 
-             "Scoreboard depth exceeded!");
-
-      unsigned index = getFutureIndex(cycle + i);
-      unsigned freeUnits = IS->getUnits() & ~Scoreboard[index];
-      if (!freeUnits) {
-        DEBUG(errs() << "*** Hazard in cycle " << (cycle + i) << ", ");
-        DEBUG(errs() << "SU(" << SU->NodeNum << "): ");
-        DEBUG(SU->getInstr()->dump());
-        return Hazard;
+  if (!ItinData.isEmpty()) {
+    unsigned cycle = 0;
+
+    // Use the itinerary for the underlying instruction to check for
+    // free FU's in the scoreboard at the appropriate future cycles.
+    unsigned idx = SU->getInstr()->getDesc().getSchedClass();
+    for (const InstrStage *IS = ItinData.beginStage(idx),
+           *E = ItinData.endStage(idx); IS != E; ++IS) {
+      // We must find one of the stage's units free for every cycle the
+      // stage is occupied. FIXME it would be more accurate to find the
+      // same unit free in all the cycles.
+      for (unsigned int i = 0; i < IS->getCycles(); ++i) {
+        assert(((cycle + i) < ScoreboardDepth) && 
+               "Scoreboard depth exceeded!");
+        
+        unsigned index = getFutureIndex(cycle + i);
+        unsigned freeUnits = IS->getUnits() & ~Scoreboard[index];
+        if (!freeUnits) {
+          DEBUG(errs() << "*** Hazard in cycle " << (cycle + i) << ", ");
+          DEBUG(errs() << "SU(" << SU->NodeNum << "): ");
+          DEBUG(SU->getInstr()->dump());
+          return Hazard;
+        }
       }
+      
+      // Advance the cycle to the next stage.
+      cycle += IS->getNextCycles();
     }
-
-    // Advance the cycle to the next stage.
-    cycle += IS->getNextCycles();
   }
 
   return NoHazard;
 }
     
 void ExactHazardRecognizer::EmitInstruction(SUnit *SU) {
-  unsigned cycle = 0;
-
-  // Use the itinerary for the underlying instruction to reserve FU's
-  // in the scoreboard at the appropriate future cycles.
-  unsigned idx = SU->getInstr()->getDesc().getSchedClass();
-  for (const InstrStage *IS = ItinData.beginStage(idx), 
-         *E = ItinData.endStage(idx); IS != E; ++IS) {
-    // We must reserve one of the stage's units for every cycle the
-    // stage is occupied. FIXME it would be more accurate to reserve
-    // the same unit free in all the cycles.
-    for (unsigned int i = 0; i < IS->getCycles(); ++i) {
-      assert(((cycle + i) < ScoreboardDepth) &&
-             "Scoreboard depth exceeded!");
-
-      unsigned index = getFutureIndex(cycle + i);
-      unsigned freeUnits = IS->getUnits() & ~Scoreboard[index];
-      
-      // reduce to a single unit
-      unsigned freeUnit = 0;
-      do {
-        freeUnit = freeUnits;
-        freeUnits = freeUnit & (freeUnit - 1);
-      } while (freeUnits);
-
-      assert(freeUnit && "No function unit available!");
-      Scoreboard[index] |= freeUnit;
+  if (!ItinData.isEmpty()) {
+    unsigned cycle = 0;
+
+    // Use the itinerary for the underlying instruction to reserve FU's
+    // in the scoreboard at the appropriate future cycles.
+    unsigned idx = SU->getInstr()->getDesc().getSchedClass();
+    for (const InstrStage *IS = ItinData.beginStage(idx), 
+           *E = ItinData.endStage(idx); IS != E; ++IS) {
+      // We must reserve one of the stage's units for every cycle the
+      // stage is occupied. FIXME it would be more accurate to reserve
+      // the same unit free in all the cycles.
+      for (unsigned int i = 0; i < IS->getCycles(); ++i) {
+        assert(((cycle + i) < ScoreboardDepth) &&
+               "Scoreboard depth exceeded!");
+        
+        unsigned index = getFutureIndex(cycle + i);
+        unsigned freeUnits = IS->getUnits() & ~Scoreboard[index];
+        
+        // reduce to a single unit
+        unsigned freeUnit = 0;
+        do {
+          freeUnit = freeUnits;
+          freeUnits = freeUnit & (freeUnit - 1);
+        } while (freeUnits);
+        
+        assert(freeUnit && "No function unit available!");
+        Scoreboard[index] |= freeUnit;
+      }
+
+      // Advance the cycle to the next stage.
+      cycle += IS->getNextCycles();
     }
 
-    // Advance the cycle to the next stage.
-    cycle += IS->getNextCycles();
+    DEBUG(dumpScoreboard());
   }
-
-  DEBUG(dumpScoreboard());
 }
     
 void ExactHazardRecognizer::AdvanceCycle() {