LLVM API Documentation

Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes
llvm::LiveIntervals Class Reference

#include <LiveIntervalAnalysis.h>

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

List of all members.

Classes

class  HMEditor

Public Member Functions

 LiveIntervals ()
virtual ~LiveIntervals ()
LiveIntervalgetInterval (unsigned Reg)
const LiveIntervalgetInterval (unsigned Reg) const
bool hasInterval (unsigned Reg) const
LiveIntervalgetOrCreateInterval (unsigned Reg)
void removeInterval (unsigned Reg)
LiveRange addLiveRangeToEndOfBlock (unsigned reg, MachineInstr *startInst)
bool shrinkToUses (LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=0)
void extendToIndices (LiveInterval *LI, ArrayRef< SlotIndex > Indices)
void pruneValue (LiveInterval *LI, SlotIndex Kill, SmallVectorImpl< SlotIndex > *EndPoints)
SlotIndexesgetSlotIndexes () const
AliasAnalysisgetAliasAnalysis () const
bool isNotInMIMap (const MachineInstr *Instr) const
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 LiveInterval &li, const MachineBasicBlock *mbb) const
bool isLiveOutOfMBB (const LiveInterval &li, const MachineBasicBlock *mbb) const
MachineBasicBlockgetMBBFromIndex (SlotIndex index) const
void insertMBBInMaps (MachineBasicBlock *MBB)
SlotIndex InsertMachineInstrInMaps (MachineInstr *MI)
void RemoveMachineInstrFromMaps (MachineInstr *MI)
void ReplaceMachineInstrInMaps (MachineInstr *MI, MachineInstr *NewMI)
bool findLiveInMBBs (SlotIndex Start, SlotIndex End, SmallVectorImpl< MachineBasicBlock * > &MBBs) const
VNInfo::AllocatorgetVNInfoAllocator ()
virtual void getAnalysisUsage (AnalysisUsage &AU) const
virtual void releaseMemory ()
virtual bool runOnMachineFunction (MachineFunction &)
 runOnMachineFunction - pass entry point
virtual void print (raw_ostream &O, const Module *=0) const
 print - Implement the dump method.
MachineBasicBlockintervalIsInOneMBB (const LiveInterval &LI) const
bool hasPHIKill (const LiveInterval &LI, const VNInfo *VNI) const
void addKillFlags (const VirtRegMap *)
void handleMove (MachineInstr *MI, bool UpdateFlags=false)
void handleMoveIntoBundle (MachineInstr *MI, MachineInstr *BundleStart, bool UpdateFlags=false)
void repairIntervalsInRange (MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< unsigned > OrigRegs)
ArrayRef< SlotIndexgetRegMaskSlots () const
ArrayRef< SlotIndexgetRegMaskSlotsInBlock (unsigned MBBNum) const
ArrayRef< const uint32_t * > getRegMaskBits () const
ArrayRef< const uint32_t * > getRegMaskBitsInBlock (unsigned MBBNum) const
bool checkRegMaskInterference (LiveInterval &LI, BitVector &UsableRegs)
LiveIntervalgetRegUnit (unsigned Unit)
LiveIntervalgetCachedRegUnit (unsigned Unit)
const LiveIntervalgetCachedRegUnit (unsigned Unit) const

Static Public Member Functions

static float getSpillWeight (bool isDef, bool isUse, unsigned loopDepth)

Static Public Attributes

static char ID = 0

Detailed Description

Definition at line 48 of file LiveIntervalAnalysis.h.


Constructor & Destructor Documentation

LiveIntervals::LiveIntervals ( )
LiveIntervals::~LiveIntervals ( ) [virtual]

Definition at line 76 of file LiveIntervalAnalysis.cpp.


Member Function Documentation

void LiveIntervals::addKillFlags ( const VirtRegMap VRM)
LiveRange LiveIntervals::addLiveRangeToEndOfBlock ( unsigned  reg,
MachineInstr startInst 
)

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

Definition at line 625 of file LiveIntervalAnalysis.cpp.

References llvm::LiveInterval::addRange(), getInstructionIndex(), getMBBEndIdx(), llvm::LiveInterval::getNextValue(), getOrCreateInterval(), llvm::MachineInstr::getParent(), and getVNInfoAllocator().

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

checkRegMaskInterference - 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.

Returns false if LI doesn't cross any register mask instructions. In that case, the bit vector is not filled in.

Definition at line 644 of file LiveIntervalAnalysis.cpp.

