1a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen//===---- LiveRangeEdit.h - Basic tools for split and spill -----*- C++ -*-===// 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// The parent register is never changed. Instead, a number of new virtual 14a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// registers are created and added to the newRegs vector. 15a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen// 16a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 17a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 18a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#ifndef LLVM_CODEGEN_LIVERANGEEDIT_H 19a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#define LLVM_CODEGEN_LIVERANGEEDIT_H 20a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 21f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 22f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick#include "llvm/ADT/SetVector.h" 23080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen#include "llvm/ADT/SmallPtrSet.h" 24f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen#include "llvm/CodeGen/LiveInterval.h" 2503fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey#include "llvm/CodeGen/MachineRegisterInfo.h" 268a06af96698537377275dd7848db69915638dd26Pete Cooper#include "llvm/Target/TargetMachine.h" 27a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 28a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesennamespace llvm { 29a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 30080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesenclass AliasAnalysis; 31a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenclass LiveIntervals; 324eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramerclass MachineBlockFrequencyInfo; 336094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesenclass MachineLoopInfo; 34a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenclass VirtRegMap; 35a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 3603fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Laceyclass LiveRangeEdit : private MachineRegisterInfo::Delegate { 3792a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesenpublic: 3892a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen /// Callback methods for LiveRangeEdit owners. 392d24e2a396a1d211baaeedf32148a3b657240170David Blaikie class Delegate { 402d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 412d24e2a396a1d211baaeedf32148a3b657240170David Blaikie public: 4292a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen /// Called immediately before erasing a dead machine instruction. 4392a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen virtual void LRE_WillEraseInstruction(MachineInstr *MI) {} 447792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen 457792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen /// Called when a virtual register is no longer used. Return false to defer 467792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen /// its deletion from LiveIntervals. 477792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen virtual bool LRE_CanEraseVirtReg(unsigned) { return true; } 487792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen 491d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen /// Called before shrinking the live range of a virtual register. 501d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen virtual void LRE_WillShrinkVirtReg(unsigned) {} 51f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen 52f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen /// Called after cloning a virtual register. 53f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen /// This is used for new registers representing connected components of Old. 54f22ca3fe5f0cfbb832cf41270f97cf5c0134fd7bJakob Stoklund Olesen virtual void LRE_DidCloneVirtReg(unsigned New, unsigned Old) {} 551d5b84508173b93faf513032b3847152e6060791Jakob Stoklund Olesen 56ab2ee2ea7518b0539c6adcd158d52a45028271f4Matt Beaumont-Gay virtual ~Delegate() {} 5792a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen }; 5892a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesen 5992a55f4bdd120cdd3bb5a004c792d4d24a940311Jakob Stoklund Olesenprivate: 6020942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen LiveInterval *Parent; 611feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey SmallVectorImpl<unsigned> &NewRegs; 628a06af96698537377275dd7848db69915638dd26Pete Cooper MachineRegisterInfo &MRI; 638a06af96698537377275dd7848db69915638dd26Pete Cooper LiveIntervals &LIS; 648a06af96698537377275dd7848db69915638dd26Pete Cooper VirtRegMap *VRM; 658a06af96698537377275dd7848db69915638dd26Pete Cooper const TargetInstrInfo &TII; 66c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen Delegate *const TheDelegate; 67a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 68c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen /// FirstNew - Index of the first register added to NewRegs. 69c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen const unsigned FirstNew; 70a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 71c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen /// ScannedRemattable - true when remattable values have been identified. 72c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen bool ScannedRemattable; 73080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 74c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen /// Remattable - Values defined by remattable instructions as identified by 75080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// tii.isTriviallyReMaterializable(). 76c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen SmallPtrSet<const VNInfo*,4> Remattable; 77080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 78c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen /// Rematted - Values that were actually rematted, and so need to have their 79080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// live range trimmed or entirely removed. 80c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen SmallPtrSet<const VNInfo*,4> Rematted; 81080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 82c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen /// scanRemattable - Identify the Parent values that may rematerialize. 838a06af96698537377275dd7848db69915638dd26Pete Cooper void scanRemattable(AliasAnalysis *aa); 84080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 85080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// allUsesAvailableAt - Return true if all registers used by OrigMI at 86080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// OrigIdx are also available with the same value at UseIdx. 87080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx, 88c2248b0e7895446cccf934b57c6aa3aa712e20d1Jakub Staszak SlotIndex UseIdx) const; 89080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 903520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen /// foldAsLoad - If LI has a single use and a single def that can be folded as 913520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen /// a load, eliminate the register by folding the def into the use. 928a06af96698537377275dd7848db69915638dd26Pete Cooper bool foldAsLoad(LiveInterval *LI, SmallVectorImpl<MachineInstr*> &Dead); 933520019931c2bad615c35edcb943cd1e8582ebacJakob Stoklund Olesen 94f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick typedef SetVector<LiveInterval*, 95f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick SmallVector<LiveInterval*, 8>, 96f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick SmallPtrSet<LiveInterval*, 8> > ToShrinkSet; 97f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick /// Helper for eliminateDeadDefs. 98f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick void eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink); 99f1f99f394f367845c4f4528d4d2bce42e65a5f50Andrew Trick 10003fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey /// MachineRegisterInfo callback to notify when new virtual 10103fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey /// registers are created. 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void MRI_NoteNewVirtualRegister(unsigned VReg) override; 10303fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey 104a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenpublic: 105a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen /// Create a LiveRangeEdit for breaking down parent into smaller pieces. 106a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen /// @param parent The register being spilled or split. 107a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen /// @param newRegs List to receive any new registers created. This needn't be 108a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen /// empty initially, any existing registers are ignored. 1092e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper /// @param MF The MachineFunction the live range edit is taking place in. 1102e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper /// @param lis The collection of all live intervals in this function. 1112e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper /// @param vrm Map of virtual registers to physical registers for this 1122e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper /// function. If NULL, no virtual register map updates will 1132e267ae7b8caf7192a3793eb3b78937ff83f794dPete Cooper /// be done. This could be the case if called before Regalloc. 11420942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen LiveRangeEdit(LiveInterval *parent, 1151feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey SmallVectorImpl<unsigned> &newRegs, 1168a06af96698537377275dd7848db69915638dd26Pete Cooper MachineFunction &MF, 1178a06af96698537377275dd7848db69915638dd26Pete Cooper LiveIntervals &lis, 1188a06af96698537377275dd7848db69915638dd26Pete Cooper VirtRegMap *vrm, 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Delegate *delegate = nullptr) 120c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen : Parent(parent), NewRegs(newRegs), 1218a06af96698537377275dd7848db69915638dd26Pete Cooper MRI(MF.getRegInfo()), LIS(lis), VRM(vrm), 1228a06af96698537377275dd7848db69915638dd26Pete Cooper TII(*MF.getTarget().getInstrInfo()), 123c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen TheDelegate(delegate), 124c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen FirstNew(newRegs.size()), 12503fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey ScannedRemattable(false) { MRI.setDelegate(this); } 12603fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey 12703fe68e0a9c0fdd196f62899cb44b6f9a56dd7c8Mark Lacey ~LiveRangeEdit() { MRI.resetDelegate(this); } 128a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 12920942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen LiveInterval &getParent() const { 13020942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen assert(Parent && "No parent LiveInterval"); 13120942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen return *Parent; 13220942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen } 13320942dcd8634ad75091fe89669868cfebf74e869Jakob Stoklund Olesen unsigned getReg() const { return getParent().reg; } 134a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 135a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen /// Iterator for accessing the new registers added by this edit. 1361feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey typedef SmallVectorImpl<unsigned>::const_iterator iterator; 137c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen iterator begin() const { return NewRegs.begin()+FirstNew; } 138c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen iterator end() const { return NewRegs.end(); } 139c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen unsigned size() const { return NewRegs.size()-FirstNew; } 1400f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher bool empty() const { return size() == 0; } 1411feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey unsigned get(unsigned idx) const { return NewRegs[idx+FirstNew]; } 142a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 1431feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey ArrayRef<unsigned> regs() const { 144c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen return makeArrayRef(NewRegs).slice(FirstNew); 145f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen } 146f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen 147e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey /// createEmptyIntervalFrom - Create a new empty interval based on OldReg. 148e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey LiveInterval &createEmptyIntervalFrom(unsigned OldReg); 149e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey 150e9c50732f71a6c2f6813f6c40743a9bfa3791ca8Jakob Stoklund Olesen /// createFrom - Create a new virtual register based on OldReg. 151e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey unsigned createFrom(unsigned OldReg); 152e9c50732f71a6c2f6813f6c40743a9bfa3791ca8Jakob Stoklund Olesen 1536a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen /// create - Create a new register with the same class and original slot as 1542a0180fbff4870995482d96986ad780ab9de8af4Jakob Stoklund Olesen /// parent. 155e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey LiveInterval &createEmptyInterval() { 156e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey return createEmptyIntervalFrom(getReg()); 157e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey } 158e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey 159e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey unsigned create() { 1608a06af96698537377275dd7848db69915638dd26Pete Cooper return createFrom(getReg()); 1616a3dbd3b25bbc99bd1a233d6a74ddea3493ba6acJakob Stoklund Olesen } 162a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 163080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// anyRematerializable - Return true if any parent values may be 164080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// rematerializable. 1651973b3e2541f95c87e4acb7e134362ff306ec9edJakob Stoklund Olesen /// This function must be called before any rematerialization is attempted. 1668a06af96698537377275dd7848db69915638dd26Pete Cooper bool anyRematerializable(AliasAnalysis*); 167080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 1682ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen /// checkRematerializable - Manually add VNI to the list of rematerializable 1692ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen /// values if DefMI may be rematerializable. 1703b7d917dec53a742fcb14802557ee75d35185968Jakob Stoklund Olesen bool checkRematerializable(VNInfo *VNI, const MachineInstr *DefMI, 1718a06af96698537377275dd7848db69915638dd26Pete Cooper AliasAnalysis*); 1722ef661b0e8de0d4186c5f9cc990adce0a2493b17Jakob Stoklund Olesen 173080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// Remat - Information needed to rematerialize at a specific location. 174080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen struct Remat { 175080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen VNInfo *ParentVNI; // parent_'s value at the remat location. 176080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineInstr *OrigMI; // Instruction defining ParentVNI. 177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines explicit Remat(VNInfo *ParentVNI) : ParentVNI(ParentVNI), OrigMI(nullptr) {} 178080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen }; 179080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 180080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// canRematerializeAt - Determine if ParentVNI can be rematerialized at 181080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// UseIdx. It is assumed that parent_.getVNINfoAt(UseIdx) == ParentVNI. 182080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// When cheapAsAMove is set, only cheap remats are allowed. 183b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen bool canRematerializeAt(Remat &RM, 184b80e973c95034e5754d888140497a9658a7c1dedJakob Stoklund Olesen SlotIndex UseIdx, 1858a06af96698537377275dd7848db69915638dd26Pete Cooper bool cheapAsAMove); 186080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen 187080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an 188080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// instruction into MBB before MI. The new instruction is mapped, but 189080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// liveness is not updated. 190080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// Return the SlotIndex of the new instruction. 191080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen SlotIndex rematerializeAt(MachineBasicBlock &MBB, 192080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen MachineBasicBlock::iterator MI, 193080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen unsigned DestReg, 194080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen const Remat &RM, 195bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen const TargetRegisterInfo&, 196bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen bool Late = false); 197a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 19883d1ba572815c92a74817cc68e2bb48c59a87b5dJakob Stoklund Olesen /// markRematerialized - explicitly mark a value as rematerialized after doing 19983d1ba572815c92a74817cc68e2bb48c59a87b5dJakob Stoklund Olesen /// it manually. 2004670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen void markRematerialized(const VNInfo *ParentVNI) { 201c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen Rematted.insert(ParentVNI); 20283d1ba572815c92a74817cc68e2bb48c59a87b5dJakob Stoklund Olesen } 20383d1ba572815c92a74817cc68e2bb48c59a87b5dJakob Stoklund Olesen 204080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen /// didRematerialize - Return true if ParentVNI was rematerialized anywhere. 2054670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen bool didRematerialize(const VNInfo *ParentVNI) const { 206c696c8bd35a8ab293879e821142dd9136201f16eJakob Stoklund Olesen return Rematted.count(ParentVNI); 207080c316ff8a066cd164d9a8f92df509d8cb63110Jakob Stoklund Olesen } 2085881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 2097792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen /// eraseVirtReg - Notify the delegate that Reg is no longer in use, and try 2107792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen /// to erase it from LIS. 2118a06af96698537377275dd7848db69915638dd26Pete Cooper void eraseVirtReg(unsigned Reg); 2127792e980c43536814ea42448db9799b4da32fef6Jakob Stoklund Olesen 2135881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen /// eliminateDeadDefs - Try to delete machine instructions that are now dead 2145881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen /// (allDefsAreDead returns true). This may cause live intervals to be trimmed 2155881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen /// and further dead efs to be eliminated. 2164777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper /// RegsBeingSpilled lists registers currently being spilled by the register 2174777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper /// allocator. These registers should not be split into new intervals 2184777ebb767d1b590c05d502c4a7f6adef4e6d5d1Pete Cooper /// as currently those new intervals are not guaranteed to spill. 2195881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen void eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead, 2205c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko ArrayRef<unsigned> RegsBeingSpilled = None); 2215881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 2226094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen /// calculateRegClassAndHint - Recompute register class and hint for each new 2236094bd87d845afabba5b99ec4848fa6116bac682Jakob Stoklund Olesen /// register. 2248a06af96698537377275dd7848db69915638dd26Pete Cooper void calculateRegClassAndHint(MachineFunction&, 2254eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer const MachineLoopInfo&, 2264eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer const MachineBlockFrequencyInfo&); 227a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen}; 228a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 229a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen} 230a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen 231a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen#endif 232