25#define DEBUG_TYPE "regalloc"
27STATISTIC(NumDCEDeleted,
"Number of instructions deleted by DCE");
28STATISTIC(NumDCEFoldedLoads,
"Number of single use loads folded after DCE");
29STATISTIC(NumFracRanges,
"Number of live ranges fractured by DCE");
30STATISTIC(NumReMaterialization,
"Number of instructions rematerialized");
32void LiveRangeEdit::Delegate::anchor() { }
34LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(
Register OldReg,
35 bool createSubRanges) {
36 Register VReg = MRI.cloneVirtualRegister(OldReg);
38 VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
40 LiveInterval &LI = LIS.createEmptyInterval(VReg);
41 if (Parent && !Parent->isSpillable())
43 if (createSubRanges) {
47 LiveInterval &OldLI = LIS.getInterval(OldReg);
49 for (LiveInterval::SubRange &S : OldLI.
subranges())
56 Register VReg = MRI.cloneVirtualRegister(OldReg);
58 VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
66 if (Parent && !Parent->isSpillable())
67 LIS.getInterval(VReg).markNotSpillable();
72 assert(RM.OrigMI &&
"No defining instruction for remattable value");
74 if (!TII.isReMaterializable(*RM.OrigMI))
88 assert(RM.OrigMI &&
"Invalid remat");
89 TII.reMaterialize(
MBB,
MI, DestReg, SubIdx, *RM.OrigMI, UsedLanes);
93 (*--
MI).clearRegisterDeads(DestReg);
94 Rematted.insert(RM.ParentVNI);
95 ++NumReMaterialization;
99 return LIS.ReplaceMachineInstrInMaps(*ReplaceIndexMI, *
MI)
101 return LIS.getSlotIndexes()->insertMachineInstrInMaps(*
MI, Late).getRegSlot(
106 if (TheDelegate && TheDelegate->LRE_CanEraseVirtReg(Reg))
107 LIS.removeInterval(Reg);
120 if (!
MI->canFoldAsLoad())
123 }
else if (!MO.isUndef()) {
138 DefMI, LIS.getInstructionIndex(*
UseMI), LIS, MRI, TII))
143 bool SawStore =
true;
148 <<
" into single use: " << *
UseMI);
150 SmallVector<unsigned, 8>
Ops;
154 MachineInstr *CopyMI =
nullptr;
155 MachineInstr *FoldMI =
156 TII.foldMemoryOperand(*
UseMI,
Ops, *
DefMI, CopyMI, &LIS, VRM);
160 SlotIndex FoldIdx = LIS.ReplaceMachineInstrInMaps(*
UseMI, *FoldMI);
169 SlotIndex CopyIdx = LIS.InsertMachineInstrInMaps(*CopyMI).getRegSlot();
171 LiveInterval &CopyDstLI = LIS.getInterval(CopyDstReg);
176 if (TheDelegate && CopyDstReg.
isVirtual() && VRM &&
177 VRM->hasPhys(CopyDstReg))
178 TheDelegate->LRE_WillShrinkVirtReg(CopyDstReg);
180 VNInfo *VNI = CopyDstLI.
getNextValue(CopyIdx, LIS.getVNInfoAllocator());
182 LiveRange::Segment(CopyIdx, FoldIdx.
getRegSlot(), VNI));
186 LiveInterval &SrcLI = LIS.getInterval(R);
187 LIS.shrinkToUses(&SrcLI);
189 assert(MRI.isReserved(R) &&
"Unexpected PhysReg in source operand!");
195bool LiveRangeEdit::useIsKill(
const LiveInterval &LI,
const MachineInstr &
MI,
196 const MachineOperand &MO)
const {
197 SlotIndex Idx = LIS.getInstructionIndex(
MI).getRegSlot();
200 const TargetRegisterInfo &
TRI = *MRI.getTargetRegisterInfo();
202 LaneBitmask LaneMask =
TRI.getSubRegIndexLaneMask(SubReg);
203 for (
const LiveInterval::SubRange &S : LI.
subranges()) {
204 if ((S.LaneMask & LaneMask).any() && S.Query(Idx).isKill())
211void LiveRangeEdit::eliminateDeadDef(MachineInstr *
MI, ToShrinkSet &ToShrink) {
212 assert(
MI->allDefsAreDead() &&
"Def isn't really dead");
213 SlotIndex Idx = LIS.getInstructionIndex(*MI).
getRegSlot();
216 if (
MI->isBundled()) {
218 LLVM_DEBUG(
dbgs() <<
"Won't delete dead bundled inst: " << Idx <<
'\t'
224 if (
MI->isInlineAsm()) {
230 bool SawStore =
false;
231 if (!
MI->isSafeToMove(SawStore)) {
240 bool ReadsPhysRegs =
false;
241 bool isOrigDef =
false;
247 if (VRM &&
MI->getOperand(0).isReg() &&
MI->getOperand(0).isDef() &&
248 MI->getDesc().getNumDefs() == 1) {
249 Dest =
MI->getOperand(0).getReg();
250 DestSubReg =
MI->getOperand(0).getSubReg();
251 Register Original = VRM->getOriginal(Dest);
252 LiveInterval &OrigLI = LIS.getInterval(Original);
262 bool HasLiveVRegUses =
false;
265 for (
const MachineOperand &MO :
MI->operands()) {
272 ReadsPhysRegs =
true;
277 LiveInterval &LI = LIS.getInterval(
Reg);
283 if ((
MI->readsVirtualRegister(
Reg) &&
284 (MO.
isDef() || TII.isCopyInstr(*
MI))) ||
285 (MO.
readsReg() && (MRI.hasOneNonDBGUse(
Reg) || useIsKill(LI, *
MI, MO))))
286 ToShrink.insert(&LI);
288 HasLiveVRegUses =
true;
293 TheDelegate->LRE_WillShrinkVirtReg(LI.
reg());
294 LIS.removeVRegDefAt(LI, Idx);
310 if (isOrigDef && DeadRemats && !HasLiveVRegUses &&
311 TII.isReMaterializable(*
MI)) {
312 LiveInterval &NewLI = createEmptyIntervalFrom(Dest,
false);
318 const TargetRegisterInfo *
TRI = MRI.getTargetRegisterInfo();
322 SR->getNextValue(Idx,
Alloc)));
326 DeadRemats->insert(
MI);
327 const TargetRegisterInfo &
TRI = *MRI.getTargetRegisterInfo();
328 MI->substituteRegister(Dest, NewLI.
reg(), 0,
TRI);
338 else if (ReadsPhysRegs) {
339 MI->setDesc(TII.get(TargetOpcode::KILL));
341 for (
unsigned i =
MI->getNumOperands(); i; --i) {
342 const MachineOperand &MO =
MI->getOperand(i-1);
345 MI->removeOperand(i-1);
347 MI->dropMemRefs(*
MI->getMF());
351 TheDelegate->LRE_WillEraseInstruction(
MI);
352 LIS.RemoveMachineInstrFromMaps(*
MI);
353 MI->eraseFromParent();
360 if (LIS.hasInterval(
Reg) && MRI.reg_nodbg_empty(
Reg)) {
361 ToShrink.remove(&LIS.getInterval(
Reg));
369 ToShrinkSet ToShrink;
373 while (!
Dead.empty())
374 eliminateDeadDef(
Dead.pop_back_val(), ToShrink);
376 if (ToShrink.
empty())
381 if (foldAsLoad(LI,
Dead))
385 TheDelegate->LRE_WillShrinkVirtReg(VReg);
386 if (!LIS.shrinkToUses(LI, &
Dead))
399 LIS.splitSeparateComponents(*LI, SplitLIs);
400 if (!SplitLIs.
empty())
408 if (Original != VReg && Original != 0)
409 VRM->setIsSplitFromReg(SplitLI->reg(), Original);
411 TheDelegate->LRE_DidCloneVirtReg(SplitLI->reg(), VReg);
419LiveRangeEdit::MRI_NoteNewVirtualRegister(
Register VReg) {
423 NewRegs.push_back(VReg);
430 if (MRI.recomputeRegClass(LI.
reg()))
434 <<
TRI->getRegClassName(MRI.getRegClass(LI.
reg())) <<
'\n';
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Register const TargetRegisterInfo * TRI
Promote Memory to Register
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LiveInterval - This class represents the liveness of a register, or stack slot.
void markNotSpillable()
markNotSpillable - Mark interval as not spillable
iterator_range< subrange_iterator > subranges()
SubRange * createSubRange(BumpPtrAllocator &Allocator, LaneBitmask LaneMask)
Creates a new empty subregister live range.
bool isKill() const
Return true if the live-in value is killed by this instruction.
void eraseVirtReg(Register Reg)
eraseVirtReg - Notify the delegate that Reg is no longer in use, and try to erase it from LIS.
Register get(unsigned idx) const
Register createFrom(Register OldReg)
createFrom - Create a new virtual register based on OldReg.
void calculateRegClassAndHint(MachineFunction &, VirtRegAuxInfo &)
calculateRegClassAndHint - Recompute register class and hint for each new register.
SlotIndex rematerializeAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, const Remat &RM, const TargetRegisterInfo &, bool Late=false, unsigned SubIdx=0, MachineInstr *ReplaceIndexMI=nullptr, LaneBitmask UsedLanes=LaneBitmask::getAll())
rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an instruction into MBB before...
bool canRematerializeAt(Remat &RM, SlotIndex UseIdx)
canRematerializeAt - Determine if RM.Orig can be rematerialized at UseIdx.
void eliminateDeadDefs(SmallVectorImpl< MachineInstr * > &Dead, ArrayRef< Register > RegsBeingSpilled={})
eliminateDeadDefs - Try to delete machine instructions that are now dead (allDefsAreDead returns true...
void pop_back()
pop_back - It allows LiveRangeEdit users to drop new registers.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
LLVM_ABI void RenumberValues()
RenumberValues - Renumber all values in order of appearance and remove unused values.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
MachineInstrBundleIterator< MachineInstr > iterator
void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Representation of each machine instruction.
LLVM_ABI std::pair< bool, bool > readsWritesVirtualRegister(Register Reg, SmallVectorImpl< unsigned > *Ops=nullptr) const
Return a pair of bools (reads, writes) indicating if this instruction reads or writes Reg.
LLVM_ABI bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
LLVM_ABI bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Register getReg() const
getReg - Returns the register number.
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
bool empty() const
Determine if the SetVector is empty or not.
value_type pop_back_val()
SlotIndex - An opaque wrapper around machine indexes.
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
BumpPtrAllocator Allocator
SlotIndex def
The index of the defining instruction.
Calculate auxiliary information for a virtual register such as its spill weight and allocation hint.
static LLVM_ABI bool allUsesAvailableAt(const MachineInstr *MI, SlotIndex UseIdx, const LiveIntervals &LIS, const MachineRegisterInfo &MRI, const TargetInstrInfo &TII)
LLVM_ABI void calculateSpillWeightAndHint(LiveInterval &LI)
(re)compute li's spill weight and allocation hint.
This is an optimization pass for GlobalISel generic memory operations.
@ EarlyClobber
Register definition happens before uses.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Remat - Information needed to rematerialize at a specific location.