diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2010-04-07 18:19:32 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2010-04-07 18:19:32 +0000 |
commit | 96085a36dbb9cf251c81bc150e41ea9c952c99c0 (patch) | |
tree | 11f979db3890993a7fbe28524bba4ff6870449b2 /lib/CodeGen/ExactHazardRecognizer.cpp | |
parent | 1298948c5c36e6e88cbde0abe73f7f37c3a038a6 (diff) |
Initial support for different kinds of FU reservation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100645 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ExactHazardRecognizer.cpp')
-rw-r--r-- | lib/CodeGen/ExactHazardRecognizer.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/lib/CodeGen/ExactHazardRecognizer.cpp b/lib/CodeGen/ExactHazardRecognizer.cpp index 52908edefc..af5f2892c2 100644 --- a/lib/CodeGen/ExactHazardRecognizer.cpp +++ b/lib/CodeGen/ExactHazardRecognizer.cpp @@ -45,14 +45,16 @@ ExactHazardRecognizer(const InstrItineraryData &LItinData) : } } - Scoreboard.reset(ScoreboardDepth); + ReservedScoreboard.reset(ScoreboardDepth); + RequiredScoreboard.reset(ScoreboardDepth); DEBUG(dbgs() << "Using exact hazard recognizer: ScoreboardDepth = " << ScoreboardDepth << '\n'); } void ExactHazardRecognizer::Reset() { - Scoreboard.reset(); + RequiredScoreboard.reset(); + ReservedScoreboard.reset(); } void ExactHazardRecognizer::ScoreBoard::dump() const { @@ -86,10 +88,23 @@ ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU // 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) < Scoreboard.getDepth()) && + assert(((cycle + i) < RequiredScoreboard.getDepth()) && "Scoreboard depth exceeded!"); - unsigned freeUnits = IS->getUnits() & ~Scoreboard[cycle + i]; + unsigned freeUnits = IS->getUnits(); + switch (IS->getReservationKind()) { + default: + assert(0 && "Invalid FU reservation"); + case InstrStage::Required: + // Required FUs conflict with both reserved and required ones + freeUnits &= ~ReservedScoreboard[cycle + i]; + // FALLTHROUGH + case InstrStage::Reserved: + // Reserved FUs can conflict only with required ones. + freeUnits &= ~RequiredScoreboard[cycle + i]; + break; + } + if (!freeUnits) { DEBUG(dbgs() << "*** Hazard in cycle " << (cycle + i) << ", "); DEBUG(dbgs() << "SU(" << SU->NodeNum << "): "); @@ -114,16 +129,28 @@ void ExactHazardRecognizer::EmitInstruction(SUnit *SU) { // 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), + 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) < Scoreboard.getDepth()) && + assert(((cycle + i) < RequiredScoreboard.getDepth()) && "Scoreboard depth exceeded!"); - unsigned freeUnits = IS->getUnits() & ~Scoreboard[cycle + i]; + unsigned freeUnits = IS->getUnits(); + switch (IS->getReservationKind()) { + default: + assert(0 && "Invalid FU reservation"); + case InstrStage::Required: + // Required FUs conflict with both reserved and required ones + freeUnits &= ~ReservedScoreboard[cycle + i]; + // FALLTHROUGH + case InstrStage::Reserved: + // Reserved FUs can conflict only with required ones. + freeUnits &= ~RequiredScoreboard[cycle + i]; + break; + } // reduce to a single unit unsigned freeUnit = 0; @@ -133,17 +160,21 @@ void ExactHazardRecognizer::EmitInstruction(SUnit *SU) { } while (freeUnits); assert(freeUnit && "No function unit available!"); - Scoreboard[cycle + i] |= freeUnit; + if (IS->getReservationKind() == InstrStage::Required) + RequiredScoreboard[cycle + i] |= freeUnit; + else + ReservedScoreboard[cycle + i] |= freeUnit; } // Advance the cycle to the next stage. cycle += IS->getNextCycles(); } - DEBUG(Scoreboard.dump()); + DEBUG(ReservedScoreboard.dump()); + DEBUG(RequiredScoreboard.dump()); } void ExactHazardRecognizer::AdvanceCycle() { - Scoreboard[0] = 0; - Scoreboard.advance(); + ReservedScoreboard[0] = 0; ReservedScoreboard.advance(); + RequiredScoreboard[0] = 0; RequiredScoreboard.advance(); } |