X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FExactHazardRecognizer.cpp;h=36925b1ff375afced57867b0d20d849be95daa91;hb=f648125be9385a0d4abfd5e77ea3dd40694c4c07;hp=5a89d223598ddd2350fd16b115f3d6c831d56cc2;hpb=d4d415a1e72dbcf4e123c2c383c9fdfc71b03f06;p=oota-llvm.git diff --git a/lib/CodeGen/ExactHazardRecognizer.cpp b/lib/CodeGen/ExactHazardRecognizer.cpp index 5a89d223598..36925b1ff37 100644 --- a/lib/CodeGen/ExactHazardRecognizer.cpp +++ b/lib/CodeGen/ExactHazardRecognizer.cpp @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "exact-hazards" +#define DEBUG_TYPE "post-RA-sched" #include "ExactHazardRecognizer.h" #include "llvm/CodeGen/ScheduleHazardRecognizer.h" #include "llvm/Support/Debug.h" @@ -20,9 +20,10 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetInstrItineraries.h" -namespace llvm { +using namespace llvm; -ExactHazardRecognizer::ExactHazardRecognizer(const InstrItineraryData &LItinData) : +ExactHazardRecognizer:: +ExactHazardRecognizer(const InstrItineraryData &LItinData) : ScheduleHazardRecognizer(), ItinData(LItinData) { // Determine the maximum depth of any itinerary. This determines the @@ -31,15 +32,14 @@ ExactHazardRecognizer::ExactHazardRecognizer(const InstrItineraryData &LItinData ScoreboardDepth = 1; if (!ItinData.isEmpty()) { for (unsigned idx = 0; ; ++idx) { - // If the begin stage of an itinerary has 0 cycles and units, - // then we have reached the end of the itineraries. - const InstrStage *IS = ItinData.begin(idx), *E = ItinData.end(idx); - if ((IS->Cycles == 0) && (IS->Units == 0)) + if (ItinData.isEndMarker(idx)) break; + const InstrStage *IS = ItinData.beginStage(idx); + const InstrStage *E = ItinData.endStage(idx); unsigned ItinDepth = 0; for (; IS != E; ++IS) - ItinDepth += IS->Cycles; + ItinDepth += IS->getCycles(); ScoreboardDepth = std::max(ScoreboardDepth, ItinDepth); } @@ -49,11 +49,11 @@ ExactHazardRecognizer::ExactHazardRecognizer(const InstrItineraryData &LItinData ScoreboardHead = 0; DEBUG(errs() << "Using exact hazard recognizer: ScoreboardDepth = " - << ScoreboardDepth << '\n'); + << ScoreboardDepth << '\n'); } ExactHazardRecognizer::~ExactHazardRecognizer() { - delete Scoreboard; + delete [] Scoreboard; } void ExactHazardRecognizer::Reset() { @@ -82,49 +82,60 @@ void ExactHazardRecognizer::dumpScoreboard() { } ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU) { + if (ItinData.isEmpty()) + return NoHazard; + 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.begin(idx), *E = ItinData.end(idx); - IS != E; ++IS) { + 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. - for (unsigned int i = 0; i < IS->Cycles; ++i) { - assert((cycle < ScoreboardDepth) && "Scoreboard depth exceeded!"); - - unsigned index = getFutureIndex(cycle); - unsigned freeUnits = IS->Units & ~Scoreboard[index]; + // 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 << ", "); + DEBUG(errs() << "*** Hazard in cycle " << (cycle + i) << ", "); DEBUG(errs() << "SU(" << SU->NodeNum << "): "); DEBUG(SU->getInstr()->dump()); return Hazard; } - - ++cycle; } + + // Advance the cycle to the next stage. + cycle += IS->getNextCycles(); } return NoHazard; } void ExactHazardRecognizer::EmitInstruction(SUnit *SU) { + if (ItinData.isEmpty()) + return; + 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.begin(idx), *E = ItinData.end(idx); - IS != E; ++IS) { + 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. - for (unsigned int i = 0; i < IS->Cycles; ++i) { - assert((cycle < ScoreboardDepth) && "Scoreboard depth exceeded!"); - - unsigned index = getFutureIndex(cycle); - unsigned freeUnits = IS->Units & ~Scoreboard[index]; + // 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; @@ -132,13 +143,15 @@ void ExactHazardRecognizer::EmitInstruction(SUnit *SU) { freeUnit = freeUnits; freeUnits = freeUnit & (freeUnit - 1); } while (freeUnits); - + assert(freeUnit && "No function unit available!"); Scoreboard[index] |= freeUnit; - ++cycle; } + + // Advance the cycle to the next stage. + cycle += IS->getNextCycles(); } - + DEBUG(dumpScoreboard()); } @@ -146,5 +159,3 @@ void ExactHazardRecognizer::AdvanceCycle() { Scoreboard[ScoreboardHead] = 0; ScoreboardHead = getFutureIndex(1); } - -} /* namespace llvm */