LiveRangeEdit.cpp revision 7792e980c43536814ea42448db9799b4da32fef6
1a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen//===--- LiveRangeEdit.cpp - Basic tools for editing a register live range --===// 2a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// 3a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 4a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// 5a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 6a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 7a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// 8a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 9a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// 10a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// The LiveRangeEdit class represents changes done to a virtual register when it 11a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// is spilled or split. 12a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 13a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 14a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "LiveRangeEdit.h" 15a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "VirtRegMap.h" 165881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/ADT/SetVector.h" 17a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h" 18a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h" 19080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h" 205881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/Debug.h" 215881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h" 22a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 23a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenusing namespace llvm; 24a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 25a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund OlesenLiveInterval &LiveRangeEdit::create(MachineRegisterInfo &mri, 26a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveIntervals &lis, 27a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen VirtRegMap &vrm) { 28e324f6e05ff7a157347edb48203db0250805f748Jakob Stoklund Olesen const TargetRegisterClass *RC = mri.getRegClass(getReg()); 29a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen unsigned VReg = mri.createVirtualRegister(RC); 30a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen vrm.grow(); 31fd38917d4d040759d75e9d1f4e2c885fb40ba2d7Jakob Stoklund Olesen vrm.setIsSplitFromReg(VReg, vrm.getOriginal(getReg())); 32a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveInterval &li = lis.getOrCreateInterval(VReg); 33a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen newRegs_.push_back(&li); 34a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return li; 35a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen} 36a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 37080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesenvoid LiveRangeEdit::scanRemattable(LiveIntervals &lis, 38080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 39080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen AliasAnalysis *aa) { 40080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen for (LiveInterval::vni_iterator I = parent_.vni_begin(), 41080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen E = parent_.vni_end(); I != E; ++I) { 42080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen VNInfo *VNI = *I; 43080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (VNI->isUnused()) 44080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen continue; 45080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineInstr *DefMI = lis.getInstructionFromIndex(VNI->def); 46080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!DefMI) 47080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen continue; 48080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (tii.isTriviallyReMaterializable(DefMI, aa)) 49080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen remattable_.insert(VNI); 50080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen } 51080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen scannedRemattable_ = true; 52080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 53080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 54080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesenbool LiveRangeEdit::anyRematerializable(LiveIntervals &lis, 55080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 56080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen AliasAnalysis *aa) { 57080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!scannedRemattable_) 58080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen scanRemattable(lis, tii, aa); 59080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen return !remattable_.empty(); 60080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 61080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 62a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// allUsesAvailableAt - Return true if all registers used by OrigMI at 63a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// OrigIdx are also available with the same value at UseIdx. 64a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenbool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI, 65a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen SlotIndex OrigIdx, 66a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen SlotIndex UseIdx, 67a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveIntervals &lis) { 68a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen OrigIdx = OrigIdx.getUseIndex(); 69a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen UseIdx = UseIdx.getUseIndex(); 70a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) { 71a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen const MachineOperand &MO = OrigMI->getOperand(i); 72a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (!MO.isReg() || !MO.getReg() || MO.getReg() == getReg()) 73a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 74a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen // Reserved registers are OK. 75a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (MO.isUndef() || !lis.hasInterval(MO.getReg())) 76a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 77a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen // We don't want to move any defs. 78a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (MO.isDef()) 79a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return false; 80a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen // We cannot depend on virtual registers in uselessRegs_. 811973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen if (uselessRegs_) 821973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen for (unsigned ui = 0, ue = uselessRegs_->size(); ui != ue; ++ui) 831973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen if ((*uselessRegs_)[ui]->reg == MO.getReg()) 841973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen return false; 85a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 86a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveInterval &li = lis.getInterval(MO.getReg()); 87a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen const VNInfo *OVNI = li.getVNInfoAt(OrigIdx); 88a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (!OVNI) 89a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 90a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (OVNI != li.getVNInfoAt(UseIdx)) 91a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return false; 92a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen } 93a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return true; 94a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen} 95a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 96b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesenbool LiveRangeEdit::canRematerializeAt(Remat &RM, 97b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen SlotIndex UseIdx, 98b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen bool cheapAsAMove, 99b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen LiveIntervals &lis) { 100080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen assert(scannedRemattable_ && "Call anyRematerializable first"); 101080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 102080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // Use scanRemattable info. 103080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!remattable_.count(RM.ParentVNI)) 104b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 105080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 106080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // No defining instruction. 107b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen RM.OrigMI = lis.getInstructionFromIndex(RM.ParentVNI->def); 108b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen assert(RM.OrigMI && "Defining instruction for remattable value disappeared"); 109080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 110080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // If only cheap remats were requested, bail out early. 111b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen if (cheapAsAMove && !RM.OrigMI->getDesc().isAsCheapAsAMove()) 112b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 113080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 114080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // Verify that all used registers are available with the same values. 115b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen if (!allUsesAvailableAt(RM.OrigMI, RM.ParentVNI->def, UseIdx, lis)) 116b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 117080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 118b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return true; 119080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 120080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 121080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund OlesenSlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB, 122080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineBasicBlock::iterator MI, 123080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen unsigned DestReg, 124080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const Remat &RM, 125080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen LiveIntervals &lis, 126080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 127080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetRegisterInfo &tri) { 128080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen assert(RM.OrigMI && "Invalid remat"); 129080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen tii.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri); 130f1583ae84a8eeb0f6c0f81bd5bf189bdc9eaecb2Jakob Stoklund Olesen rematted_.insert(RM.ParentVNI); 131080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen return lis.InsertMachineInstrInMaps(--MI).getDefIndex(); 132080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 133080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 1347792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesenvoid LiveRangeEdit::eraseVirtReg(unsigned Reg, LiveIntervals &LIS) { 1357792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen if (delegate_ && delegate_->LRE_CanEraseVirtReg(Reg)) 1367792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen LIS.removeInterval(Reg); 1377792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen} 1387792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen 1395881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesenvoid LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead, 1405881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LiveIntervals &LIS, 1415881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen const TargetInstrInfo &TII) { 1425881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SetVector<LiveInterval*, 1435881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SmallVector<LiveInterval*, 8>, 1445881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SmallPtrSet<LiveInterval*, 8> > ToShrink; 1455881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1465881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen for (;;) { 1475881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Erase all dead defs. 1485881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen while (!Dead.empty()) { 1495881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MachineInstr *MI = Dead.pop_back_val(); 1505881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen assert(MI->allDefsAreDead() && "Def isn't really dead"); 1515881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1525881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Never delete inline asm. 1535881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (MI->isInlineAsm()) 1545881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1555881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1565881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Use the same criteria as DeadMachineInstructionElim. 1575881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen bool SawStore = false; 1585881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (!MI->isSafeToMove(&TII, 0, SawStore)) 1595881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1605881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1615881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SlotIndex Idx = LIS.getInstructionIndex(MI).getDefIndex(); 1625881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI); 1635881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1645881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Check for live intervals that may shrink 1655881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen for (MachineInstr::mop_iterator MOI = MI->operands_begin(), 1665881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MOE = MI->operands_end(); MOI != MOE; ++MOI) { 1675881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (!MOI->isReg()) 1685881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1695881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen unsigned Reg = MOI->getReg(); 1705881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (!TargetRegisterInfo::isVirtualRegister(Reg)) 1715881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1725881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LiveInterval &LI = LIS.getInterval(Reg); 1735881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Remove defined value. 1745881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (MOI->isDef()) 1755881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (VNInfo *VNI = LI.getVNInfoAt(Idx)) 1765881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LI.removeValNo(VNI); 1775881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Shrink read registers. 1785881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (MI->readsVirtualRegister(Reg)) 1795881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen ToShrink.insert(&LI); 1805881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 1815881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 18292a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen if (delegate_) 18392a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen delegate_->LRE_WillEraseInstruction(MI); 1845881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LIS.RemoveMachineInstrFromMaps(MI); 1855881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MI->eraseFromParent(); 1865881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 1875881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1885881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (ToShrink.empty()) 1895881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen break; 1905881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1915881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Shrink just one live interval. Then delete new dead defs. 1925881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LIS.shrinkToUses(ToShrink.back(), &Dead); 1935881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen ToShrink.pop_back(); 1945881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 1955881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen} 1965881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 197