void RegPressureTracker::recede(SmallVectorImpl<RegisterMaskPair> *LiveUses) { recedeSkipDebugValues(); const MachineInstr &MI = *CurrPos; RegisterOperands RegOpers; RegOpers.collect(MI, *TRI, *MRI, TrackLaneMasks, false); if (TrackLaneMasks) { SlotIndex SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot(); RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); } else if (RequireIntervals) { RegOpers.detectDeadDefs(MI, *LIS); } recede(RegOpers, LiveUses); }
/// Record the upward impact of a single instruction on current register /// pressure. Unlike the advance/recede pressure tracking interface, this does /// not discover live in/outs. /// /// This is intended for speculative queries. It leaves pressure inconsistent /// with the current position, so must be restored by the caller. void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) { assert(!MI->isDebugValue() && "Expect a nondebug instruction."); SlotIndex SlotIdx; if (RequireIntervals) SlotIdx = LIS->getInstructionIndex(*MI).getRegSlot(); // Account for register pressure similar to RegPressureTracker::recede(). RegisterOperands RegOpers; RegOpers.collect(*MI, *TRI, *MRI, TrackLaneMasks, /*IgnoreDead=*/true); assert(RegOpers.DeadDefs.size() == 0); if (TrackLaneMasks) RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); else if (RequireIntervals) RegOpers.detectDeadDefs(*MI, *LIS); // Boost max pressure for all dead defs together. // Since CurrSetPressure and MaxSetPressure bumpDeadDefs(RegOpers.DeadDefs); // Kill liveness at live defs. for (const RegisterMaskPair &P : RegOpers.Defs) { unsigned Reg = P.RegUnit; LaneBitmask LiveLanes = LiveRegs.contains(Reg); LaneBitmask UseLanes = getRegLanes(RegOpers.Uses, Reg); LaneBitmask DefLanes = P.LaneMask; LaneBitmask LiveAfter = (LiveLanes & ~DefLanes) | UseLanes; decreaseRegPressure(Reg, LiveLanes, LiveAfter); } // Generate liveness for uses. for (const RegisterMaskPair &P : RegOpers.Uses) { unsigned Reg = P.RegUnit; LaneBitmask LiveLanes = LiveRegs.contains(Reg); LaneBitmask LiveAfter = LiveLanes | P.LaneMask; increaseRegPressure(Reg, LiveLanes, LiveAfter); } }