Index: include/llvm/CodeGen/MachineScheduler.h =================================================================== --- include/llvm/CodeGen/MachineScheduler.h +++ include/llvm/CodeGen/MachineScheduler.h @@ -402,7 +402,9 @@ const RegPressureTracker &getBotRPTracker() const { return BotRPTracker; } /// Get register pressure for the entire scheduling region before scheduling. - const IntervalPressure &getRegPressure() const { return RegPressure; } + ArrayRef getMaxSetPressure() const { + return RPTracker.getMaxSetPressure(); + } const std::vector &getRegionCriticalPSets() const { return RegionCriticalPSets; @@ -455,7 +457,7 @@ void updatePressureDiffs(ArrayRef LiveUses); void updateScheduledPressure(const SUnit *SU, - const std::vector &NewMaxPressure); + ArrayRef NewMaxPressure); }; //===----------------------------------------------------------------------===// Index: include/llvm/CodeGen/RegisterPressure.h =================================================================== --- include/llvm/CodeGen/RegisterPressure.h +++ include/llvm/CodeGen/RegisterPressure.h @@ -28,10 +28,6 @@ /// Base class for register pressure results. struct RegisterPressure { - /// Map of max reg pressure indexed by pressure set ID, not class ID. - std::vector MaxSetPressure; - - void dump(const TargetRegisterInfo *TRI) const; }; /// RegisterPressure computed within a region of instructions delimited by @@ -257,6 +253,8 @@ /// Pressure map indexed by pressure set ID, not class ID. std::vector CurrSetPressure; + /// Maximum region pressure map indexed by pressure set ID, not class ID. + std::vector MaxSetPressure; /// Set of live registers. LiveRegSet LiveRegs; @@ -323,9 +321,16 @@ LiveThruPressure.assign(PressureSet.begin(), PressureSet.end()); } + /// @name region pressure results + /// These properties are complete if either advance() or recede() has returned + /// true or if closeRegion() was explicitely invoked. + /// @{ ArrayRef getLiveIn() const { return LiveInRegs; } ArrayRef getLiveOut() const { return LiveOutRegs; } ArrayRef getLiveThru() const { return LiveThruPressure; } + /// Get the maximum register set pressure for the traversed region. + ArrayRef getMaxSetPressure() const { return MaxSetPressure; } + /// @} /// Get the resulting register pressure over the traversed region. /// This result is complete if either advance() or recede() has returned true, Index: lib/CodeGen/MachineScheduler.cpp =================================================================== --- lib/CodeGen/MachineScheduler.cpp +++ lib/CodeGen/MachineScheduler.cpp @@ -905,8 +905,7 @@ // Cache the list of excess pressure sets in this region. This will also track // the max pressure in the scheduled code for these sets. RegionCriticalPSets.clear(); - const std::vector &RegionPressure = - RPTracker.getPressure().MaxSetPressure; + ArrayRef RegionPressure = RPTracker.getMaxSetPressure(); for (unsigned i = 0, e = RegionPressure.size(); i < e; ++i) { unsigned Limit = RegClassInfo->getRegPressureSetLimit(i); if (RegionPressure[i] > Limit) { @@ -924,8 +923,7 @@ } void ScheduleDAGMILive:: -updateScheduledPressure(const SUnit *SU, - const std::vector &NewMaxPressure) { +updateScheduledPressure(const SUnit *SU, ArrayRef NewMaxPressure) { const PressureDiff &PDiff = getPressureDiff(SU); unsigned CritIdx = 0, CritEnd = RegionCriticalPSets.size(); for (PressureDiff::const_iterator I = PDiff.begin(), E = PDiff.end(); @@ -1203,7 +1201,7 @@ // Update top scheduled pressure. TopRPTracker.advance(); assert(TopRPTracker.getPos() == CurrentTop && "out of sync"); - updateScheduledPressure(SU, TopRPTracker.getPressure().MaxSetPressure); + updateScheduledPressure(SU, TopRPTracker.getMaxSetPressure()); } } else { @@ -1225,7 +1223,7 @@ SmallVector LiveUses; BotRPTracker.recede(&LiveUses); assert(BotRPTracker.getPos() == CurrentBottom && "out of sync"); - updateScheduledPressure(SU, BotRPTracker.getPressure().MaxSetPressure); + updateScheduledPressure(SU, BotRPTracker.getMaxSetPressure()); updatePressureDiffs(LiveUses); } } @@ -2599,7 +2597,7 @@ TryCand.SU->getInstr(), TryCand.RPDelta, DAG->getRegionCriticalPSets(), - DAG->getRegPressure().MaxSetPressure); + DAG->getMaxSetPressure()); } else { if (VerifyScheduling) { @@ -2608,7 +2606,7 @@ &DAG->getPressureDiff(TryCand.SU), TryCand.RPDelta, DAG->getRegionCriticalPSets(), - DAG->getRegPressure().MaxSetPressure); + DAG->getMaxSetPressure()); } else { RPTracker.getUpwardPressureDelta( @@ -2616,7 +2614,7 @@ DAG->getPressureDiff(TryCand.SU), TryCand.RPDelta, DAG->getRegionCriticalPSets(), - DAG->getRegPressure().MaxSetPressure); + DAG->getMaxSetPressure()); } } } Index: lib/CodeGen/RegisterPressure.cpp =================================================================== --- lib/CodeGen/RegisterPressure.cpp +++ lib/CodeGen/RegisterPressure.cpp @@ -55,18 +55,13 @@ } LLVM_DUMP_METHOD -void RegisterPressure::dump(const TargetRegisterInfo *TRI) const { - dbgs() << "Max Pressure: "; - dumpRegSetPressure(MaxSetPressure, TRI); -} - -LLVM_DUMP_METHOD void RegPressureTracker::dump() const { if (!isTopClosed() || !isBottomClosed()) { dbgs() << "Curr Pressure: "; dumpRegSetPressure(CurrSetPressure, TRI); } - P.dump(TRI); + dbgs() << "Max Pressure: "; + dumpRegSetPressure(MaxSetPressure, TRI); dbgs() << "Live In: "; for (unsigned i = 0, e = LiveInRegs.size(); i < e; ++i) dbgs() << PrintVRegOrUnit(LiveInRegs[i], TRI) << " "; @@ -95,8 +90,8 @@ unsigned Weight = PSetI.getWeight(); for (; PSetI.isValid(); ++PSetI) { CurrSetPressure[*PSetI] += Weight; - if (CurrSetPressure[*PSetI] > P.MaxSetPressure[*PSetI]) { - P.MaxSetPressure[*PSetI] = CurrSetPressure[*PSetI]; + if (CurrSetPressure[*PSetI] > MaxSetPressure[*PSetI]) { + MaxSetPressure[*PSetI] = CurrSetPressure[*PSetI]; } } } @@ -111,13 +106,11 @@ /// Clear the result so it can be used for another round of pressure tracking. void IntervalPressure::reset() { TopIdx = BottomIdx = SlotIndex(); - MaxSetPressure.clear(); } /// Clear the result so it can be used for another round of pressure tracking. void RegionPressure::reset() { TopPos = BottomPos = MachineBasicBlock::const_iterator(); - MaxSetPressure.clear(); } /// If the current top is not less than or equal to the next index, open it. @@ -161,12 +154,13 @@ CurrSetPressure.clear(); LiveThruPressure.clear(); - P.MaxSetPressure.clear(); + MaxSetPressure.clear(); if (RequireIntervals) static_cast(P).reset(); else static_cast(P).reset(); + MaxSetPressure.clear(); LiveInRegs.clear(); LiveOutRegs.clear(); @@ -202,7 +196,7 @@ CurrPos = pos; CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0); - P.MaxSetPressure = CurrSetPressure; + MaxSetPressure = CurrSetPressure; LiveRegs.PhysRegs.setUniverse(TRI->getNumRegs()); LiveRegs.VirtRegs.setUniverse(MRI->getNumVirtRegs()); @@ -430,7 +424,7 @@ // At live in discovery, unconditionally increase the high water mark. LiveInRegs.push_back(Reg); - increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg)); + increaseSetPressure(MaxSetPressure, MRI->getPressureSets(Reg)); } /// Add Reg to the live out set and increase max pressure. @@ -441,7 +435,7 @@ // At live out discovery, unconditionally increase the high water mark. LiveOutRegs.push_back(Reg); - increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg)); + increaseSetPressure(MaxSetPressure, MRI->getPressureSets(Reg)); } /// Recede across the previous instruction. If LiveUses is provided, record any @@ -762,19 +756,19 @@ // FIXME: The snapshot heap space should persist. But I'm planning to // summarize the pressure effect so we don't need to snapshot at all. std::vector SavedPressure = CurrSetPressure; - std::vector SavedMaxPressure = P.MaxSetPressure; + std::vector SavedMaxPressure = MaxSetPressure; bumpUpwardPressure(MI); computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI, LiveThruPressure); - computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets, + computeMaxPressureDelta(SavedMaxPressure, MaxSetPressure, CriticalPSets, MaxPressureLimit, Delta); assert(Delta.CriticalMax.getUnitInc() >= 0 && Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure"); // Restore the tracker's state. - P.MaxSetPressure.swap(SavedMaxPressure); + MaxSetPressure.swap(SavedMaxPressure); CurrSetPressure.swap(SavedPressure); #ifndef NDEBUG @@ -837,7 +831,7 @@ Limit += LiveThruPressure[PSetID]; unsigned POld = CurrSetPressure[PSetID]; - unsigned MOld = P.MaxSetPressure[PSetID]; + unsigned MOld = MaxSetPressure[PSetID]; unsigned MNew = MOld; // Ignore DeadDefs here because they aren't captured by PressureChange. unsigned PNew = POld + PDiffI->getUnitInc(); @@ -961,19 +955,19 @@ ArrayRef MaxPressureLimit) { // Snapshot Pressure. std::vector SavedPressure = CurrSetPressure; - std::vector SavedMaxPressure = P.MaxSetPressure; + std::vector SavedMaxPressure = MaxSetPressure; bumpDownwardPressure(MI); computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI, LiveThruPressure); - computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets, + computeMaxPressureDelta(SavedMaxPressure, MaxSetPressure, CriticalPSets, MaxPressureLimit, Delta); assert(Delta.CriticalMax.getUnitInc() >= 0 && Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure"); // Restore the tracker's state. - P.MaxSetPressure.swap(SavedMaxPressure); + MaxSetPressure.swap(SavedMaxPressure); CurrSetPressure.swap(SavedPressure); } @@ -984,12 +978,12 @@ std::vector &MaxPressureResult) { // Snapshot pressure. PressureResult = CurrSetPressure; - MaxPressureResult = P.MaxSetPressure; + MaxPressureResult = MaxSetPressure; bumpUpwardPressure(MI); // Current pressure becomes the result. Restore current pressure. - P.MaxSetPressure.swap(MaxPressureResult); + MaxSetPressure.swap(MaxPressureResult); CurrSetPressure.swap(PressureResult); } @@ -1000,11 +994,11 @@ std::vector &MaxPressureResult) { // Snapshot pressure. PressureResult = CurrSetPressure; - MaxPressureResult = P.MaxSetPressure; + MaxPressureResult = MaxSetPressure; bumpDownwardPressure(MI); // Current pressure becomes the result. Restore current pressure. - P.MaxSetPressure.swap(MaxPressureResult); + MaxSetPressure.swap(MaxPressureResult); CurrSetPressure.swap(PressureResult); } Index: lib/Target/Hexagon/HexagonMachineScheduler.cpp =================================================================== --- lib/Target/Hexagon/HexagonMachineScheduler.cpp +++ lib/Target/Hexagon/HexagonMachineScheduler.cpp @@ -546,7 +546,7 @@ RegPressureDelta RPDelta; TempTracker.getMaxPressureDelta((*I)->getInstr(), RPDelta, DAG->getRegionCriticalPSets(), - DAG->getRegPressure().MaxSetPressure); + DAG->getMaxSetPressure()); int CurrentCost = SchedulingCost(Q, *I, Candidate, RPDelta, false);