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