/// This is the fast version of querying register pressure that does not /// directly depend on current liveness. /// /// @param Delta captures information needed for heuristics. /// /// @param CriticalPSets Are the pressure sets that are known to exceed some /// limit within the region, not necessarily at the current position. /// /// @param MaxPressureLimit Is the max pressure within the region, not /// necessarily at the current position. void RegPressureTracker:: getUpwardPressureDelta(const MachineInstr *MI, /*const*/ PressureDiff &PDiff, RegPressureDelta &Delta, ArrayRef<PressureChange> CriticalPSets, ArrayRef<unsigned> MaxPressureLimit) const { unsigned CritIdx = 0, CritEnd = CriticalPSets.size(); for (PressureDiff::const_iterator PDiffI = PDiff.begin(), PDiffE = PDiff.end(); PDiffI != PDiffE && PDiffI->isValid(); ++PDiffI) { unsigned PSetID = PDiffI->getPSet(); unsigned Limit = RCI->getRegPressureSetLimit(PSetID); if (!LiveThruPressure.empty()) Limit += LiveThruPressure[PSetID]; unsigned POld = CurrSetPressure[PSetID]; unsigned MOld = P.MaxSetPressure[PSetID]; unsigned MNew = MOld; // Ignore DeadDefs here because they aren't captured by PressureChange. unsigned PNew = POld + PDiffI->getUnitInc(); assert((PDiffI->getUnitInc() >= 0) == (PNew >= POld) && "PSet overflow/underflow"); if (PNew > MOld) MNew = PNew; // Check if current pressure has exceeded the limit. if (!Delta.Excess.isValid()) { unsigned ExcessInc = 0; if (PNew > Limit) ExcessInc = POld > Limit ? PNew - POld : PNew - Limit; else if (POld > Limit) ExcessInc = Limit - POld; if (ExcessInc) { Delta.Excess = PressureChange(PSetID); Delta.Excess.setUnitInc(ExcessInc); } } // Check if max pressure has exceeded a critical pressure set max. if (MNew == MOld) continue; if (!Delta.CriticalMax.isValid()) { while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < PSetID) ++CritIdx; if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == PSetID) { int CritInc = (int)MNew - (int)CriticalPSets[CritIdx].getUnitInc(); if (CritInc > 0 && CritInc <= INT16_MAX) { Delta.CriticalMax = PressureChange(PSetID); Delta.CriticalMax.setUnitInc(CritInc); } } } // Check if max pressure has exceeded the current max. if (!Delta.CurrentMax.isValid() && MNew > MaxPressureLimit[PSetID]) { Delta.CurrentMax = PressureChange(PSetID); Delta.CurrentMax.setUnitInc(MNew - MOld); } } }
/// Record the pressure difference induced by the given operand list. static void collectPDiff(PressureDiff &PDiff, RegisterOperands &RegOpers, const MachineRegisterInfo *MRI) { assert(!PDiff.begin()->isValid() && "stale PDiff"); for (unsigned i = 0, e = RegOpers.Defs.size(); i != e; ++i) PDiff.addPressureChange(RegOpers.Defs[i], true, MRI); for (unsigned i = 0, e = RegOpers.Uses.size(); i != e; ++i) PDiff.addPressureChange(RegOpers.Uses[i], false, MRI); }