LLVM 19.0.0git
Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes | List of all members
llvm::LiveIntervals Class Reference

#include "llvm/CodeGen/LiveIntervals.h"

Inheritance diagram for llvm::LiveIntervals:
Inheritance graph
[legend]

Classes

class  HMEditor
 Toolkit used by handleMove to trim or extend live intervals. More...
 

Public Member Functions

 LiveIntervals ()
 
 ~LiveIntervals () override
 
LiveIntervalgetInterval (Register Reg)
 
const LiveIntervalgetInterval (Register Reg) const
 
bool hasInterval (Register Reg) const
 
LiveIntervalcreateEmptyInterval (Register Reg)
 Interval creation.
 
LiveIntervalcreateAndComputeVirtRegInterval (Register Reg)
 
LiveIntervalgetOrCreateEmptyInterval (Register Reg)
 Return an existing interval for Reg.
 
void removeInterval (Register Reg)
 Interval removal.
 
LiveInterval::Segment addSegmentToEndOfBlock (Register Reg, MachineInstr &startInst)
 Given a register and an instruction, adds a live segment from that instruction to the end of its MBB.
 
bool shrinkToUses (LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
 After removing some uses of a register, shrink its live range to just the remaining uses.
 
void shrinkToUses (LiveInterval::SubRange &SR, Register Reg)
 Specialized version of shrinkToUses(LiveInterval li, SmallVectorImpl<MachineInstr> *dead) that works on a subregister live range and only looks at uses matching the lane mask of the subregister range.
 
void extendToIndices (LiveRange &LR, ArrayRef< SlotIndex > Indices, ArrayRef< SlotIndex > Undefs)
 Extend the live range LR to reach all points in Indices.
 
void extendToIndices (LiveRange &LR, ArrayRef< SlotIndex > Indices)
 
void pruneValue (LiveRange &LR, SlotIndex Kill, SmallVectorImpl< SlotIndex > *EndPoints)
 If LR has a live value at Kill, prune its live range by removing any liveness reachable from Kill.
 
LLVM_ATTRIBUTE_UNUSED void pruneValue (LiveInterval &, SlotIndex, SmallVectorImpl< SlotIndex > *)
 This function should not be used.
 
SlotIndexesgetSlotIndexes () const
 
bool isNotInMIMap (const MachineInstr &Instr) const
 Returns true if the specified machine instr has been removed or was never entered in the map.
 
SlotIndex getInstructionIndex (const MachineInstr &Instr) const
 Returns the base index of the given instruction.
 
MachineInstrgetInstructionFromIndex (SlotIndex index) const
 Returns the instruction associated with the given index.
 
SlotIndex getMBBStartIdx (const MachineBasicBlock *mbb) const
 Return the first index in the given basic block.
 
SlotIndex getMBBEndIdx (const MachineBasicBlock *mbb) const
 Return the last index in the given basic block.
 
bool isLiveInToMBB (const LiveRange &LR, const MachineBasicBlock *mbb) const
 
bool isLiveOutOfMBB (const LiveRange &LR, const MachineBasicBlock *mbb) const
 
MachineBasicBlockgetMBBFromIndex (SlotIndex index) const
 
void insertMBBInMaps (MachineBasicBlock *MBB)
 
SlotIndex InsertMachineInstrInMaps (MachineInstr &MI)
 
void InsertMachineInstrRangeInMaps (MachineBasicBlock::iterator B, MachineBasicBlock::iterator E)
 
void RemoveMachineInstrFromMaps (MachineInstr &MI)
 
SlotIndex ReplaceMachineInstrInMaps (MachineInstr &MI, MachineInstr &NewMI)
 
VNInfo::AllocatorgetVNInfoAllocator ()
 
void getAnalysisUsage (AnalysisUsage &AU) const override
 getAnalysisUsage - This function should be overriden by passes that need analysis information to do their job.
 
void releaseMemory () override
 releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memory when it is no longer needed.
 
bool runOnMachineFunction (MachineFunction &) override
 Pass entry point; Calculates LiveIntervals.
 
void print (raw_ostream &O, const Module *=nullptr) const override
 Implement the dump method.
 
MachineBasicBlockintervalIsInOneMBB (const LiveInterval &LI) const
 If LI is confined to a single basic block, return a pointer to that block.
 
bool hasPHIKill (const LiveInterval &LI, const VNInfo *VNI) const
 Returns true if VNI is killed by any PHI-def values in LI.
 
void addKillFlags (const VirtRegMap *)
 Add kill flags to any instruction that kills a virtual register.
 
void handleMove (MachineInstr &MI, bool UpdateFlags=false)
 Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
 
void handleMoveIntoNewBundle (MachineInstr &BundleStart, bool UpdateFlags=false)
 Update intervals of operands of all instructions in the newly created bundle specified by BundleStart.
 
void repairIntervalsInRange (MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
 Update live intervals for instructions in a range of iterators.
 
ArrayRef< SlotIndexgetRegMaskSlots () const
 Returns a sorted array of slot indices of all instructions with register mask operands.
 
ArrayRef< SlotIndexgetRegMaskSlotsInBlock (unsigned MBBNum) const
 Returns a sorted array of slot indices of all instructions with register mask operands in the basic block numbered MBBNum.
 
ArrayRef< const uint32_t * > getRegMaskBits () const
 Returns an array of register mask pointers corresponding to getRegMaskSlots().
 
ArrayRef< const uint32_t * > getRegMaskBitsInBlock (unsigned MBBNum) const
 Returns an array of mask pointers corresponding to getRegMaskSlotsInBlock(MBBNum).
 
bool checkRegMaskInterference (const LiveInterval &LI, BitVector &UsableRegs)
 Test if LI is live across any register mask instructions, and compute a bit mask of physical registers that are not clobbered by any of them.
 
LiveRangegetRegUnit (unsigned Unit)
 Return the live range for register unit Unit.
 
LiveRangegetCachedRegUnit (unsigned Unit)
 Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't been computed yet.
 
const LiveRangegetCachedRegUnit (unsigned Unit) const
 
void removeRegUnit (unsigned Unit)
 Remove computed live range for register unit Unit.
 
void removeAllRegUnitsForPhysReg (MCRegister Reg)
 Remove associated live ranges for the register units associated with Reg.
 
void removePhysRegDefAt (MCRegister Reg, SlotIndex Pos)
 Remove value numbers and related live segments starting at position Pos that are part of any liverange of physical register Reg or one of its subregisters.
 
void removeVRegDefAt (LiveInterval &LI, SlotIndex Pos)
 Remove value number and related live segments of LI and its subranges that start at position Pos.
 
void splitSeparateComponents (LiveInterval &LI, SmallVectorImpl< LiveInterval * > &SplitLIs)
 Split separate components in LiveInterval LI into separate intervals.
 
void constructMainRangeFromSubranges (LiveInterval &LI)
 For live interval LI with correct SubRanges construct matching information for the main live range.
 
- Public Member Functions inherited from llvm::MachineFunctionPass
bool doInitialization (Module &) override
 doInitialization - Virtual method overridden by subclasses to do any necessary initialization before any pass is run.
 
- Public Member Functions inherited from llvm::FunctionPass
 FunctionPass (char &pid)
 
PasscreatePrinterPass (raw_ostream &OS, const std::string &Banner) const override
 createPrinterPass - Get a function printer pass.
 
virtual bool runOnFunction (Function &F)=0
 runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
 
void assignPassManager (PMStack &PMS, PassManagerType T) override
 Find appropriate Function Pass Manager or Call Graph Pass Manager in the PM Stack and add self into that manager.
 
PassManagerType getPotentialPassManagerType () const override
 Return what kind of Pass Manager can manage this pass.
 
- Public Member Functions inherited from llvm::Pass
 Pass (PassKind K, char &pid)
 
 Pass (const Pass &)=delete
 
Passoperator= (const Pass &)=delete
 
virtual ~Pass ()
 
PassKind getPassKind () const
 
virtual StringRef getPassName () const
 getPassName - Return a nice clean name for a pass.
 
AnalysisID getPassID () const
 getPassID - Return the PassID number that corresponds to this pass.
 
virtual bool doInitialization (Module &)
 doInitialization - Virtual method overridden by subclasses to do any necessary initialization before any pass is run.
 
virtual bool doFinalization (Module &)
 doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes have run.
 
virtual void print (raw_ostream &OS, const Module *M) const
 print - Print out the internal state of the pass.
 
void dump () const
 
virtual PasscreatePrinterPass (raw_ostream &OS, const std::string &Banner) const =0
 createPrinterPass - Get a Pass appropriate to print the IR this pass operates on (Module, Function or MachineFunction).
 
virtual void assignPassManager (PMStack &, PassManagerType)
 Each pass is responsible for assigning a pass manager to itself.
 
virtual void preparePassManager (PMStack &)
 Check if available pass managers are suitable for this pass or not.
 
virtual PassManagerType getPotentialPassManagerType () const
 Return what kind of Pass Manager can manage this pass.
 
void setResolver (AnalysisResolver *AR)
 
AnalysisResolvergetResolver () const
 
virtual void getAnalysisUsage (AnalysisUsage &) const
 getAnalysisUsage - This function should be overriden by passes that need analysis information to do their job.
 
virtual void releaseMemory ()
 releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memory when it is no longer needed.
 
virtual void * getAdjustedAnalysisPointer (AnalysisID ID)
 getAdjustedAnalysisPointer - This method is used when a pass implements an analysis interface through multiple inheritance.
 
virtual ImmutablePassgetAsImmutablePass ()
 
virtual PMDataManagergetAsPMDataManager ()
 
virtual void verifyAnalysis () const
 verifyAnalysis() - This member can be implemented by a analysis pass to check state of analysis information.
 
virtual void dumpPassStructure (unsigned Offset=0)
 
template<typename AnalysisType >
AnalysisType * getAnalysisIfAvailable () const
 getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information that might be around, for example to update it.
 
bool mustPreserveAnalysisID (char &AID) const
 mustPreserveAnalysisID - This method serves the same function as getAnalysisIfAvailable, but works if you just have an AnalysisID.
 
template<typename AnalysisType >
AnalysisType & getAnalysis () const
 getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information that they claim to use by overriding the getAnalysisUsage function.
 
template<typename AnalysisType >
AnalysisType & getAnalysis (Function &F, bool *Changed=nullptr)
 getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information that they claim to use by overriding the getAnalysisUsage function.
 
template<typename AnalysisType >
AnalysisType & getAnalysisID (AnalysisID PI) const
 
template<typename AnalysisType >
AnalysisType & getAnalysisID (AnalysisID PI, Function &F, bool *Changed=nullptr)
 

Static Public Member Functions

static float getSpillWeight (bool isDef, bool isUse, const MachineBlockFrequencyInfo *MBFI, const MachineInstr &MI)
 Calculate the spill weight to assign to a single instruction.
 
static float getSpillWeight (bool isDef, bool isUse, const MachineBlockFrequencyInfo *MBFI, const MachineBasicBlock *MBB)
 Calculate the spill weight to assign to a single instruction.
 
- Static Public Member Functions inherited from llvm::Pass
static const PassInfolookupPassInfo (const void *TI)
 
static const PassInfolookupPassInfo (StringRef Arg)
 
static PasscreatePass (AnalysisID ID)
 

Static Public Attributes

static char ID = 0
 

Additional Inherited Members

- Protected Member Functions inherited from llvm::MachineFunctionPass
 MachineFunctionPass (char &ID)
 
virtual bool runOnMachineFunction (MachineFunction &MF)=0
 runOnMachineFunction - This method must be overloaded to perform the desired machine code transformation or analysis.
 
void getAnalysisUsage (AnalysisUsage &AU) const override
 getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
 
virtual MachineFunctionProperties getRequiredProperties () const
 
virtual MachineFunctionProperties getSetProperties () const
 
virtual MachineFunctionProperties getClearedProperties () const
 
- Protected Member Functions inherited from llvm::FunctionPass
bool skipFunction (const Function &F) const
 Optional passes call this function to check whether the pass should be skipped.
 

Detailed Description

Definition at line 53 of file LiveIntervals.h.

Constructor & Destructor Documentation

◆ LiveIntervals()

LiveIntervals::LiveIntervals ( )

◆ ~LiveIntervals()

LiveIntervals::~LiveIntervals ( )
override

Definition at line 101 of file LiveIntervals.cpp.

Member Function Documentation

◆ addKillFlags()

void LiveIntervals::addKillFlags ( const VirtRegMap VRM)

◆ addSegmentToEndOfBlock()

LiveRange::Segment LiveIntervals::addSegmentToEndOfBlock ( Register  Reg,
MachineInstr startInst 
)

Given a register and an instruction, adds a live segment from that instruction to the end of its MBB.

Definition at line 864 of file LiveIntervals.cpp.

References getInstructionIndex(), getMBBEndIdx(), getOrCreateEmptyInterval(), llvm::MachineInstr::getParent(), and getVNInfoAllocator().

◆ checkRegMaskInterference()

bool LiveIntervals::checkRegMaskInterference ( const LiveInterval LI,
BitVector UsableRegs 
)

◆ constructMainRangeFromSubranges()

void LiveIntervals::constructMainRangeFromSubranges ( LiveInterval LI)

For live interval LI with correct SubRanges construct matching information for the main live range.

Expects the main live range to not have any segments or value numbers.

Definition at line 1758 of file LiveIntervals.cpp.

References assert(), llvm::LiveIntervalCalc::constructMainRangeFromSubranges(), getSlotIndexes(), getVNInfoAllocator(), and llvm::LiveRangeCalc::reset().

Referenced by llvm::LiveIntervals::HMEditor::updateAllRanges().

◆ createAndComputeVirtRegInterval()

LiveInterval & llvm::LiveIntervals::createAndComputeVirtRegInterval ( Register  Reg)
inline

◆ createEmptyInterval()

LiveInterval & llvm::LiveIntervals::createEmptyInterval ( Register  Reg)
inline

◆ extendToIndices() [1/2]

void llvm::LiveIntervals::extendToIndices ( LiveRange LR,
ArrayRef< SlotIndex Indices 
)
inline

Definition at line 192 of file LiveIntervals.h.

References extendToIndices().

◆ extendToIndices() [2/2]

void LiveIntervals::extendToIndices ( LiveRange LR,
ArrayRef< SlotIndex Indices,
ArrayRef< SlotIndex Undefs 
)

Extend the live range LR to reach all points in Indices.

The points in the Indices array must be jointly dominated by the union of the existing defs in LR and points in Undefs.

PHI-defs are added as needed to maintain SSA form.

If a SlotIndex in Indices is the end index of a basic block, LR will be extended to be live out of the basic block. If a SlotIndex in Indices is jointy dominated only by points in Undefs, the live range will not be extended to that point.

See also LiveRangeCalc::extend().

Definition at line 615 of file LiveIntervals.cpp.

References assert(), llvm::LiveRangeCalc::extend(), getSlotIndexes(), getVNInfoAllocator(), Idx, and llvm::LiveRangeCalc::reset().

Referenced by extendToIndices(), and replaceDominatedUses().

◆ getAnalysisUsage()

void LiveIntervals::getAnalysisUsage ( AnalysisUsage ) const
overridevirtual

getAnalysisUsage - This function should be overriden by passes that need analysis information to do their job.

If a pass specifies that it uses a particular analysis result to this function, it can then use the getAnalysis<AnalysisType>() function, below.

Reimplemented from llvm::Pass.

Definition at line 86 of file LiveIntervals.cpp.

References llvm::AnalysisUsage::addPreserved(), llvm::AnalysisUsage::addPreservedID(), llvm::AnalysisUsage::addRequiredTransitive(), llvm::AnalysisUsage::addRequiredTransitiveID(), llvm::MachineFunctionPass::getAnalysisUsage(), llvm::MachineDominatorsID, llvm::MachineLoopInfoID, and llvm::AnalysisUsage::setPreservesCFG().

◆ getCachedRegUnit() [1/2]

LiveRange * llvm::LiveIntervals::getCachedRegUnit ( unsigned  Unit)
inline

Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't been computed yet.

Definition at line 407 of file LiveIntervals.h.

Referenced by getLanesWithProperty(), getLiveRange(), llvm::LiveIntervals::HMEditor::getRegUnitLI(), and removePhysRegDefAt().

◆ getCachedRegUnit() [2/2]

const LiveRange * llvm::LiveIntervals::getCachedRegUnit ( unsigned  Unit) const
inline

Definition at line 411 of file LiveIntervals.h.

◆ getInstructionFromIndex()

MachineInstr * llvm::LiveIntervals::getInstructionFromIndex ( SlotIndex  index) const
inline

◆ getInstructionIndex()

SlotIndex llvm::LiveIntervals::getInstructionIndex ( const MachineInstr Instr) const
inline

Returns the base index of the given instruction.

Definition at line 227 of file LiveIntervals.h.

References llvm::SlotIndexes::getInstructionIndex().

Referenced by addSegmentToEndOfBlock(), llvm::GCNDownwardRPTracker::advanceBeforeNext(), llvm::ScheduleDAGInstrs::buildSchedGraph(), llvm::RegPressureTracker::bumpDownwardPressure(), llvm::RegPressureTracker::bumpUpwardPressure(), llvm::LiveRangeEdit::canRematerializeAt(), llvm::X86InstrInfo::classifyLEAReg(), collectVirtualRegUses(), llvm::ScheduleDAGMILive::computeCyclicCriticalPath(), llvm::SIInstrInfo::convertToThreeAddress(), llvm::RegisterOperands::detectDeadDefs(), dumpMachineInstrRangeWithSlotIndex(), findNextInsertLocation(), llvm::SIRegisterInfo::findReachingDef(), findUseBetween(), llvm::RegPressureTracker::getCurrSlot(), llvm::InsertPointAnalysis::getFirstInsertPoint(), llvm::getLiveRegsAfter(), llvm::getLiveRegsBefore(), getVRegDef(), handleMoveIntoNewBundle(), hasOneNonDBGUse(), isDefBetween(), llvm::GCNUpwardRPTracker::isValid(), moveAndTeeForMultiUse(), moveForSingleUse(), oneUseDominatesOtherUses(), printRegion(), llvm::RegPressureTracker::recede(), llvm::RegPressureTracker::recedeSkipDebugValues(), regJustKilledBefore(), rematerializeCheapDef(), repairIntervalsInRange(), replaceDominatedUses(), llvm::GCNUpwardRPTracker::reset(), llvm::GCNSchedStage::revertScheduling(), llvm::ScheduleDAGMILive::scheduleMI(), llvm::GCNIterativeScheduler::scheduleRegion(), shrinkToUses(), llvm::ScheduleDAGMILive::updatePressureDiffs(), and llvm::VirtRegAuxInfo::weightCalcHelper().

◆ getInterval() [1/2]

LiveInterval & llvm::LiveIntervals::getInterval ( Register  Reg)
inline

Definition at line 112 of file LiveIntervals.h.

References createAndComputeVirtRegInterval(), hasInterval(), and Reg.

Referenced by addKillFlags(), llvm::GCNDownwardRPTracker::advanceBeforeNext(), llvm::RegAllocBase::allocatePhysRegs(), llvm::LiveRangeEdit::allUsesAvailableAt(), llvm::LiveRangeEdit::calculateRegClassAndHint(), llvm::VirtRegAuxInfo::calculateSpillWeightsAndHints(), llvm::X86InstrInfo::classifyLEAReg(), collectVirtualRegUses(), llvm::ScheduleDAGMILive::computeCyclicCriticalPath(), llvm::SIInstrInfo::convertToThreeAddress(), llvm::RISCVInstrInfo::convertToThreeAddress(), llvm::X86InstrInfo::convertToThreeAddress(), llvm::LiveRangeEdit::createFrom(), llvm::SIRegisterInfo::findReachingDef(), llvm::SplitEditor::finish(), getInterval(), getLanesWithProperty(), llvm::getLiveLaneMask(), getLiveRange(), llvm::getLiveRegMap(), getOrCreateEmptyInterval(), getVDefInterval(), getVRegDef(), handleMoveIntoNewBundle(), hasOneNonDBGUse(), isDefBetween(), isLocalCopy(), llvm::SplitAnalysis::isOriginalEndpoint(), llvm::VirtRegAuxInfo::isRematerializable(), llvm::SplitEditor::leaveIntvAtTop(), moveAndTeeForMultiUse(), moveForSingleUse(), oneUseDominatesOtherUses(), print(), regJustKilledBefore(), rematerializeCheapDef(), repairIntervalsInRange(), replaceDominatedUses(), llvm::HexagonRegisterInfo::shouldCoalesce(), llvm::SystemZRegisterInfo::shouldCoalesce(), llvm::MachineBasicBlock::SplitCriticalEdge(), llvm::LiveIntervals::HMEditor::updateAllRanges(), llvm::ScheduleDAGMILive::updatePressureDiffs(), and llvm::VirtRegAuxInfo::weightCalcHelper().

◆ getInterval() [2/2]

const LiveInterval & llvm::LiveIntervals::getInterval ( Register  Reg) const
inline

Definition at line 119 of file LiveIntervals.h.

References getInterval(), and Reg.

◆ getMBBEndIdx()

SlotIndex llvm::LiveIntervals::getMBBEndIdx ( const MachineBasicBlock mbb) const
inline

◆ getMBBFromIndex()

MachineBasicBlock * llvm::LiveIntervals::getMBBFromIndex ( SlotIndex  index) const
inline

◆ getMBBStartIdx()

SlotIndex llvm::LiveIntervals::getMBBStartIdx ( const MachineBasicBlock mbb) const
inline

◆ getOrCreateEmptyInterval()

LiveInterval & llvm::LiveIntervals::getOrCreateEmptyInterval ( Register  Reg)
inline

Return an existing interval for Reg.

If Reg has no interval then this creates a new empty one instead. Note: does not trigger interval computation.

Definition at line 145 of file LiveIntervals.h.

References createEmptyInterval(), getInterval(), hasInterval(), and Reg.

Referenced by addSegmentToEndOfBlock().

◆ getRegMaskBits()

ArrayRef< const uint32_t * > llvm::LiveIntervals::getRegMaskBits ( ) const
inline

Returns an array of register mask pointers corresponding to getRegMaskSlots().

Definition at line 363 of file LiveIntervals.h.

Referenced by checkRegMaskInterference(), and getRegMaskBitsInBlock().

◆ getRegMaskBitsInBlock()

ArrayRef< const uint32_t * > llvm::LiveIntervals::getRegMaskBitsInBlock ( unsigned  MBBNum) const
inline

Returns an array of mask pointers corresponding to getRegMaskSlotsInBlock(MBBNum).

Definition at line 367 of file LiveIntervals.h.

References getRegMaskBits(), and P.

Referenced by checkRegMaskInterference().

◆ getRegMaskSlots()

ArrayRef< SlotIndex > llvm::LiveIntervals::getRegMaskSlots ( ) const
inline

Returns a sorted array of slot indices of all instructions with register mask operands.

Definition at line 352 of file LiveIntervals.h.

Referenced by checkRegMaskInterference(), getRegMaskSlotsInBlock(), and llvm::VirtRegAuxInfo::weightCalcHelper().

◆ getRegMaskSlotsInBlock()

ArrayRef< SlotIndex > llvm::LiveIntervals::getRegMaskSlotsInBlock ( unsigned  MBBNum) const
inline

Returns a sorted array of slot indices of all instructions with register mask operands in the basic block numbered MBBNum.

Definition at line 356 of file LiveIntervals.h.

References getRegMaskSlots(), and P.

Referenced by checkRegMaskInterference().

◆ getRegUnit()

LiveRange & llvm::LiveIntervals::getRegUnit ( unsigned  Unit)
inline

◆ getSlotIndexes()

SlotIndexes * llvm::LiveIntervals::getSlotIndexes ( ) const
inline

◆ getSpillWeight() [1/2]

float LiveIntervals::getSpillWeight ( bool  isDef,
bool  isUse,
const MachineBlockFrequencyInfo MBFI,
const MachineBasicBlock MBB 
)
static

Calculate the spill weight to assign to a single instruction.

Definition at line 857 of file LiveIntervals.cpp.

References llvm::MachineBlockFrequencyInfo::getBlockFreqRelativeToEntryBlock(), and MBB.

◆ getSpillWeight() [2/2]

float LiveIntervals::getSpillWeight ( bool  isDef,
bool  isUse,
const MachineBlockFrequencyInfo MBFI,
const MachineInstr MI 
)
static

Calculate the spill weight to assign to a single instruction.

Definition at line 851 of file LiveIntervals.cpp.

References getSpillWeight(), and MI.

Referenced by computeWeight(), getSpillWeight(), and llvm::VirtRegAuxInfo::weightCalcHelper().

◆ getVNInfoAllocator()

VNInfo::Allocator & llvm::LiveIntervals::getVNInfoAllocator ( )
inline

◆ handleMove()

void LiveIntervals::handleMove ( MachineInstr MI,
bool  UpdateFlags = false 
)

Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.

This will update the live intervals for all operands of MI. Moves between basic blocks are not supported.

Parameters
UpdateFlagsUpdate live intervals for nonallocatable physregs.

Definition at line 1498 of file LiveIntervals.cpp.

References assert(), llvm::SlotIndexes::getInstructionIndex(), getMBBEndIdx(), getMBBStartIdx(), llvm::SlotIndexes::insertMachineInstrInMaps(), MI, MRI, llvm::SlotIndexes::removeMachineInstrFromMaps(), TRI, and llvm::LiveIntervals::HMEditor::updateAllRanges().

Referenced by moveAndTeeForMultiUse(), moveForSingleUse(), llvm::ScheduleDAGMI::moveInstruction(), llvm::GCNSchedStage::revertScheduling(), and llvm::GCNIterativeScheduler::scheduleRegion().

◆ handleMoveIntoNewBundle()

void LiveIntervals::handleMoveIntoNewBundle ( MachineInstr BundleStart,
bool  UpdateFlags = false 
)

◆ hasInterval()

bool llvm::LiveIntervals::hasInterval ( Register  Reg) const
inline

◆ hasPHIKill()

bool LiveIntervals::hasPHIKill ( const LiveInterval LI,
const VNInfo VNI 
) const

Returns true if VNI is killed by any PHI-def values in LI.

This may conservatively return true to avoid expensive computations.

Definition at line 836 of file LiveIntervals.cpp.

References llvm::SlotIndexes::getMBBEndIdx(), getMBBFromIndex(), llvm::LiveRange::getVNInfoBefore(), PHI, llvm::MachineBasicBlock::pred_size(), llvm::MachineBasicBlock::predecessors(), and llvm::LiveRange::valnos.

◆ InsertMachineInstrInMaps()

SlotIndex llvm::LiveIntervals::InsertMachineInstrInMaps ( MachineInstr MI)
inline

◆ InsertMachineInstrRangeInMaps()

void llvm::LiveIntervals::InsertMachineInstrRangeInMaps ( MachineBasicBlock::iterator  B,
MachineBasicBlock::iterator  E 
)
inline

Definition at line 271 of file LiveIntervals.h.

References B, E, I, and llvm::SlotIndexes::insertMachineInstrInMaps().

◆ insertMBBInMaps()

void llvm::LiveIntervals::insertMBBInMaps ( MachineBasicBlock MBB)
inline

◆ intervalIsInOneMBB()

MachineBasicBlock * LiveIntervals::intervalIsInOneMBB ( const LiveInterval LI) const

If LI is confined to a single basic block, return a pointer to that block.

If LI is live in to or out of any block, return NULL.

Definition at line 810 of file LiveIntervals.cpp.

References assert(), llvm::LiveRange::beginIndex(), llvm::LiveRange::empty(), llvm::LiveRange::endIndex(), llvm::SlotIndexes::getMBBFromIndex(), and llvm::SlotIndex::isBlock().

Referenced by checkRegMaskInterference(), and isLocalCopy().

◆ isLiveInToMBB()

bool llvm::LiveIntervals::isLiveInToMBB ( const LiveRange LR,
const MachineBasicBlock mbb 
) const
inline

Definition at line 246 of file LiveIntervals.h.

References getMBBStartIdx(), and llvm::LiveRange::liveAt().

◆ isLiveOutOfMBB()

bool llvm::LiveIntervals::isLiveOutOfMBB ( const LiveRange LR,
const MachineBasicBlock mbb 
) const
inline

Definition at line 251 of file LiveIntervals.h.

References getMBBEndIdx(), and llvm::LiveRange::liveAt().

Referenced by llvm::VirtRegAuxInfo::weightCalcHelper().

◆ isNotInMIMap()

bool llvm::LiveIntervals::isNotInMIMap ( const MachineInstr Instr) const
inline

Returns true if the specified machine instr has been removed or was never entered in the map.

Definition at line 222 of file LiveIntervals.h.

References llvm::SlotIndexes::hasIndex().

Referenced by findNextInsertLocation().

◆ print()

void LiveIntervals::print ( raw_ostream O,
const Module = nullptr 
) const
overridevirtual

Implement the dump method.

Reimplemented from llvm::Pass.

Definition at line 148 of file LiveIntervals.cpp.

References getInterval(), llvm::MachineRegisterInfo::getNumVirtRegs(), hasInterval(), Idx, llvm::Register::index2VirtReg(), OS, and llvm::printRegUnit().

◆ pruneValue() [1/2]

LLVM_ATTRIBUTE_UNUSED void llvm::LiveIntervals::pruneValue ( LiveInterval ,
SlotIndex  ,
SmallVectorImpl< SlotIndex > *   
)
inline

This function should not be used.

Its intent is to tell you that you are doing something wrong if you call pruneValue directly on a LiveInterval. Indeed, you are supposed to call pruneValue on the main LiveRange and all the LiveRanges of the subranges if any.

Definition at line 210 of file LiveIntervals.h.

References llvm_unreachable.

◆ pruneValue() [2/2]

void LiveIntervals::pruneValue ( LiveRange LR,
SlotIndex  Kill,
SmallVectorImpl< SlotIndex > *  EndPoints 
)

If LR has a live value at Kill, prune its live range by removing any liveness reachable from Kill.

Add live range end points to EndPoints such that extendToIndices(LI, EndPoints) will reconstruct the value's live range.

Calling pruneValue() and extendToIndices() can be used to reconstruct SSA form after adding defs to a virtual register.

Definition at line 624 of file LiveIntervals.cpp.

References llvm::df_ext_begin(), llvm::df_ext_end(), E, llvm::LiveQueryResult::endPoint(), llvm::SlotIndexes::getMBBEndIdx(), llvm::SlotIndexes::getMBBFromIndex(), llvm::SlotIndexes::getMBBRange(), I, MBB, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::LiveRange::Query(), llvm::LiveRange::removeSegment(), llvm::MachineBasicBlock::successors(), llvm::LiveQueryResult::valueIn(), and llvm::LiveQueryResult::valueOutOrDead().

◆ releaseMemory()

void LiveIntervals::releaseMemory ( )
overridevirtual

releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memory when it is no longer needed.

The default behavior of passes is to hold onto memory for the entire duration of their lifetime (which is the entire compile time). For pipelined passes, this is not a big deal because that memory gets recycled every time the pass is invoked on another program unit. For IP passes, it is more important to free memory when it is unused.

Optionally implement this function to release pass memory when it is no longer used.

Reimplemented from llvm::Pass.

Definition at line 103 of file LiveIntervals.cpp.

References llvm::SmallVectorImpl< T >::clear(), llvm::Register::index2VirtReg(), and llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold, GrowthDelay >::Reset().

◆ removeAllRegUnitsForPhysReg()

void llvm::LiveIntervals::removeAllRegUnitsForPhysReg ( MCRegister  Reg)
inline

Remove associated live ranges for the register units associated with Reg.

Subsequent uses should rely on on-demand recomputation.

Note
This method can result in inconsistent liveness tracking if multiple phyical registers share a regunit, and should be used cautiously.

Definition at line 426 of file LiveIntervals.h.

References Reg, removeRegUnit(), and TRI.

Referenced by insertCSRRestores(), llvm::SIRegisterInfo::restoreSGPR(), and llvm::SIRegisterInfo::spillSGPR().

◆ removeInterval()

void llvm::LiveIntervals::removeInterval ( Register  Reg)
inline

◆ RemoveMachineInstrFromMaps()

void llvm::LiveIntervals::RemoveMachineInstrFromMaps ( MachineInstr MI)
inline

◆ removePhysRegDefAt()

void LiveIntervals::removePhysRegDefAt ( MCRegister  Reg,
SlotIndex  Pos 
)

Remove value numbers and related live segments starting at position Pos that are part of any liverange of physical register Reg or one of its subregisters.

Definition at line 1716 of file LiveIntervals.cpp.

References getCachedRegUnit(), llvm::LiveRange::getVNInfoAt(), llvm::LiveRange::removeValNo(), and TRI.

Referenced by rematerializeCheapDef().

◆ removeRegUnit()

void llvm::LiveIntervals::removeRegUnit ( unsigned  Unit)
inline

Remove computed live range for register unit Unit.

Subsequent uses should rely on on-demand recomputation.

Definition at line 417 of file LiveIntervals.h.

Referenced by removeAllRegUnitsForPhysReg().

◆ removeVRegDefAt()

void LiveIntervals::removeVRegDefAt ( LiveInterval LI,
SlotIndex  Pos 
)

Remove value number and related live segments of LI and its subranges that start at position Pos.

Definition at line 1724 of file LiveIntervals.cpp.

References assert(), llvm::VNInfo::def, llvm::SlotIndex::getBaseIndex(), llvm::LiveRange::getVNInfoAt(), llvm::LiveInterval::removeEmptySubRanges(), llvm::LiveRange::removeValNo(), and llvm::LiveInterval::subranges().

◆ repairIntervalsInRange()

void LiveIntervals::repairIntervalsInRange ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  Begin,
MachineBasicBlock::iterator  End,
ArrayRef< Register OrigRegs 
)

Update live intervals for instructions in a range of iterators.

It is intended for use after target hooks that may insert or remove instructions, and is only efficient for a small number of instructions.

OrigRegs is a vector of registers that were originally used by the instructions in the range between the two iterators.

Currently, the only changes that are supported are simple removal and addition of uses.

Definition at line 1640 of file LiveIntervals.cpp.

References llvm::MachineBasicBlock::begin(), llvm::ArrayRef< T >::begin(), createAndComputeVirtRegInterval(), llvm::MachineBasicBlock::end(), llvm::ArrayRef< T >::end(), End, llvm::erase(), getInstructionIndex(), getInterval(), getMBBEndIdx(), llvm::SlotIndex::getPrevSlot(), llvm::LiveRange::hasAtLeastOneValue(), llvm::SlotIndexes::hasIndex(), hasInterval(), llvm::LiveInterval::hasSubRanges(), I, MBB, MI, MRI, llvm::none_of(), llvm::LiveInterval::removeEmptySubRanges(), removeInterval(), llvm::SlotIndexes::repairIndexesInRange(), llvm::LiveInterval::subranges(), SubReg, and TRI.

Referenced by llvm::MachineBasicBlock::SplitCriticalEdge().

◆ ReplaceMachineInstrInMaps()

SlotIndex llvm::LiveIntervals::ReplaceMachineInstrInMaps ( MachineInstr MI,
MachineInstr NewMI 
)
inline

◆ runOnMachineFunction()

bool LiveIntervals::runOnMachineFunction ( MachineFunction fn)
overridevirtual

◆ shrinkToUses() [1/2]

bool LiveIntervals::shrinkToUses ( LiveInterval li,
SmallVectorImpl< MachineInstr * > *  dead = nullptr 
)

After removing some uses of a register, shrink its live range to just the remaining uses.

This method does not compute reaching defs for new uses, and it doesn't remove dead defs. Dead PHIDef values are marked as unused. New dead machine instructions are added to the dead vector. Returns true if the interval may have been separated into multiple connected components.

Definition at line 444 of file LiveIntervals.cpp.

References assert(), createSegmentsForValues(), llvm::dbgs(), getInstructionIndex(), llvm::LaneBitmask::getNone(), llvm::SlotIndex::getRegSlot(), Idx, llvm::Register::isVirtual(), LLVM_DEBUG, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::LiveRange::Query(), llvm::LiveInterval::reg(), llvm::MachineRegisterInfo::reg_instructions(), llvm::LiveInterval::removeEmptySubRanges(), llvm::LiveRange::segments, shrinkToUses(), llvm::LiveInterval::subranges(), llvm::SmallVectorImpl< T >::swap(), UseMI, llvm::LiveQueryResult::valueDefined(), llvm::LiveQueryResult::valueIn(), and llvm::LiveRange::vnis().

Referenced by llvm::LiveRangeEdit::eliminateDeadDefs(), replaceDominatedUses(), shrinkToUses(), and shrinkToUses().

◆ shrinkToUses() [2/2]

void LiveIntervals::shrinkToUses ( LiveInterval::SubRange SR,
Register  Reg 
)

◆ splitSeparateComponents()

void LiveIntervals::splitSeparateComponents ( LiveInterval LI,
SmallVectorImpl< LiveInterval * > &  SplitLIs 
)

Member Data Documentation

◆ ID

char LiveIntervals::ID = 0
static

Definition at line 97 of file LiveIntervals.h.


The documentation for this class was generated from the following files: