LLVM
8.0.1
|
#include "llvm/CodeGen/LiveRangeEdit.h"
Classes | |
class | Delegate |
Callback methods for LiveRangeEdit owners. More... | |
struct | Remat |
Remat - Information needed to rematerialize at a specific location. More... | |
Public Types | |
using | iterator = SmallVectorImpl< unsigned >::const_iterator |
Iterator for accessing the new registers added by this edit. More... | |
Public Member Functions | |
LiveRangeEdit (LiveInterval *parent, SmallVectorImpl< unsigned > &newRegs, MachineFunction &MF, LiveIntervals &lis, VirtRegMap *vrm, Delegate *delegate=nullptr, SmallPtrSet< MachineInstr *, 32 > *deadRemats=nullptr) | |
Create a LiveRangeEdit for breaking down parent into smaller pieces. More... | |
~LiveRangeEdit () override | |
LiveInterval & | getParent () const |
unsigned | getReg () const |
iterator | begin () const |
iterator | end () const |
unsigned | size () const |
bool | empty () const |
unsigned | get (unsigned idx) const |
void | pop_back () |
pop_back - It allows LiveRangeEdit users to drop new registers. More... | |
ArrayRef< unsigned > | regs () const |
unsigned | createFrom (unsigned OldReg) |
createFrom - Create a new virtual register based on OldReg. More... | |
LiveInterval & | createEmptyInterval () |
create - Create a new register with the same class and original slot as parent. More... | |
unsigned | create () |
bool | anyRematerializable (AliasAnalysis *) |
anyRematerializable - Return true if any parent values may be rematerializable. More... | |
bool | checkRematerializable (VNInfo *VNI, const MachineInstr *DefMI, AliasAnalysis *) |
checkRematerializable - Manually add VNI to the list of rematerializable values if DefMI may be rematerializable. More... | |
bool | canRematerializeAt (Remat &RM, VNInfo *OrigVNI, SlotIndex UseIdx, bool cheapAsAMove) |
canRematerializeAt - Determine if ParentVNI can be rematerialized at UseIdx. More... | |
SlotIndex | rematerializeAt (MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, const Remat &RM, const TargetRegisterInfo &, bool Late=false) |
rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an instruction into MBB before MI. More... | |
void | markRematerialized (const VNInfo *ParentVNI) |
markRematerialized - explicitly mark a value as rematerialized after doing it manually. More... | |
bool | didRematerialize (const VNInfo *ParentVNI) const |
didRematerialize - Return true if ParentVNI was rematerialized anywhere. More... | |
void | eraseVirtReg (unsigned Reg) |
eraseVirtReg - Notify the delegate that Reg is no longer in use, and try to erase it from LIS. More... | |
void | eliminateDeadDefs (SmallVectorImpl< MachineInstr *> &Dead, ArrayRef< unsigned > RegsBeingSpilled=None, AliasAnalysis *AA=nullptr) |
eliminateDeadDefs - Try to delete machine instructions that are now dead (allDefsAreDead returns true). More... | |
void | calculateRegClassAndHint (MachineFunction &, const MachineLoopInfo &, const MachineBlockFrequencyInfo &) |
calculateRegClassAndHint - Recompute register class and hint for each new register. More... | |
Definition at line 46 of file LiveRangeEdit.h.
using llvm::LiveRangeEdit::iterator = SmallVectorImpl<unsigned>::const_iterator |
Iterator for accessing the new registers added by this edit.
Definition at line 159 of file LiveRangeEdit.h.
|
inline |
Create a LiveRangeEdit for breaking down parent into smaller pieces.
parent | The register being spilled or split. |
newRegs | List to receive any new registers created. This needn't be empty initially, any existing registers are ignored. |
MF | The MachineFunction the live range edit is taking place in. |
lis | The collection of all live intervals in this function. |
vrm | Map of virtual registers to physical registers for this function. If NULL, no virtual register map updates will be done. This could be the case if called before Regalloc. |
deadRemats | The collection of all the instructions defining an original reg and are dead after remat. |
Definition at line 139 of file LiveRangeEdit.h.
References llvm::MachineRegisterInfo::setDelegate().
|
inlineoverride |
Definition at line 149 of file LiveRangeEdit.h.
References llvm::MachineRegisterInfo::resetDelegate().
bool LiveRangeEdit::anyRematerializable | ( | AliasAnalysis * | aa | ) |
anyRematerializable - Return true if any parent values may be rematerializable.
This function must be called before any rematerialization is attempted.
Definition at line 99 of file LiveRangeEdit.cpp.
References llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::SlotIndex::getRegSlot(), llvm::LiveRange::getVNInfoAt(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::MachineOperand::isReg(), llvm::SlotIndex::isSameInstr(), MRI, and llvm::MachineOperand::readsReg().
Referenced by create(), and llvm::SplitEditor::reset().
|
inline |
Definition at line 160 of file LiveRangeEdit.h.
References llvm::SmallVectorTemplateCommon< T, typename >::begin().
Referenced by getNumAllocatableRegsForConstraints().
void LiveRangeEdit::calculateRegClassAndHint | ( | MachineFunction & | MF, |
const MachineLoopInfo & | Loops, | ||
const MachineBlockFrequencyInfo & | MBFI | ||
) |
calculateRegClassAndHint - Recompute register class and hint for each new register.
Definition at line 461 of file LiveRangeEdit.cpp.
References llvm::VirtRegAuxInfo::calculateSpillWeightAndHint(), llvm::dbgs(), llvm::TargetRegisterInfo::getRegClassName(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), I, LLVM_DEBUG, MRI, llvm::printReg(), llvm::LiveInterval::reg, Size, size(), and TRI.
Referenced by didRematerialize().
bool LiveRangeEdit::canRematerializeAt | ( | Remat & | RM, |
VNInfo * | OrigVNI, | ||
SlotIndex | UseIdx, | ||
bool | cheapAsAMove | ||
) |
canRematerializeAt - Determine if ParentVNI can be rematerialized at UseIdx.
It is assumed that parent_.getVNINfoAt(UseIdx) == ParentVNI. When cheapAsAMove is set, only cheap remats are allowed.
Definition at line 141 of file LiveRangeEdit.cpp.
References assert(), llvm::LiveRangeEdit::Remat::OrigMI, and TII.
Referenced by llvm::SplitEditor::dump(), and llvm::LiveRangeEdit::Remat::Remat().
bool LiveRangeEdit::checkRematerializable | ( | VNInfo * | VNI, |
const MachineInstr * | DefMI, | ||
AliasAnalysis * | aa | ||
) |
checkRematerializable - Manually add VNI to the list of rematerializable values if DefMI may be rematerializable.
Definition at line 71 of file LiveRangeEdit.cpp.
References aa, assert(), llvm::VNInfo::def, DefMI, getParent(), getReg(), llvm::LiveRange::getVNInfoAt(), and TII.
Referenced by create().
|
inline |
Definition at line 189 of file LiveRangeEdit.h.
References anyRematerializable(), checkRematerializable(), createFrom(), DefMI, and getReg().
|
inline |
create - Create a new register with the same class and original slot as parent.
Definition at line 185 of file LiveRangeEdit.h.
References getReg().
Referenced by llvm::SplitEditor::openIntv().
createFrom - Create a new virtual register based on OldReg.
Definition at line 55 of file LiveRangeEdit.cpp.
References MRI.
didRematerialize - Return true if ParentVNI was rematerialized anywhere.
Definition at line 232 of file LiveRangeEdit.h.
References calculateRegClassAndHint(), llvm::SmallPtrSetImpl< PtrType >::count(), eliminateDeadDefs(), eraseVirtReg(), llvm::None, and Reg.
void LiveRangeEdit::eliminateDeadDefs | ( | SmallVectorImpl< MachineInstr *> & | Dead, |
ArrayRef< unsigned > | RegsBeingSpilled = None , |
||
AliasAnalysis * | AA = nullptr |
||
) |
eliminateDeadDefs - Try to delete machine instructions that are now dead (allDefsAreDead returns true).
This may cause live intervals to be trimmed and further dead efs to be eliminated. RegsBeingSpilled lists registers currently being spilled by the register allocator. These registers should not be split into new intervals as currently those new intervals are not guaranteed to spill.
Definition at line 391 of file LiveRangeEdit.cpp.
References llvm::SetVector< T, Vector, Set >::back(), llvm::SmallVectorBase::empty(), llvm::SetVector< T, Vector, Set >::empty(), llvm::SmallVectorTemplateBase< T, bool >::grow(), llvm::SetVector< T, Vector, Set >::pop_back(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::LiveInterval::reg, llvm::LiveRange::RenumberValues(), and llvm::ArrayRef< T >::size().
Referenced by didRematerialize(), and llvm::CoalescerPair::isCoalescable().
|
inline |
Definition at line 163 of file LiveRangeEdit.h.
References size().
Referenced by getNumAllocatableRegsForConstraints(), and llvm::SplitEditor::openIntv().
|
inline |
Definition at line 161 of file LiveRangeEdit.h.
References llvm::SmallVectorTemplateCommon< T, typename >::end().
Referenced by getNumAllocatableRegsForConstraints().
void LiveRangeEdit::eraseVirtReg | ( | unsigned | Reg | ) |
eraseVirtReg - Notify the delegate that Reg is no longer in use, and try to erase it from LIS.
Definition at line 181 of file LiveRangeEdit.cpp.
References llvm::MachineInstr::addRegisterDead(), llvm::LiveRange::addSegment(), llvm::MachineInstr::allDefsAreDead(), assert(), llvm::MachineInstr::canFoldAsLoad(), llvm::dbgs(), llvm::RegState::Dead, llvm::VNInfo::def, DefMI, llvm::LiveRange::empty(), llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::getDesc(), llvm::LiveRange::getNextValue(), llvm::MCInstrDesc::getNumDefs(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getParent(), llvm::MachineOperand::getReg(), llvm::SlotIndex::getRegSlot(), llvm::MachineOperand::getSubReg(), llvm::TargetRegisterInfo::getSubRegIndexLaneMask(), llvm::LiveRange::getVNInfoAt(), llvm::SetVector< T, Vector, Set >::insert(), llvm::MachineInstr::isBundled(), llvm::MachineInstr::isCopy(), llvm::MachineOperand::isDef(), llvm::MachineInstr::isInlineAsm(), llvm::LiveQueryResult::isKill(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::MachineOperand::isReg(), llvm::MachineInstr::isSafeToMove(), llvm::SlotIndex::isSameInstr(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::AMDGPUISD::KILL, LLVM_DEBUG, MI, MRI, llvm::MachineInstr::operands_begin(), llvm::MachineInstr::operands_end(), pop_back(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::LiveRange::Query(), llvm::MachineInstr::readsVirtualRegister(), llvm::MachineInstr::readsWritesVirtualRegister(), llvm::LiveInterval::reg, Reg, llvm::SetVector< T, Vector, Set >::remove(), llvm::MachineInstr::RemoveOperand(), llvm::MachineInstr::setDesc(), llvm::MachineOperand::setIsDead(), llvm::SmallVectorBase::size(), llvm::LiveInterval::subranges(), SubReg, llvm::MachineInstr::substituteRegister(), TII, TRI, and UseMI.
Referenced by didRematerialize().
Definition at line 164 of file LiveRangeEdit.h.
Referenced by llvm::SplitEditor::dump(), and getNumAllocatableRegsForConstraints().
|
inline |
Definition at line 151 of file LiveRangeEdit.h.
References assert().
Referenced by checkRematerializable(), llvm::SplitEditor::dump(), llvm::SplitEditor::enterIntvAfter(), llvm::SplitEditor::enterIntvBefore(), getReg(), isFullUndefDef(), llvm::SplitEditor::leaveIntvAfter(), and llvm::SplitEditor::leaveIntvBefore().
|
inline |
Definition at line 156 of file LiveRangeEdit.h.
References getParent(), and llvm::LiveInterval::reg.
Referenced by checkRematerializable(), create(), createEmptyInterval(), llvm::SplitEditor::dump(), isFullUndefDef(), and llvm::SplitEditor::leaveIntvAfter().
markRematerialized - explicitly mark a value as rematerialized after doing it manually.
Definition at line 227 of file LiveRangeEdit.h.
References llvm::SmallPtrSetImpl< PtrType >::insert().
|
inline |
pop_back - It allows LiveRangeEdit users to drop new registers.
The context is when an original def instruction of a register is dead after rematerialization, we still want to keep it for following rematerializations. We save the def instruction in DeadRemats, and replace the original dst register with a new dummy register so the live range of original dst register can be shrinked normally. We don't want to allocate phys register for the dummy register, so we want to drop it from the NewRegs set.
Definition at line 174 of file LiveRangeEdit.h.
References llvm::SmallVectorTemplateBase< T, bool >::pop_back().
Referenced by eraseVirtReg().
Definition at line 176 of file LiveRangeEdit.h.
References createFrom(), and llvm::makeArrayRef().
Referenced by getNumAllocatableRegsForConstraints().
SlotIndex LiveRangeEdit::rematerializeAt | ( | MachineBasicBlock & | MBB, |
MachineBasicBlock::iterator | MI, | ||
unsigned | DestReg, | ||
const Remat & | RM, | ||
const TargetRegisterInfo & | tri, | ||
bool | Late = false |
||
) |
rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an instruction into MBB before MI.
The new instruction is mapped, but liveness is not updated. Return the SlotIndex of the new instruction.
Definition at line 165 of file LiveRangeEdit.cpp.
References assert(), MI, llvm::LiveRangeEdit::Remat::OrigMI, llvm::LiveRangeEdit::Remat::ParentVNI, and TII.
Referenced by llvm::SplitEditor::dump(), and llvm::LiveRangeEdit::Remat::Remat().
|
inline |
Definition at line 162 of file LiveRangeEdit.h.
References llvm::SmallVectorBase::size().
Referenced by calculateRegClassAndHint(), empty(), and llvm::SplitEditor::openIntv().