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
14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/LiveRangeEdit.h"
15e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen#include "llvm/ADT/Statistic.h"
166094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen#include "llvm/CodeGen/CalcSpillWeights.h"
17a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h"
18a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
191ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen#include "llvm/CodeGen/VirtRegMap.h"
205881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/Debug.h"
215881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
23a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
24a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenusing namespace llvm;
25a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "regalloc"
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
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
34e742d687369f79702894b6cf302e1f222c5d7432Mark LaceyLiveInterval &LiveRangeEdit::createEmptyIntervalFrom(unsigned OldReg) {
356a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen  unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
362e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper  if (VRM) {
372e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper    VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
382e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper  }
39e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey  LiveInterval &LI = LIS.createEmptyInterval(VReg);
406a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen  return LI;
41a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen}
42a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
43e742d687369f79702894b6cf302e1f222c5d7432Mark Laceyunsigned LiveRangeEdit::createFrom(unsigned OldReg) {
44e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey  unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
45e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey  if (VRM) {
46e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey    VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
47e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey  }
48e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey  return VReg;
49e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey}
50e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey
513b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesenbool LiveRangeEdit::checkRematerializable(VNInfo *VNI,
522ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen                                          const MachineInstr *DefMI,
532ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen                                          AliasAnalysis *aa) {
542ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  assert(DefMI && "Missing instruction");
55c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  ScannedRemattable = true;
568a06af96698537377275dd7848db69915638dd26Pete Cooper  if (!TII.isTriviallyReMaterializable(DefMI, aa))
573b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesen    return false;
58c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  Remattable.insert(VNI);
593b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesen  return true;
602ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen}
612ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen
628a06af96698537377275dd7848db69915638dd26Pete Coopervoid LiveRangeEdit::scanRemattable(AliasAnalysis *aa) {
6320942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen  for (LiveInterval::vni_iterator I = getParent().vni_begin(),
6420942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen       E = getParent().vni_end(); I != E; ++I) {
65080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    VNInfo *VNI = *I;
66080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    if (VNI->isUnused())
67080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen      continue;
688a06af96698537377275dd7848db69915638dd26Pete Cooper    MachineInstr *DefMI = LIS.getInstructionFromIndex(VNI->def);
69080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen    if (!DefMI)
70080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen      continue;
718a06af96698537377275dd7848db69915638dd26Pete Cooper    checkRematerializable(VNI, DefMI, aa);
72080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  }
73c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  ScannedRemattable = true;
74080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
75080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
768a06af96698537377275dd7848db69915638dd26Pete Cooperbool LiveRangeEdit::anyRematerializable(AliasAnalysis *aa) {
77c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (!ScannedRemattable)
788a06af96698537377275dd7848db69915638dd26Pete Cooper    scanRemattable(aa);
79c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  return !Remattable.empty();
80080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
81080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
82a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// allUsesAvailableAt - Return true if all registers used by OrigMI at
83a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen/// OrigIdx are also available with the same value at UseIdx.
84a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenbool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
85a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen                                       SlotIndex OrigIdx,
86c2248b0e7895446cccf934b57c6aa3aa712e20d1Jakub Staszak                                       SlotIndex UseIdx) const {
872debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen  OrigIdx = OrigIdx.getRegSlot(true);
882debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen  UseIdx = UseIdx.getRegSlot(true);
89a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
90a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    const MachineOperand &MO = OrigMI->getOperand(i);
91834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    if (!MO.isReg() || !MO.getReg() || !MO.readsReg())
92a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      continue;
93a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
94834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    // We can't remat physreg uses, unless it is a constant.
95834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    if (TargetRegisterInfo::isPhysicalRegister(MO.getReg())) {
96ddc26d89362330995f59ad29eb8bb439a817050bJakob Stoklund Olesen      if (MRI.isConstantPhysReg(MO.getReg(), *OrigMI->getParent()->getParent()))
97834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen        continue;
98834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen      return false;
99834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen    }
100834a9cdbb78c1a16c8ceecb018a324a3ba31c365Jakob Stoklund Olesen
1018a06af96698537377275dd7848db69915638dd26Pete Cooper    LiveInterval &li = LIS.getInterval(MO.getReg());
102a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    const VNInfo *OVNI = li.getVNInfoAt(OrigIdx);
103a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    if (!OVNI)
104a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      continue;
105320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen
106320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen    // Don't allow rematerialization immediately after the original def.
107320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen    // It would be incorrect if OrigMI redefines the register.
108320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen    // See PR14098.
109320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen    if (SlotIndex::isSameInstr(OrigIdx, UseIdx))
110320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen      return false;
111320db3f8052c9f506d9ea043ba5da534df40aa08Jakob Stoklund Olesen
112a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen    if (OVNI != li.getVNInfoAt(UseIdx))
113a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen      return false;
114a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  }
115a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  return true;
116a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen}
117a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
118b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesenbool LiveRangeEdit::canRematerializeAt(Remat &RM,
119b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen                                       SlotIndex UseIdx,
1208a06af96698537377275dd7848db69915638dd26Pete Cooper                                       bool cheapAsAMove) {
121c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  assert(ScannedRemattable && "Call anyRematerializable first");
122080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
123080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // Use scanRemattable info.
124c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (!Remattable.count(RM.ParentVNI))
125b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
126080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
1272ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  // No defining instruction provided.
1282ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  SlotIndex DefIdx;
1292ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  if (RM.OrigMI)
1308a06af96698537377275dd7848db69915638dd26Pete Cooper    DefIdx = LIS.getInstructionIndex(RM.OrigMI);
1312ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  else {
1322ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen    DefIdx = RM.ParentVNI->def;
1338a06af96698537377275dd7848db69915638dd26Pete Cooper    RM.OrigMI = LIS.getInstructionFromIndex(DefIdx);
1342ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen    assert(RM.OrigMI && "No defining instruction for remattable value");
1352ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen  }
136080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
137080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // If only cheap remats were requested, bail out early.
13822c310d78ce9630af15b0de94c18a409705b7496Tim Murray  if (cheapAsAMove && !TII.isAsCheapAsAMove(RM.OrigMI))
139b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
140080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
141080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  // Verify that all used registers are available with the same values.
1428a06af96698537377275dd7848db69915638dd26Pete Cooper  if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx))
143b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen    return false;
144080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
145b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen  return true;
146080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
147080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
148080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund OlesenSlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
149080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         MachineBasicBlock::iterator MI,
150080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         unsigned DestReg,
151080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen                                         const Remat &RM,
152bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen                                         const TargetRegisterInfo &tri,
153bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen                                         bool Late) {
154080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen  assert(RM.OrigMI && "Invalid remat");
1558a06af96698537377275dd7848db69915638dd26Pete Cooper  TII.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri);
156c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  Rematted.insert(RM.ParentVNI);
1578a06af96698537377275dd7848db69915638dd26Pete Cooper  return LIS.getSlotIndexes()->insertMachineInstrInMaps(--MI, Late)
1582debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen           .getRegSlot();
159080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen}
160080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen
1618a06af96698537377275dd7848db69915638dd26Pete Coopervoid LiveRangeEdit::eraseVirtReg(unsigned Reg) {
162c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen  if (TheDelegate && TheDelegate->LRE_CanEraseVirtReg(Reg))
1637792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen    LIS.removeInterval(Reg);
1647792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen}
1657792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen
1663520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesenbool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
1678a06af96698537377275dd7848db69915638dd26Pete Cooper                               SmallVectorImpl<MachineInstr*> &Dead) {
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MachineInstr *DefMI = nullptr, *UseMI = nullptr;
1693520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
1703520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  // Check that there is a single def and a single use.
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (MachineOperand &MO : MRI.reg_nodbg_operands(LI->reg)) {
1723520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    MachineInstr *MI = MO.getParent();
1733520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    if (MO.isDef()) {
1743520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (DefMI && DefMI != MI)
1753520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1765a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng      if (!MI->canFoldAsLoad())
1773520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1783520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      DefMI = MI;
1793520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    } else if (!MO.isUndef()) {
1803520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (UseMI && UseMI != MI)
1813520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1823520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      // FIXME: Targets don't know how to fold subreg uses.
1833520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      if (MO.getSubReg())
1843520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen        return false;
1853520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      UseMI = MI;
1863520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    }
1873520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  }
1883520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (!DefMI || !UseMI)
1893520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
1903520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
1912ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // Since we're moving the DefMI load, make sure we're not extending any live
1922ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // ranges.
1932ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  if (!allUsesAvailableAt(DefMI,
1942ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen                          LIS.getInstructionIndex(DefMI),
1952ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen                          LIS.getInstructionIndex(UseMI)))
1962ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen    return false;
1972ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen
1982ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // We also need to make sure it is safe to move the load.
1992ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  // Assume there are stores between DefMI and UseMI.
2002ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen  bool SawStore = true;
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DefMI->isSafeToMove(&TII, nullptr, SawStore))
2022ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen    return false;
2032ec0cda5d5ede57022eb7dc5e7170f4fa420cb2bJakob Stoklund Olesen
2043520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  DEBUG(dbgs() << "Try to fold single def: " << *DefMI
2053520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen               << "       into single use: " << *UseMI);
2063520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
2073520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  SmallVector<unsigned, 8> Ops;
2083520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (UseMI->readsWritesVirtualRegister(LI->reg, &Ops).second)
2093520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
2103520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
2113520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  MachineInstr *FoldMI = TII.foldMemoryOperand(UseMI, Ops, DefMI);
2123520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  if (!FoldMI)
2133520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen    return false;
2143520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  DEBUG(dbgs() << "                folded: " << *FoldMI);
2153520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  LIS.ReplaceMachineInstrInMaps(UseMI, FoldMI);
2163520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  UseMI->eraseFromParent();
217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DefMI->addRegisterDead(LI->reg, nullptr);
2183520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  Dead.push_back(DefMI);
219e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen  ++NumDCEFoldedLoads;
2203520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen  return true;
2213520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen}
2223520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen
223f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick/// Find all live intervals that need to shrink, then remove the instruction.
224f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trickvoid LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {
225f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  assert(MI->allDefsAreDead() && "Def isn't really dead");
226f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
2275881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
228529616299f109f58e2a8217a1a760ba961266459Andrew Trick  // Never delete a bundled instruction.
229529616299f109f58e2a8217a1a760ba961266459Andrew Trick  if (MI->isBundled()) {
230529616299f109f58e2a8217a1a760ba961266459Andrew Trick    return;
231529616299f109f58e2a8217a1a760ba961266459Andrew Trick  }
232f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Never delete inline asm.
233f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  if (MI->isInlineAsm()) {
234f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    DEBUG(dbgs() << "Won't delete: " << Idx << '\t' << *MI);
235f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    return;
236f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  }
2375881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
238f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Use the same criteria as DeadMachineInstructionElim.
239f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  bool SawStore = false;
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!MI->isSafeToMove(&TII, nullptr, SawStore)) {
241f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    DEBUG(dbgs() << "Can't delete: " << Idx << '\t' << *MI);
242f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    return;
243f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  }
2445881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
245f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI);
246f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
247f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Collect virtual registers to be erased after MI is gone.
248f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  SmallVector<unsigned, 8> RegsToErase;
249f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  bool ReadsPhysRegs = false;
2505881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
251f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Check for live intervals that may shrink
252f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
253f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick         MOE = MI->operands_end(); MOI != MOE; ++MOI) {
254f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (!MOI->isReg())
255f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      continue;
256f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    unsigned Reg = MOI->getReg();
257f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (!TargetRegisterInfo::isVirtualRegister(Reg)) {
258f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      // Check if MI reads any unreserved physregs.
259f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      if (Reg && MOI->readsReg() && !MRI.isReserved(Reg))
260f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick        ReadsPhysRegs = true;
26103dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick      else if (MOI->isDef()) {
26203dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick        for (MCRegUnitIterator Units(Reg, MRI.getTargetRegisterInfo());
26303dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick             Units.isValid(); ++Units) {
2644f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun          if (LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
2654f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun            if (VNInfo *VNI = LR->getVNInfoAt(Idx))
2664f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun              LR->removeValNo(VNI);
26703dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick          }
26803dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick        }
26903dca5e4b6c41e1e7fa4edad3d7ff8d5f6de7008Andrew Trick      }
270f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      continue;
271f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    }
272f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    LiveInterval &LI = LIS.getInterval(Reg);
273f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
274f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // Shrink read registers, unless it is likely to be expensive and
275f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // unlikely to change anything. We typically don't want to shrink the
276f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // PIC base register that has lots of uses everywhere.
277f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // Always shrink COPY uses that probably come from live range splitting.
278f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (MI->readsVirtualRegister(Reg) &&
279f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick        (MI->isCopy() || MOI->isDef() || MRI.hasOneNonDBGUse(Reg) ||
2805649e25ce86b9d89d228ae7c392413571b0f8c19Matthias Braun         LI.Query(Idx).isKill()))
281f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      ToShrink.insert(&LI);
282f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
283f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // Remove defined value.
284f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (MOI->isDef()) {
285f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      if (VNInfo *VNI = LI.getVNInfoAt(Idx)) {
286e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen        if (TheDelegate)
287f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick          TheDelegate->LRE_WillShrinkVirtReg(LI.reg);
288f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick        LI.removeValNo(VNI);
289f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick        if (LI.empty())
290f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick          RegsToErase.push_back(Reg);
291e2b83ab056836067e2c86ef22223a4c29fe267ceJakob Stoklund Olesen      }
292f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    }
293f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  }
29476ff7418361c1c80ce9d018bce63511a70bd7390Jakob Stoklund Olesen
295f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Currently, we don't support DCE of physreg live ranges. If MI reads
296f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // any unreserved physregs, don't erase the instruction, but turn it into
297f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // a KILL instead. This way, the physreg live ranges don't end up
298f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // dangling.
299f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // FIXME: It would be better to have something like shrinkToUses() for
300f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // physregs. That could potentially enable more DCE and it would free up
301f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // the physreg. It would not happen often, though.
302f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  if (ReadsPhysRegs) {
303f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    MI->setDesc(TII.get(TargetOpcode::KILL));
304f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // Remove all operands that aren't physregs.
305f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    for (unsigned i = MI->getNumOperands(); i; --i) {
306f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      const MachineOperand &MO = MI->getOperand(i-1);
307f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      if (MO.isReg() && TargetRegisterInfo::isPhysicalRegister(MO.getReg()))
308f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick        continue;
309f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      MI->RemoveOperand(i-1);
310f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    }
311f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    DEBUG(dbgs() << "Converted physregs to:\t" << *MI);
312f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  } else {
313f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (TheDelegate)
314f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      TheDelegate->LRE_WillEraseInstruction(MI);
315f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    LIS.RemoveMachineInstrFromMaps(MI);
316f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    MI->eraseFromParent();
317f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    ++NumDCEDeleted;
318f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  }
319f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
320f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // Erase any virtregs that are now empty and unused. There may be <undef>
321f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  // uses around. Keep the empty live range in that case.
322f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  for (unsigned i = 0, e = RegsToErase.size(); i != e; ++i) {
323f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    unsigned Reg = RegsToErase[i];
324f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    if (LIS.hasInterval(Reg) && MRI.reg_nodbg_empty(Reg)) {
325f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      ToShrink.remove(&LIS.getInterval(Reg));
326f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      eraseVirtReg(Reg);
3275881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    }
328f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  }
329f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick}
330f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
331f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trickvoid LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
332f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick                                      ArrayRef<unsigned> RegsBeingSpilled) {
333f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  ToShrinkSet ToShrink;
334f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick
335f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick  for (;;) {
336f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    // Erase all dead defs.
337f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick    while (!Dead.empty())
338f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick      eliminateDeadDef(Dead.pop_back_val(), ToShrink);
3395881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
3405881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    if (ToShrink.empty())
3415881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen      break;
3425881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
3435881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    // Shrink just one live interval. Then delete new dead defs.
3441d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen    LiveInterval *LI = ToShrink.back();
3455881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen    ToShrink.pop_back();
3468a06af96698537377275dd7848db69915638dd26Pete Cooper    if (foldAsLoad(LI, Dead))
3473520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen      continue;
348c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen    if (TheDelegate)
349c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen      TheDelegate->LRE_WillShrinkVirtReg(LI->reg);
3506a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    if (!LIS.shrinkToUses(LI, &Dead))
3516a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen      continue;
352005622ffae7e6386c27a65a8789bb8d0d773f5d8Andrew Trick
3534777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // Don't create new intervals for a register being spilled.
3544777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // The new intervals would have to be spilled anyway so its not worth it.
3554777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // Also they currently aren't spilled so creating them and not spilling
3564777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    // them results in incorrect code.
3574777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    bool BeingSpilled = false;
3584777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    for (unsigned i = 0, e = RegsBeingSpilled.size(); i != e; ++i) {
3594777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper      if (LI->reg == RegsBeingSpilled[i]) {
3604777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper        BeingSpilled = true;
3614777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper        break;
3624777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper      }
3634777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    }
364005622ffae7e6386c27a65a8789bb8d0d773f5d8Andrew Trick
3654777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper    if (BeingSpilled) continue;
3666a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen
3676a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    // LI may have been separated, create new intervals.
3681c6d387dc90fba589f8effb17c72a39f966f87dfJakob Stoklund Olesen    LI->RenumberValues();
3696a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    ConnectedVNInfoEqClasses ConEQ(LIS);
3706a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    unsigned NumComp = ConEQ.Classify(LI);
3716a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    if (NumComp <= 1)
3726a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen      continue;
373e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen    ++NumFracRanges;
3742e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper    bool IsOriginal = VRM && VRM->getOriginal(LI->reg) == LI->reg;
3756a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
3766a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen    SmallVector<LiveInterval*, 8> Dups(1, LI);
377f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen    for (unsigned i = 1; i != NumComp; ++i) {
378e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey      Dups.push_back(&createEmptyIntervalFrom(LI->reg));
3799693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // If LI is an original interval that hasn't been split yet, make the new
3809693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // intervals their own originals instead of referring to LI. The original
3819693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      // interval must contain all the split products, and LI doesn't.
3829693d4c3f0d0e8c91e4748eb1c18799b1de7551cJakob Stoklund Olesen      if (IsOriginal)
3838a06af96698537377275dd7848db69915638dd26Pete Cooper        VRM->setIsSplitFromReg(Dups.back()->reg, 0);
384c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen      if (TheDelegate)
385c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen        TheDelegate->LRE_DidCloneVirtReg(Dups.back()->reg, LI->reg);
386f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen    }
3871edc3cf65d54130542fc91bac67ecf616ef88d48Jakob Stoklund Olesen    ConEQ.Distribute(&Dups[0], MRI);
3887ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen    DEBUG({
3897ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen      for (unsigned i = 0; i != NumComp; ++i)
3907ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen        dbgs() << '\t' << *Dups[i] << '\n';
3917ebed91fddbcd259d03c4b438719ac1ce2a4fc87Jakob Stoklund Olesen    });
3925881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen  }
3935881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen}
3945881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen
39503fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey// Keep track of new virtual registers created via
39603fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey// MachineRegisterInfo::createVirtualRegister.
39703fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Laceyvoid
39803fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark LaceyLiveRangeEdit::MRI_NoteNewVirtualRegister(unsigned VReg)
39903fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey{
40003fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey  if (VRM)
40103fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey    VRM->grow();
40203fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey
40303fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey  NewRegs.push_back(VReg);
40403fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey}
40503fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey
4064eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramervoid
4074eed756153b84c211114a3e9186bf0cb55d4b394Benjamin KramerLiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
4084eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer                                        const MachineLoopInfo &Loops,
4094eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer                                        const MachineBlockFrequencyInfo &MBFI) {
4104eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer  VirtRegAuxInfo VRAI(MF, LIS, Loops, MBFI);
4111feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey  for (unsigned I = 0, Size = size(); I < Size; ++I) {
4121feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey    LiveInterval &LI = LIS.getInterval(get(I));
4136d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen    if (MRI.recomputeRegClass(LI.reg, MF.getTarget()))
4146d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen      DEBUG(dbgs() << "Inflated " << PrintReg(LI.reg) << " to "
4156d1fd0b979cb88809ebb77a24f4da69e1d67606bJakob Stoklund Olesen                   << MRI.getRegClass(LI.reg)->getName() << '\n');
416095f994ba63994e8eb4b77127f9b872429496dbaArnaud A. de Grandmaison    VRAI.calculateSpillWeightAndHint(LI);
4176094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen  }
4186094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen}
419