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