return true;
}
-bool RegPressureTracker::isLastUse(unsigned VRegOrUnit, SlotIndex Pos) const {
- // Allocatable physregs are always single-use before register rewriting.
- if (!TargetRegisterInfo::isVirtualRegister(VRegOrUnit))
- return true;
- // Without liveness information we conservatively assume "no last use".
- if (!RequireIntervals)
- return false;
- const LiveRange *LR = getLiveRange(VRegOrUnit);
- return LR && LR->Query(Pos).isKill();
-}
-
/// Advance across the current instruction.
bool RegPressureTracker::advance() {
assert(!TrackUntiedDefs && "unsupported mode");
if (!isLive)
discoverLiveIn(Reg);
// Kill liveness at last uses.
- if (isLastUse(Reg, SlotIdx)) {
- if (isLive) {
- LiveRegs.erase(Reg);
- decreaseRegPressure(Reg);
- }
- } else if(!isLive) {
- // We discovered a live which was not last used here, adjust pressure.
- increaseRegPressure(Reg);
+ bool lastUse = false;
+ if (RequireIntervals) {
+ const LiveRange *LR = getLiveRange(Reg);
+ lastUse = LR && LR->Query(SlotIdx).isKill();
+ }
+ else {
+ // Allocatable physregs are always single-use before register rewriting.
+ lastUse = !TargetRegisterInfo::isVirtualRegister(Reg);
+ }
+ if (lastUse && isLive) {
+ LiveRegs.erase(Reg);
+ decreaseRegPressure(Reg);
}
+ else if (!lastUse && !isLive)
+ increaseRegPressure(Reg);
}
// Generate liveness for defs.
for (unsigned i = 0, e = RegOpers.Uses.size(); i < e; ++i) {
unsigned Reg = RegOpers.Uses[i];
- bool IsLastUse = isLastUse(Reg, SlotIdx);
- // We had a last use at MIs position. To know the situation for the current
- // position we have to check if there exist other uses in between.
- if (IsLastUse && TargetRegisterInfo::isVirtualRegister(Reg)) {
- SlotIndex CurrIdx = getCurrSlot();
+ if (RequireIntervals) {
// FIXME: allow the caller to pass in the list of vreg uses that remain
// to be bottom-scheduled to avoid searching uses at each query.
- if (findUseBetween(Reg, CurrIdx, SlotIdx, *MRI, LIS))
- IsLastUse = false;
+ SlotIndex CurrIdx = getCurrSlot();
+ const LiveRange *LR = getLiveRange(Reg);
+ if (LR) {
+ LiveQueryResult LRQ = LR->Query(SlotIdx);
+ if (LRQ.isKill() && !findUseBetween(Reg, CurrIdx, SlotIdx, *MRI, LIS))
+ decreaseRegPressure(Reg);
+ }
}
- if (IsLastUse)
+ else if (!TargetRegisterInfo::isVirtualRegister(Reg)) {
+ // Allocatable physregs are always single-use before register rewriting.
decreaseRegPressure(Reg);
+ }
}
// Generate liveness for defs.