References llvm::LiveInterval::advanceTo(), llvm::ArrayRef< T >::begin(), llvm::LiveInterval::begin(), llvm::tgtok::Bits, llvm::BitVector::clear(), llvm::BitVector::clearBitsNotInMask(), llvm::LiveInterval::empty(), llvm::sys::path::end(), llvm::ArrayRef< T >::end(), llvm::LiveInterval::end(), llvm::MachineBasicBlock::getNumber(), llvm::MCRegisterInfo::getNumRegs(), getRegMaskBits(), getRegMaskBitsInBlock(), getRegMaskSlots(), getRegMaskSlotsInBlock(), intervalIsInOneMBB(), llvm::BitVector::resize(), and llvm::LiveRange::start.

Referenced by llvm::PBQPBuilder::build(), and llvm::LiveRegMatrix::checkRegMaskInterference().

void LiveIntervals::extendToIndices ( LiveInterval LI,
ArrayRef< SlotIndex Indices 
)

extendToIndices - Extend the live range of LI to reach all points in Indices. The points in the Indices array must be jointly dominated by existing defs in LI. PHI-defs are added as needed to maintain SSA form.

If a SlotIndex in Indices is the end index of a basic block, LI will be extended to be live out of the basic block.

See also LiveRangeCalc::extend().

Definition at line 430 of file LiveIntervalAnalysis.cpp.

References llvm::LiveRangeCalc::extend(), getSlotIndexes(), getVNInfoAllocator(), llvm::LiveRangeCalc::reset(), and llvm::ArrayRef< T >::size().

bool llvm::LiveIntervals::findLiveInMBBs ( SlotIndex  Start,
SlotIndex  End,
SmallVectorImpl< MachineBasicBlock * > &  MBBs 
) const [inline]

Definition at line 235 of file LiveIntervalAnalysis.h.

References llvm::SlotIndexes::findLiveInMBBs().

AliasAnalysis* llvm::LiveIntervals::getAliasAnalysis ( ) const [inline]

Definition at line 172 of file LiveIntervalAnalysis.h.

Referenced by isRematerializable().

Live Interval false void LiveIntervals::getAnalysisUsage ( AnalysisUsage AU) const [virtual]

getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.

For MachineFunctionPasses, calling AU.preservesCFG() indicates that the pass does not modify the MachineBasicBlock CFG.

Reimplemented from llvm::MachineFunctionPass.

Definition at line 54 of file LiveIntervalAnalysis.cpp.

References llvm::MachineFunctionPass::getAnalysisUsage(), llvm::MachineDominatorsID, and llvm::MachineLoopInfoID.

LiveInterval* llvm::LiveIntervals::getCachedRegUnit ( unsigned  Unit) [inline]

getCachedRegUnit - Return the live range for Unit if it has already been computed, or NULL if it hasn't been computed yet.

Definition at line 366 of file LiveIntervalAnalysis.h.

Referenced by llvm::RegPressureTracker::getInterval().

const LiveInterval* llvm::LiveIntervals::getCachedRegUnit ( unsigned  Unit) const [inline]

Definition at line 370 of file LiveIntervalAnalysis.h.

MachineInstr* llvm::LiveIntervals::getInstructionFromIndex ( SlotIndex  index) const [inline]
SlotIndex llvm::LiveIntervals::getInstructionIndex ( const MachineInstr instr) const [inline]
LiveInterval& llvm::LiveIntervals::getInterval ( unsigned  Reg) [inline]
const LiveInterval& llvm::LiveIntervals::getInterval ( unsigned  Reg) const [inline]

Definition at line 110 of file LiveIntervalAnalysis.h.

References getInterval().

SlotIndex llvm::LiveIntervals::getMBBEndIdx ( const MachineBasicBlock mbb) const [inline]
MachineBasicBlock* llvm::LiveIntervals::getMBBFromIndex ( SlotIndex  index) const [inline]
SlotIndex llvm::LiveIntervals::getMBBStartIdx ( const MachineBasicBlock mbb) const [inline]

Return the first index in the given basic block.

Definition at line 193 of file LiveIntervalAnalysis.h.

References llvm::SlotIndexes::getMBBStartIdx().

Referenced by findInsertLocation(), handleMove(), isLiveInToMBB(), llvm::SplitEditor::leaveIntvAtTop(), shrinkToUses(), and llvm::SplitEditor::useIntv().

LiveInterval& llvm::LiveIntervals::getOrCreateInterval ( unsigned  Reg) [inline]
ArrayRef<const uint32_t*> llvm::LiveIntervals::getRegMaskBits ( ) const [inline]

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

Definition at line 323 of file LiveIntervalAnalysis.h.

Referenced by checkRegMaskInterference(), and getRegMaskBitsInBlock().

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

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

Definition at line 327 of file LiveIntervalAnalysis.h.

References getRegMaskBits(), and P.

Referenced by checkRegMaskInterference().

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

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

