[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