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