Definition at line 311 of file LiveIntervalAnalysis.h.

Referenced by checkRegMaskInterference(), and getRegMaskSlotsInBlock().

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

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

Definition at line 316 of file LiveIntervalAnalysis.h.

References getRegMaskSlots(), and P.

Referenced by checkRegMaskInterference().

LiveInterval& llvm::LiveIntervals::getRegUnit ( unsigned  Unit) [inline]

getRegUnit - Return the live range for Unit. It will be computed if it doesn't exist.

Definition at line 354 of file LiveIntervalAnalysis.h.

References HUGE_VALF, and LI.

Referenced by addKillFlags(), llvm::PBQPBuilder::build(), and llvm::LiveRegMatrix::checkRegUnitInterference().

SlotIndexes* llvm::LiveIntervals::getSlotIndexes ( ) const [inline]
float LiveIntervals::getSpillWeight ( bool  isDef,
bool  isUse,
unsigned  loopDepth 
) [static]
VNInfo::Allocator& llvm::LiveIntervals::getVNInfoAllocator ( ) [inline]
void LiveIntervals::handleMove ( MachineInstr MI,
bool  UpdateFlags = false 
)

handleMove - 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 1022 of file LiveIntervalAnalysis.cpp.

References llvm::SlotIndexes::getInstructionIndex(), getMBBEndIdx(), getMBBStartIdx(), llvm::MachineInstr::getParent(), llvm::SlotIndexes::insertMachineInstrInMaps(), llvm::MachineInstr::isBundled(), llvm::SlotIndexes::removeMachineInstrFromMaps(), and llvm::LiveIntervals::HMEditor::updateAllRanges().

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

moveIntoBundle - Update intervals for operands of MI so that they begin/end on the SlotIndex for BundleStart.

Parameters:
UpdateFlagsUpdate live intervals for nonallocatable physregs.

Requires MI and BundleStart to have SlotIndexes, and assumes existing liveness is accurate. BundleStart should be the first instruction in the Bundle.

Definition at line 1035 of file LiveIntervalAnalysis.cpp.

References llvm::SlotIndexes::getInstructionIndex(), and llvm::LiveIntervals::HMEditor::updateAllRanges().

bool llvm::LiveIntervals::hasInterval ( unsigned  Reg) const [inline]
bool LiveIntervals::hasPHIKill ( const LiveInterval LI,
const VNInfo VNI 
) const
SlotIndex llvm::LiveIntervals::InsertMachineInstrInMaps ( MachineInstr MI) [inline]
void llvm::LiveIntervals::insertMBBInMaps ( MachineBasicBlock MBB) [inline]
MachineBasicBlock * LiveIntervals::intervalIsInOneMBB ( const LiveInterval LI) const

intervalIsInOneMBB - 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 565 of file LiveIntervalAnalysis.cpp.

References llvm::LiveInterval::beginIndex(), llvm::LiveInterval::endIndex(), llvm::SlotIndexes::getMBBFromIndex(), and llvm::SlotIndex::isBlock().

Referenced by checkRegMaskInterference(), and isLocalCopy().

bool llvm::LiveIntervals::isLiveInToMBB ( const LiveInterval li,
const MachineBasicBlock mbb 
) const [inline]

Definition at line 202 of file LiveIntervalAnalysis.h.

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

bool llvm::LiveIntervals::isLiveOutOfMBB ( const LiveInterval li,
const MachineBasicBlock mbb 
) const [inline]
bool llvm::LiveIntervals::isNotInMIMap ( const MachineInstr Instr) const [inline]

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

Definition at line 178 of file LiveIntervalAnalysis.h.

References llvm::SlotIndexes::hasIndex().

Referenced by isPlainlyKilled().

void LiveIntervals::print ( raw_ostream O,
const Module = 0 
) const [virtual]
void LiveIntervals::pruneValue ( LiveInterval LI,
SlotIndex  Kill,
SmallVectorImpl< SlotIndex > *  EndPoints 
)

pruneValue - If an LI value is live 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 438 of file LiveIntervalAnalysis.cpp.

References llvm::df_ext_begin(), llvm::df_ext_end(), llvm::LiveRangeQuery::endPoint(), llvm::SlotIndexes::getMBBFromIndex(), llvm::SlotIndexes::getMBBRange(), I, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::LiveInterval::removeRange(), llvm::MachineBasicBlock::succ_begin(), llvm::MachineBasicBlock::succ_end(), llvm::tie(), llvm::LiveRangeQuery::valueIn(), and llvm::LiveRangeQuery::valueOut().

void LiveIntervals::releaseMemory ( ) [virtual]

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 80 of file LiveIntervalAnalysis.cpp.

