17842a741eb0e1baa35af8c3bb5884655c1edaa9eJim Grosbach//===-- 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 "VirtRegMap.h"
165881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/ADT/SetVector.h"
17e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen#include "llvm/ADT/Statistic.h"
186094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen#include "llvm/CodeGen/CalcSpillWeights.h"
19a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h"
20789d5d85ba6e9259a8e0f0bcfbd06a59ad164512Pete Cooper#include "llvm/CodeGen/LiveRangeEdit.h"
21a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
22080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h"
235881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/Debug.h"
245881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h"
25a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
26a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenusing namespace llvm;
27a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
28e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund OlesenSTATISTIC(NumDCEDeleted,     "Number of instructions deleted by DCE");
29e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund OlesenSTATISTIC(NumDCEFoldedLoads, "Number of single use loads folded after DCE");
30e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund OlesenSTATISTIC(NumFracRanges,     "Number of live ranges fractured by DCE");
31e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen
322d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid LiveRangeEdit::Delegate::anchor() { }
332d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
348a06af96698537377275dd7848db69915638dd26Pete CooperLiveInterval &LiveRangeEdit::createFrom(unsigned OldReg) {
356a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen  unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
362e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper  if (VRM) {
372e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper    VRM->grow();
382e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper    VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
392e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper  }
406a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen  LiveInterval &LI = LIS.getOrCreateInterval(VReg);
41c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  NewRegs.push_back(&LI);
426a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen  return LI;
43a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen}
44a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
453b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesenbool LiveRangeEdit::checkRematerializable(VNInfo *VNI,
462ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen                                          const MachineInstr *DefMI,
472ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen                                          AliasAnalysis *aa) {
482ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  assert(DefMI && "Missing instruction");
49c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  ScannedRemattable = true;
508a06af96698537377275dd7848db69915638dd26Pete Cooper  if (!TII.isTriviallyReMaterializable(DefMI, aa))
513b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesen    return false;
52c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  Remattable.insert(VNI);
533b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesen  return true;
542ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen}
552ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen
568a06af96698537377275dd7848db69915638dd26Pete Coopervoid LiveRangeEdit::scanRemattable(AliasAnalysis *aa) {
5720942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen  for (LiveInterval::vni_iterator I = getParent().vni_begin(),
5820942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen       E = getParent().vni_end(); I != E; ++I) {
59080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    VNInfo *VNI = *I;
60080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    if (VNI->isUnused())
61080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen      continue;
628a06af96698537377275dd7848db69915638dd26Pete Cooper    MachineInstr *DefMI = LIS.getInstructionFromIndex(VNI->def);
63080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    if (!DefMI)
64080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen      continue;
658a06af96698537377275dd7848db69915638dd26Pete Cooper    checkRematerializable(VNI, DefMI, aa);
66080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  }
67c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  ScannedRemattable = true;
68080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
69080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
708a06af96698537377275dd7848db69915638dd26Pete Cooperbool LiveRangeEdit::anyRematerializable(AliasAnalysis *aa) {
71c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (!ScannedRemattable)
728a06af96698537377275dd7848db69915638dd26Pete Cooper    scanRemattable(aa);
73c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  return !Remattable.empty();
74080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
75080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
76a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// allUsesAvailableAt - Return true if all registers used by OrigMI at
77a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// OrigIdx are also available with the same value at UseIdx.
78a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenbool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
79a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen                                       SlotIndex OrigIdx,
808a06af96698537377275dd7848db69915638dd26Pete Cooper                                       SlotIndex UseIdx) {
812debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen  OrigIdx = OrigIdx.getRegSlot(true);
822debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen  UseIdx = UseIdx.getRegSlot(true);
83a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
84a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    const MachineOperand &MO = OrigMI->getOperand(i);
85834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    if (!MO.isReg() || !MO.getReg() || !MO.readsReg())
86a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      continue;
87a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
88834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    // We can't remat physreg uses, unless it is a constant.
89834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    if (TargetRegisterInfo::isPhysicalRegister(MO.getReg())) {
90834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen      if (MRI.isConstantPhysReg(MO.getReg(), VRM->getMachineFunction()))
91834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen        continue;
92834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen      return false;
93834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    }
94834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen
958a06af96698537377275dd7848db69915638dd26Pete Cooper    LiveInterval &li = LIS.getInterval(MO.getReg());
96a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    const VNInfo *OVNI = li.getVNInfoAt(OrigIdx);
97a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    if (!OVNI)
98a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      continue;
99a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    if (OVNI != li.getVNInfoAt(UseIdx))
100a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      return false;
101a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  }
102a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  return true;
103a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen}
104a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
105b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesenbool LiveRangeEdit::canRematerializeAt(Remat &RM,
106b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen                                       SlotIndex UseIdx,
1078a06af96698537377275dd7848db69915638dd26Pete Cooper                                       bool cheapAsAMove) {
108c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  assert(ScannedRemattable && "Call anyRematerializable first");
109080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
110080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // Use scanRemattable info.
111c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (!Remattable.count(RM.ParentVNI))
112b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
113080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
1142ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  // No defining instruction provided.
1152ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  SlotIndex DefIdx;
1162ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  if (RM.OrigMI)
1178a06af96698537377275dd7848db69915638dd26Pete Cooper    DefIdx = LIS.getInstructionIndex(RM.OrigMI);
1182ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  else {
1192ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen    DefIdx = RM.ParentVNI->def;
1208a06af96698537377275dd7848db69915638dd26Pete Cooper    RM.OrigMI = LIS.getInstructionFromIndex(DefIdx);
1212ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen    assert(RM.OrigMI && "No defining instruction for remattable value");
1222ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  }
123080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
124080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // If only cheap remats were requested, bail out early.
1255a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  if (cheapAsAMove && !RM.OrigMI->isAsCheapAsAMove())
126b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
127080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
128080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // Verify that all used registers are available with the same values.
1298a06af96698537377275dd7848db69915638dd26Pete Cooper  if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx))
130b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
131080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
132b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen  return true;
133080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
134080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
135080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund OlesenSlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
136080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         MachineBasicBlock::iterator MI,
137080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         unsigned DestReg,
138080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         const Remat &RM,
139bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen                                         const TargetRegisterInfo &tri,
140bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen                                         bool Late) {
141080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  assert(RM.OrigMI && "Invalid remat");
1428a06af96698537377275dd7848db69915638dd26Pete Cooper  TII.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri);
143c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  Rematted.insert(RM.ParentVNI);
1448a06af96698537377275dd7848db69915638dd26Pete Cooper  return LIS.getSlotIndexes()->insertMachineInstrInMaps(--MI, Late)
1452debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen           .getRegSlot();
146080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
147080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
1488a06af96698537377275dd7848db69915638dd26Pete Coopervoid LiveRangeEdit::eraseVirtReg(unsigned Reg) {
149c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (TheDelegate && TheDelegate->LRE_CanEraseVirtReg(Reg))
1507792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen    LIS.removeInterval(Reg);
1517792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen}
1527792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen
1533520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesenbool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
1548a06af96698537377275dd7848db69915638dd26Pete Cooper                               SmallVectorImpl<MachineInstr*> &Dead) {
1553520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  MachineInstr *DefMI = 0, *UseMI = 0;
1563520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
1573520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  // Check that there is a single def and a single use.
1583520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  for (MachineRegisterInfo::reg_nodbg_iterator I = MRI.reg_nodbg_begin(LI->reg),
1593520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen       E = MRI.reg_nodbg_end(); I != E; ++I) {
1603520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    MachineOperand &MO = I.getOperand();
1613520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    MachineInstr *MI = MO.getParent();
1623520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    if (MO.isDef()) {
1633520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (DefMI && DefMI != MI)
1643520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1655a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng      if (!MI->canFoldAsLoad())
1663520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1673520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      DefMI = MI;
1683520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    } else if (!MO.isUndef()) {
1693520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (UseMI && UseMI != MI)
1703520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1713520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      // FIXME: Targets don't know how to fold subreg uses.
1723520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (MO.getSubReg())
1733520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1743520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      UseMI = MI;
1753520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    }
1763520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  }
1773520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (!DefMI || !UseMI)
1783520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
1793520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
1802ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // Since we're moving the DefMI load, make sure we're not extending any live
1812ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // ranges.
1822ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  if (!allUsesAvailableAt(DefMI,
1832ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen                          LIS.getInstructionIndex(DefMI),
1842ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen                          LIS.getInstructionIndex(UseMI)))
1852ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen    return false;
1862ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen
1872ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // We also need to make sure it is safe to move the load.
1882ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // Assume there are stores between DefMI and UseMI.
1892ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  bool SawStore = true;
1902ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  if (!DefMI->isSafeToMove(&TII, 0, SawStore))
1912ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen    return false;
1922ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen
1933520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  DEBUG(dbgs() << "Try to fold single def: " << *DefMI
1943520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen               << "       into single use: " << *UseMI);
1953520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
1963520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  SmallVector<unsigned, 8> Ops;
1973520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (UseMI->readsWritesVirtualRegister(LI->reg, &Ops).second)
1983520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
1993520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
2003520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  MachineInstr *FoldMI = TII.foldMemoryOperand(UseMI, Ops, DefMI);
2013520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (!FoldMI)
2023520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
2033520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  DEBUG(dbgs() << "                folded: " << *FoldMI);
2043520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  LIS.ReplaceMachineInstrInMaps(UseMI, FoldMI);
2053520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  UseMI->eraseFromParent();
2063520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  DefMI->addRegisterDead(LI->reg, 0);
2073520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  Dead.push_back(DefMI);
208e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen  ++NumDCEFoldedLoads;
2093520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  return true;
2103520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen}
2113520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
2125881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesenvoid LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
2134777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper                                      ArrayRef<unsigned> RegsBeingSpilled) {
2145881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen  SetVector<LiveInterval*,
2155881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen            SmallVector<LiveInterval*, 8>,
2165881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen            SmallPtrSet<LiveInterval*, 8> > ToShrink;
2175881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
2185881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen  for (;;) {
2195881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    // Erase all dead defs.
2205881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    while (!Dead.empty()) {
2215881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      MachineInstr *MI = Dead.pop_back_val();
2225881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      assert(MI->allDefsAreDead() && "Def isn't really dead");
2232debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen      SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
2245881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
2255881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      // Never delete inline asm.
226c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen      if (MI->isInlineAsm()) {
227c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen        DEBUG(dbgs() << "Won't delete: " << Idx << '\t' << *MI);
2285881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen        continue;
229c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen      }
2305881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
2315881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      // Use the same criteria as DeadMachineInstructionElim.
2325881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      bool SawStore = false;
233c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen      if (!MI->isSafeToMove(&TII, 0, SawStore)) {
234c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen        DEBUG(dbgs() << "Can't delete: " << Idx << '\t' << *MI);
2355881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen        continue;
236c46570dc05851395829bef904bb6ddb1260400d1Jakob Stoklund Olesen      }
2375881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
2385881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI);
2395881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
24076ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      // Collect virtual registers to be erased after MI is gone.
24176ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      SmallVector<unsigned, 8> RegsToErase;
242e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      bool ReadsPhysRegs = false;
24376ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen
2445881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      // Check for live intervals that may shrink
2455881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
2465881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen             MOE = MI->operands_end(); MOI != MOE; ++MOI) {
2475881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen        if (!MOI->isReg())
2485881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen          continue;
2495881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen        unsigned Reg = MOI->getReg();
250e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        if (!TargetRegisterInfo::isVirtualRegister(Reg)) {
251e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          // Check if MI reads any unreserved physregs.
252e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          if (Reg && MOI->readsReg() && !LIS.isReserved(Reg))
253e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen            ReadsPhysRegs = true;
2545881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen          continue;
255e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        }
2565881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen        LiveInterval &LI = LIS.getInterval(Reg);
257cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen
2581edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen        // Shrink read registers, unless it is likely to be expensive and
2591edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen        // unlikely to change anything. We typically don't want to shrink the
2601edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen        // PIC base register that has lots of uses everywhere.
2611edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen        // Always shrink COPY uses that probably come from live range splitting.
2621edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen        if (MI->readsVirtualRegister(Reg) &&
2631edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen            (MI->isCopy() || MOI->isDef() || MRI.hasOneNonDBGUse(Reg) ||
2641edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen             LI.killedAt(Idx)))
2655881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen          ToShrink.insert(&LI);
266cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen
267cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen        // Remove defined value.
268cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen        if (MOI->isDef()) {
269cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen          if (VNInfo *VNI = LI.getVNInfoAt(Idx)) {
270c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen            if (TheDelegate)
271c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen              TheDelegate->LRE_WillShrinkVirtReg(LI.reg);
272cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen            LI.removeValNo(VNI);
27376ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen            if (LI.empty())
27476ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen              RegsToErase.push_back(Reg);
275cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen          }
276cc5c4296fda7270e8394626d7254596f5f9c8d82Jakob Stoklund Olesen        }
2775881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      }
2785881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
279e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // Currently, we don't support DCE of physreg live ranges. If MI reads
280e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // any unreserved physregs, don't erase the instruction, but turn it into
281e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // a KILL instead. This way, the physreg live ranges don't end up
282e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // dangling.
283e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // FIXME: It would be better to have something like shrinkToUses() for
284e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // physregs. That could potentially enable more DCE and it would free up
285e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      // the physreg. It would not happen often, though.
286e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      if (ReadsPhysRegs) {
287e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        MI->setDesc(TII.get(TargetOpcode::KILL));
288e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        // Remove all operands that aren't physregs.
289e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        for (unsigned i = MI->getNumOperands(); i; --i) {
290e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          const MachineOperand &MO = MI->getOperand(i-1);
291e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          if (MO.isReg() && TargetRegisterInfo::isPhysicalRegister(MO.getReg()))
292e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen            continue;
293e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          MI->RemoveOperand(i-1);
294e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        }
295e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        DEBUG(dbgs() << "Converted physregs to:\t" << *MI);
296e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      } else {
297e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        if (TheDelegate)
298e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen          TheDelegate->LRE_WillEraseInstruction(MI);
299e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        LIS.RemoveMachineInstrFromMaps(MI);
300e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        MI->eraseFromParent();
301e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        ++NumDCEDeleted;
302e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      }
30376ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen
30476ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      // Erase any virtregs that are now empty and unused. There may be <undef>
30576ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      // uses around. Keep the empty live range in that case.
30676ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      for (unsigned i = 0, e = RegsToErase.size(); i != e; ++i) {
30776ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen        unsigned Reg = RegsToErase[i];
30876ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen        if (LIS.hasInterval(Reg) && MRI.reg_nodbg_empty(Reg)) {
30976ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen          ToShrink.remove(&LIS.getInterval(Reg));
31076ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen          eraseVirtReg(Reg);
31176ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen        }
31276ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen      }
3135881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    }
3145881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
3155881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    if (ToShrink.empty())
3165881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      break;
3175881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
3185881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    // Shrink just one live interval. Then delete new dead defs.
3191d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen    LiveInterval *LI = ToShrink.back();
3205881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    ToShrink.pop_back();
3218a06af96698537377275dd7848db69915638dd26Pete Cooper    if (foldAsLoad(LI, Dead))
3223520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      continue;
323c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen    if (TheDelegate)
324c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen      TheDelegate->LRE_WillShrinkVirtReg(LI->reg);
3256a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    if (!LIS.shrinkToUses(LI, &Dead))
3266a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen      continue;
3274777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper
3284777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // Don't create new intervals for a register being spilled.
3294777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // The new intervals would have to be spilled anyway so its not worth it.
3304777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // Also they currently aren't spilled so creating them and not spilling
3314777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // them results in incorrect code.
3324777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    bool BeingSpilled = false;
3334777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    for (unsigned i = 0, e = RegsBeingSpilled.size(); i != e; ++i) {
3344777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper      if (LI->reg == RegsBeingSpilled[i]) {
3354777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper        BeingSpilled = true;
3364777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper        break;
3374777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper      }
3384777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    }
3394777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper
3404777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    if (BeingSpilled) continue;
3416a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen
3426a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    // LI may have been separated, create new intervals.
3436a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    LI->RenumberValues(LIS);
3446a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    ConnectedVNInfoEqClasses ConEQ(LIS);
3456a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    unsigned NumComp = ConEQ.Classify(LI);
3466a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    if (NumComp <= 1)
3476a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen      continue;
348e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen    ++NumFracRanges;
3492e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper    bool IsOriginal = VRM && VRM->getOriginal(LI->reg) == LI->reg;
3506a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
3516a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    SmallVector<LiveInterval*, 8> Dups(1, LI);
352f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen    for (unsigned i = 1; i != NumComp; ++i) {
3538a06af96698537377275dd7848db69915638dd26Pete Cooper      Dups.push_back(&createFrom(LI->reg));
3549693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // If LI is an original interval that hasn't been split yet, make the new
3559693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // intervals their own originals instead of referring to LI. The original
3569693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // interval must contain all the split products, and LI doesn't.
3579693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      if (IsOriginal)
3588a06af96698537377275dd7848db69915638dd26Pete Cooper        VRM->setIsSplitFromReg(Dups.back()->reg, 0);
359c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen      if (TheDelegate)
360c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen        TheDelegate->LRE_DidCloneVirtReg(Dups.back()->reg, LI->reg);
361f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen    }
3621edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen    ConEQ.Distribute(&Dups[0], MRI);
3637ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen    DEBUG({
3647ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen      for (unsigned i = 0; i != NumComp; ++i)
3657ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen        dbgs() << '\t' << *Dups[i] << '\n';
3667ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen    });
3675881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen  }
3685881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen}
3695881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
3706094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesenvoid LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
3716094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen                                             const MachineLoopInfo &Loops) {
3726094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen  VirtRegAuxInfo VRAI(MF, LIS, Loops);
3736094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen  for (iterator I = begin(), E = end(); I != E; ++I) {
3746094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen    LiveInterval &LI = **I;
3756d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen    if (MRI.recomputeRegClass(LI.reg, MF.getTarget()))
3766d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen      DEBUG(dbgs() << "Inflated " << PrintReg(LI.reg) << " to "
3776d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen                   << MRI.getRegClass(LI.reg)->getName() << '\n');
3786094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen    VRAI.CalculateWeightAndHint(LI);
3796094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen  }
3806094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen}
381