LiveRangeEdit.cpp revision cf610d07de3ba4929bb5d00e084877dd974b44a1
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 14cf610d07de3ba4929bb5d00e084877dd974b44a1Jakob Stoklund Olesen#define DEBUG_TYPE "regalloc" 15a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "LiveRangeEdit.h" 16a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "VirtRegMap.h" 175881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/ADT/SetVector.h" 18a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h" 19a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h" 20080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h" 215881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/Debug.h" 225881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h" 23a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 24a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenusing namespace llvm; 25a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 266a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund OlesenLiveInterval &LiveRangeEdit::createFrom(unsigned OldReg, 276a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen LiveIntervals &LIS, 286a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen VirtRegMap &VRM) { 296a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen MachineRegisterInfo &MRI = VRM.getRegInfo(); 306a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg)); 316a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen VRM.grow(); 326a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen VRM.setIsSplitFromReg(VReg, VRM.getOriginal(OldReg)); 336a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen LiveInterval &LI = LIS.getOrCreateInterval(VReg); 346a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen newRegs_.push_back(&LI); 356a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen return LI; 36a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen} 37a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 382ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesenvoid LiveRangeEdit::checkRematerializable(VNInfo *VNI, 392ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen const MachineInstr *DefMI, 402ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen const TargetInstrInfo &tii, 412ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen AliasAnalysis *aa) { 422ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen assert(DefMI && "Missing instruction"); 432ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen if (tii.isTriviallyReMaterializable(DefMI, aa)) 442ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen remattable_.insert(VNI); 452ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen scannedRemattable_ = true; 462ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen} 472ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen 48080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesenvoid LiveRangeEdit::scanRemattable(LiveIntervals &lis, 49080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 50080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen AliasAnalysis *aa) { 51080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen for (LiveInterval::vni_iterator I = parent_.vni_begin(), 52080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen E = parent_.vni_end(); I != E; ++I) { 53080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen VNInfo *VNI = *I; 54080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (VNI->isUnused()) 55080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen continue; 56080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineInstr *DefMI = lis.getInstructionFromIndex(VNI->def); 57080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!DefMI) 58080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen continue; 592ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen checkRematerializable(VNI, DefMI, tii, aa); 60080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen } 61080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 62080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 63080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesenbool LiveRangeEdit::anyRematerializable(LiveIntervals &lis, 64080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 65080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen AliasAnalysis *aa) { 66080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!scannedRemattable_) 67080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen scanRemattable(lis, tii, aa); 68080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen return !remattable_.empty(); 69080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 70080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 71a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// allUsesAvailableAt - Return true if all registers used by OrigMI at 72a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// OrigIdx are also available with the same value at UseIdx. 73a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenbool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI, 74a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen SlotIndex OrigIdx, 75a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen SlotIndex UseIdx, 76a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveIntervals &lis) { 77a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen OrigIdx = OrigIdx.getUseIndex(); 78a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen UseIdx = UseIdx.getUseIndex(); 79a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) { 80a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen const MachineOperand &MO = OrigMI->getOperand(i); 812ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen if (!MO.isReg() || !MO.getReg() || MO.isDef()) 82a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 83a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen // Reserved registers are OK. 84a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (MO.isUndef() || !lis.hasInterval(MO.getReg())) 85a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 86a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen // We cannot depend on virtual registers in uselessRegs_. 871973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen if (uselessRegs_) 881973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen for (unsigned ui = 0, ue = uselessRegs_->size(); ui != ue; ++ui) 891973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen if ((*uselessRegs_)[ui]->reg == MO.getReg()) 901973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen return false; 91a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 92a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen LiveInterval &li = lis.getInterval(MO.getReg()); 93a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen const VNInfo *OVNI = li.getVNInfoAt(OrigIdx); 94a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (!OVNI) 95a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen continue; 96a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen if (OVNI != li.getVNInfoAt(UseIdx)) 97a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return false; 98a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen } 99a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen return true; 100a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen} 101a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 102b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesenbool LiveRangeEdit::canRematerializeAt(Remat &RM, 103b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen SlotIndex UseIdx, 104b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen bool cheapAsAMove, 105b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen LiveIntervals &lis) { 106080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen assert(scannedRemattable_ && "Call anyRematerializable first"); 107080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 108080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // Use scanRemattable info. 109080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen if (!remattable_.count(RM.ParentVNI)) 110b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 111080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 1122ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen // No defining instruction provided. 1132ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen SlotIndex DefIdx; 1142ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen if (RM.OrigMI) 1152ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen DefIdx = lis.getInstructionIndex(RM.OrigMI); 1162ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen else { 1172ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen DefIdx = RM.ParentVNI->def; 1182ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen RM.OrigMI = lis.getInstructionFromIndex(DefIdx); 1192ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen assert(RM.OrigMI && "No defining instruction for remattable value"); 1202ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen } 121080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 122080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // If only cheap remats were requested, bail out early. 123b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen if (cheapAsAMove && !RM.OrigMI->getDesc().isAsCheapAsAMove()) 124b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 125080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 126080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen // Verify that all used registers are available with the same values. 1272ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx, lis)) 128b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return false; 129080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 130b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen return true; 131080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 132080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 133080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund OlesenSlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB, 134080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineBasicBlock::iterator MI, 135080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen unsigned DestReg, 136080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const Remat &RM, 137080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen LiveIntervals &lis, 138080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetInstrInfo &tii, 139080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const TargetRegisterInfo &tri) { 140080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen assert(RM.OrigMI && "Invalid remat"); 141080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen tii.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri); 142f1583ae84a8eeb0f6c0f81bd5bf189bdc9eaecb2Jakob Stoklund Olesen rematted_.insert(RM.ParentVNI); 143080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen return lis.InsertMachineInstrInMaps(--MI).getDefIndex(); 144080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen} 145080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 1467792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesenvoid LiveRangeEdit::eraseVirtReg(unsigned Reg, LiveIntervals &LIS) { 1477792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen if (delegate_ && delegate_->LRE_CanEraseVirtReg(Reg)) 1487792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen LIS.removeInterval(Reg); 1497792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen} 1507792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen 1515881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesenvoid LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead, 1526a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen LiveIntervals &LIS, VirtRegMap &VRM, 1535881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen const TargetInstrInfo &TII) { 1545881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SetVector<LiveInterval*, 1555881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SmallVector<LiveInterval*, 8>, 1565881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen SmallPtrSet<LiveInterval*, 8> > ToShrink; 1575881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1585881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen for (;;) { 1595881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Erase all dead defs. 1605881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen while (!Dead.empty()) { 1615881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MachineInstr *MI = Dead.pop_back_val(); 1625881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen assert(MI->allDefsAreDead() && "Def isn't really dead"); 163c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen SlotIndex Idx = LIS.getInstructionIndex(MI).getDefIndex(); 1645881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1655881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Never delete inline asm. 166c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen if (MI->isInlineAsm()) { 167c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen DEBUG(dbgs() << "Won't delete: " << Idx << '\t' << *MI); 1685881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 169c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen } 1705881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1715881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Use the same criteria as DeadMachineInstructionElim. 1725881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen bool SawStore = false; 173c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen if (!MI->isSafeToMove(&TII, 0, SawStore)) { 174c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen DEBUG(dbgs() << "Can't delete: " << Idx << '\t' << *MI); 1755881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 176c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen } 1775881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1785881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI); 1795881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 1805881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Check for live intervals that may shrink 1815881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen for (MachineInstr::mop_iterator MOI = MI->operands_begin(), 1825881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MOE = MI->operands_end(); MOI != MOE; ++MOI) { 1835881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (!MOI->isReg()) 1845881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1855881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen unsigned Reg = MOI->getReg(); 1865881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (!TargetRegisterInfo::isVirtualRegister(Reg)) 1875881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen continue; 1885881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LiveInterval &LI = LIS.getInterval(Reg); 189cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen 1905881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Shrink read registers. 1915881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (MI->readsVirtualRegister(Reg)) 1925881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen ToShrink.insert(&LI); 193cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen 194cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen // Remove defined value. 195cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen if (MOI->isDef()) { 196cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen if (VNInfo *VNI = LI.getVNInfoAt(Idx)) { 1971e6c65dba706de80f5a4ceb8a1fc86bc3d0a61c6Jakob Stoklund Olesen if (delegate_) 1981e6c65dba706de80f5a4ceb8a1fc86bc3d0a61c6Jakob Stoklund Olesen delegate_->LRE_WillShrinkVirtReg(LI.reg); 199cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen LI.removeValNo(VNI); 200cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen if (LI.empty()) { 201cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen ToShrink.remove(&LI); 202cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen eraseVirtReg(Reg, LIS); 203cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen } 204cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen } 205cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen } 2065881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 2075881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 20892a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen if (delegate_) 20992a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen delegate_->LRE_WillEraseInstruction(MI); 2105881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen LIS.RemoveMachineInstrFromMaps(MI); 2115881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen MI->eraseFromParent(); 2125881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 2135881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 2145881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if (ToShrink.empty()) 2155881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen break; 2165881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 2175881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen // Shrink just one live interval. Then delete new dead defs. 2181d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen LiveInterval *LI = ToShrink.back(); 2195881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen ToShrink.pop_back(); 2201d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen if (delegate_) 2211d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen delegate_->LRE_WillShrinkVirtReg(LI->reg); 2226a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen if (!LIS.shrinkToUses(LI, &Dead)) 2236a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen continue; 2246a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen 2256a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen // LI may have been separated, create new intervals. 2266a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen LI->RenumberValues(LIS); 2276a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen ConnectedVNInfoEqClasses ConEQ(LIS); 2286a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen unsigned NumComp = ConEQ.Classify(LI); 2296a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen if (NumComp <= 1) 2306a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen continue; 2316a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen DEBUG(dbgs() << NumComp << " components: " << *LI << '\n'); 2326a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen SmallVector<LiveInterval*, 8> Dups(1, LI); 2336a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen for (unsigned i = 1; i != NumComp; ++i) 2346a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen Dups.push_back(&createFrom(LI->reg, LIS, VRM)); 2356a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen ConEQ.Distribute(&Dups[0], VRM.getRegInfo()); 2365881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen } 2375881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen} 2385881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 239