References llvm::IndexedMap< T, ToIndexT >::clear(), llvm::SmallVectorImpl< T >::clear(), llvm::TargetRegisterInfo::index2VirtReg(), llvm::BumpPtrAllocator::Reset(), llvm::IndexedMap< T, ToIndexT >::size(), and llvm::SmallVectorTemplateCommon< T, typename >::size().

void llvm::LiveIntervals::removeInterval ( unsigned  Reg) [inline]
void llvm::LiveIntervals::RemoveMachineInstrFromMaps ( MachineInstr MI) [inline]
void LiveIntervals::repairIntervalsInRange ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  Begin,
MachineBasicBlock::iterator  End,
ArrayRef< unsigned OrigRegs 
)

repairIntervalsInRange - 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 only changes that are supported are simple removal and addition of uses.

Definition at line 1045 of file LiveIntervalAnalysis.cpp.

References llvm::LiveInterval::addRange(), llvm::LiveInterval::begin(), llvm::MachineBasicBlock::begin(), llvm::VNInfo::def, llvm::LiveRange::end, llvm::LiveInterval::end(), llvm::MachineBasicBlock::end(), llvm::LiveInterval::find(), llvm::SlotIndex::getDeadSlot(), getInstructionFromIndex(), getInstructionIndex(), getInterval(), getMBBEndIdx(), llvm::LiveInterval::getNextValue(), getOrCreateInterval(), llvm::SlotIndex::getPrevSlot(), llvm::MachineOperand::getReg(), llvm::SlotIndex::getRegSlot(), llvm::MachineOperand::getSubReg(), llvm::LiveInterval::hasAtLeastOneValue(), llvm::SlotIndexes::hasIndex(), hasInterval(), I, llvm::SlotIndex::isBlock(), llvm::SlotIndex::isDead(), llvm::MachineInstr::isDebugValue(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isReg(), llvm::MachineOperand::isUndef(), llvm::MachineOperand::isUse(), llvm::SlotIndex::isValid(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::MachineInstr::operands_begin(), llvm::MachineInstr::operands_end(), llvm::prior(), llvm::LiveInterval::removeRange(), llvm::SlotIndexes::repairIndexesInRange(), llvm::ArrayRef< T >::size(), llvm::LiveRange::start, and llvm::LiveRange::valno.

void llvm::LiveIntervals::ReplaceMachineInstrInMaps ( MachineInstr MI,
MachineInstr NewMI 
) [inline]
bool LiveIntervals::runOnMachineFunction ( MachineFunction fn) [virtual]
bool LiveIntervals::shrinkToUses ( LiveInterval li,
SmallVectorImpl< MachineInstr * > *  dead = 0 
)

shrinkToUses - 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. Return true if the interval may have been separated into multiple connected components.

shrinkToUses - 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.

Definition at line 302 of file LiveIntervalAnalysis.cpp.

References llvm::LiveInterval::addRange(), llvm::MachineInstr::addRegisterDead(), llvm::MachineInstr::allDefsAreDead(), llvm::SmallVectorTemplateCommon< T >::back(), llvm::dbgs(), DEBUG, llvm::VNInfo::def, llvm::SmallVectorBase::empty(), llvm::LiveRange::end, llvm::LiveInterval::end(), llvm::LiveInterval::extendInBlock(), llvm::LiveInterval::FindLiveRangeContaining(), llvm::SlotIndex::getDeadSlot(), getInstructionFromIndex(), getInstructionIndex(), getMBBEndIdx(), getMBBFromIndex(), getMBBStartIdx(), llvm::SlotIndex::getPrevSlot(), llvm::SlotIndex::getRegSlot(), llvm::LiveInterval::getVNInfoBefore(), I, llvm::SmallPtrSet< PtrType, SmallSize >::insert(), llvm::MachineInstr::isDebugValue(), llvm::VNInfo::isPHIDef(), llvm::VNInfo::isUnused(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::VNInfo::markUnused(), llvm::A64CC::MI, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::pop_back(), llvm::MachineBasicBlock::pred_begin(), llvm::MachineBasicBlock::pred_end(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::LiveInterval::ranges, llvm::MachineInstr::readsVirtualRegister(), llvm::LiveInterval::reg, llvm::MachineRegisterInfo::reg_begin(), llvm::LiveInterval::removeRange(), llvm::LiveRangeQuery::valueDefined(), llvm::LiveRangeQuery::valueIn(), llvm::LiveInterval::vni_begin(), and llvm::LiveInterval::vni_end().

Referenced by llvm::LiveRangeEdit::eliminateDeadDefs().


Member Data Documentation

char LiveIntervals::ID = 0 [static]

Definition at line 97 of file LiveIntervalAnalysis.h.


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