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

Chris Lattner clattner at apple.com
Mon Sep 7 15:24:24 PDT 2009


On Sep 3, 2009, at 3:48 PM, David Goodwin wrote:

> 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.

Hi David,

How about using "if (ItinData.isEmpty()) return;" to reduce nesting?

-Chris

>
> 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() {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list