[llvm-commits] [llvm] r80962 - /llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp

David Goodwin david_goodwin at apple.com
Thu Sep 3 15:48:52 PDT 2009


Author: david_goodwin
Date: Thu Sep  3 17:48:51 2009
New Revision: 80962

URL: http://llvm.org/viewvc/llvm-project?rev=80962&view=rev
Log:
Don't crash when target has no itineraries.

Modified:
    llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp

Modified: llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp?rev=80962&r1=80961&r2=80962&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp (original)
+++ llvm/trunk/lib/CodeGen/ExactHazardRecognizer.cpp Thu Sep  3 17:48:51 2009
@@ -83,71 +83,75 @@
 }
 
 ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU) {
-  unsigned cycle = 0;
+  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;
+    // 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!");
+  if (!ItinData.isEmpty()) {
+    unsigned cycle = 0;
 
-      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);
+    // 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;
+      }
 
-      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() {





More information about the llvm-commits mailing list