LLVM: llvm::LiveRange Class Reference (original) (raw)

This class represents the liveness of a register, stack slot, etc. More...

#include "[llvm/CodeGen/LiveInterval.h](LiveInterval%5F8h%5Fsource.html)"

Classes
struct Segment
This represents a simple continuous liveness interval for a value. More...
Public Types
using Segments = SmallVector<Segment, 2>
using VNInfoList = SmallVector<VNInfo *, 2>
using SegmentSet = std::set<Segment>
using iterator = Segments::iterator
using const_iterator = Segments::const_iterator
using vni_iterator = VNInfoList::iterator
using const_vni_iterator = VNInfoList::const_iterator
Public Member Functions
iterator begin ()
iterator end ()
const_iterator begin () const
const_iterator end () const
vni_iterator vni_begin ()
vni_iterator vni_end ()
const_vni_iterator vni_begin () const
const_vni_iterator vni_end () const
iterator_range< vni_iterator > vnis ()
iterator_range< const_vni_iterator > vnis () const
LiveRange (bool UseSegmentSet=false)
Constructs a new LiveRange object.
LiveRange (const LiveRange &Other, BumpPtrAllocator &Allocator)
Constructs a new LiveRange object by copying segments and valnos from another LiveRange.
void assign (const LiveRange &Other, BumpPtrAllocator &Allocator)
Copies values numbers and live segments from Other into this range.
iterator advanceTo (iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position, or end() if the position is past the end of the range.
const_iterator advanceTo (const_iterator I, SlotIndex Pos) const
LLVM_ABI iterator find (SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
const_iterator find (SlotIndex Pos) const
void clear ()
size_t size () const
bool hasAtLeastOneValue () const
bool containsOneValue () const
unsigned getNumValNums () const
VNInfo * getValNumInfo (unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
const VNInfo * getValNumInfo (unsigned ValNo) const
bool containsValue (const VNInfo *VNI) const
containsValue - Returns true if VNI belongs to this range.
VNInfo * getNextValue (SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
LLVM_ABI VNInfo * createDeadDef (SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
LLVM_ABI VNInfo * createDeadDef (VNInfo *VNI)
Create a def of value VNI.
VNInfo * createValueCopy (const VNInfo *orig, VNInfo::Allocator &VNInfoAllocator)
Create a copy of the given value.
LLVM_ABI void RenumberValues ()
RenumberValues - Renumber all values in order of appearance and remove unused values.
LLVM_ABI VNInfo * MergeValueNumberInto (VNInfo *V1, VNInfo *V2)
MergeValueNumberInto - This method is called when two value numbers are found to be equivalent.
LLVM_ABI void MergeSegmentsInAsValue (const LiveRange &RHS, VNInfo *LHSValNo)
Merge all of the live segments of a specific val# in RHS into this live range as the specified value number.
LLVM_ABI void MergeValueInAsValue (const LiveRange &RHS, const VNInfo *RHSValNo, VNInfo *LHSValNo)
MergeValueInAsValue - Merge all of the segments of a specific val# in RHS into this live range as the specified value number.
bool empty () const
SlotIndex beginIndex () const
beginIndex - Return the lowest numbered slot covered.
SlotIndex endIndex () const
endNumber - return the maximum point of the range of the whole, exclusive.
bool expiredAt (SlotIndex index) const
bool liveAt (SlotIndex index) const
const Segment * getSegmentContaining (SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
Segment * getSegmentContaining (SlotIndex Idx)
Return the live segment that contains the specified index, or null if there is none.
VNInfo * getVNInfoAt (SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
VNInfo * getVNInfoBefore (SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx, or NULL.
iterator FindSegmentContaining (SlotIndex Idx)
Return an iterator to the segment that contains the specified index, or end() if there is none.
const_iterator FindSegmentContaining (SlotIndex Idx) const
bool overlaps (const LiveRange &other) const
overlaps - Return true if the intersection of the two live ranges is not empty.
LLVM_ABI bool overlaps (const LiveRange &Other, const CoalescerPair &CP, const SlotIndexes &) const
overlaps - Return true if the two ranges have overlapping segments that are not coalescable according to CP.
LLVM_ABI bool overlaps (SlotIndex Start, SlotIndex End) const
overlaps - Return true if the live range overlaps an interval specified by [Start, End).
LLVM_ABI bool overlapsFrom (const LiveRange &Other, const_iterator StartPos) const
overlapsFrom - Return true if the intersection of the two live ranges is not empty.
LLVM_ABI bool covers (const LiveRange &Other) const
Returns true if all segments of the Other live range are completely covered by this live range.
LLVM_ABI iterator addSegment (Segment S)
Add the specified Segment to this range, merging segments as appropriate.
LLVM_ABI std::pair< VNInfo *, bool > extendInBlock (ArrayRef< SlotIndex > Undefs, SlotIndex StartIdx, SlotIndex Kill)
Attempt to extend a value defined after StartIdx to include Use.
LLVM_ABI VNInfo * extendInBlock (SlotIndex StartIdx, SlotIndex Kill)
Simplified version of the above "extendInBlock", which assumes that no register lanes are undefined by <def,read-undef> operands.
LLVM_ABI void join (LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
join - Join two live ranges (this, and other) together.
bool isLocal (SlotIndex Start, SlotIndex End) const
True iff this segment is a single segment that lies between the specified boundaries, exclusively.
LLVM_ABI void removeSegment (SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
void removeSegment (Segment S, bool RemoveDeadValNo=false)
LLVM_ABI iterator removeSegment (iterator I, bool RemoveDeadValNo=false)
Remove segment pointed to by iterator I from this range.
LLVM_ABI void removeValNoIfDead (VNInfo *ValNo)
Mark ValNo for deletion if no segments in this range use it.
LiveQueryResult Query (SlotIndex Idx) const
Query Liveness at Idx.
LLVM_ABI void removeValNo (VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
bool isZeroLength (SlotIndexes *Indexes) const
Returns true if the live range is zero length, i.e.
LLVM_ABI bool isLiveAtIndexes (ArrayRef< SlotIndex > Slots) const
bool operator< (const LiveRange &other) const
bool isUndefIn (ArrayRef< SlotIndex > Undefs, SlotIndex Begin, SlotIndex End) const
Returns true if there is an explicit "undef" between Begin End.
LLVM_ABI void flushSegmentSet ()
Flush segment set into the regular segment vector.
template<typename Range, typename OutputIt>
bool findIndexesLiveAt (Range &&R, OutputIt O) const
Stores indexes from the input index sequence R at which this LiveRange is live to the output O iterator.
LLVM_ABI void print (raw_ostream &OS) const
LLVM_ABI void dump () const
bool verify () const
Walk the range and assert if any invariants fail to hold.
Public Attributes
Segments segments
VNInfoList valnos
std::unique_ptr< SegmentSet > segmentSet
Friends
class LiveRangeUpdater

This class represents the liveness of a register, stack slot, etc.

It manages an ordered list of Segment objects. The Segments are organized in a static single assignment form: At places where a new value is defined or different values reach a CFG join a new segment with a new value number is used.

Definition at line 166 of file LiveInterval.h.

const_iterator

const_vni_iterator

iterator

Segments

SegmentSet

vni_iterator

VNInfoList

llvm::LiveRange::LiveRange ( bool UseSegmentSet = false) inline

Constructs a new LiveRange object.

Definition at line 248 of file LiveInterval.h.

References segmentSet.

Referenced by assign(), covers(), llvm::LiveInterval::createSubRangeFrom(), find(), join(), LiveRange(), MergeSegmentsInAsValue(), MergeValueInAsValue(), operator<(), overlaps(), overlaps(), overlapsFrom(), llvm::LiveInterval::SubRange::print(), and llvm::LiveInterval::SubRange::SubRange().

LiveRange() [2/2]

addSegment()

advanceTo() [1/2]

advanceTo() [2/2]

append()

assign()

Copies values numbers and live segments from Other into this range.

Definition at line 261 of file LiveInterval.h.

References Allocator, assert(), createValueCopy(), llvm::LiveRange::Segment::end, llvm::VNInfo::id, LiveRange(), llvm::Other, segments, llvm::LiveRange::Segment::start, llvm::LiveRange::Segment::valno, and valnos.

Referenced by LiveRange().

begin() [1/2]

iterator llvm::LiveRange::begin ( ) inline

Definition at line 224 of file LiveInterval.h.

References segments.

Referenced by llvm::LiveIntervals::addKillFlags(), llvm::LiveIntervals::checkRegMaskInterference(), llvm::SplitAnalysis::countLiveBlocks(), covers(), llvm::SplitAnalysis::isOriginalEndpoint(), join(), MergeValueNumberInto(), overlaps(), overlaps(), overlapsFrom(), and verify().

begin() [2/2]

const_iterator llvm::LiveRange::begin ( ) const inline

beginIndex()

SlotIndex llvm::LiveRange::beginIndex ( ) const inline

clear()

void llvm::LiveRange::clear ( ) inline

containsOneValue()

bool llvm::LiveRange::containsOneValue ( ) const inline

containsValue()

covers()

Returns true if all segments of the Other live range are completely covered by this live range.

Adjacent live ranges do not affect the covering:the liverange [1,5](5,10] covers (3,7].

Definition at line 479 of file LiveInterval.cpp.

References advanceTo(), begin(), empty(), end(), I, llvm::Last, LiveRange(), and llvm::Other.

Referenced by llvm::LiveIntervals::HMEditor::updateAllRanges(), and llvm::LiveInterval::verify().

createDeadDef() [1/2]

createDeadDef() [2/2]

createValueCopy()

Create a copy of the given value.

The new value will be identical except for the Value number.

Definition at line 358 of file LiveInterval.h.

References valnos.

Referenced by assign().

dump()

empty()

bool llvm::LiveRange::empty ( ) const inline

Definition at line 392 of file LiveInterval.h.

References segments.

Referenced by llvm::LiveIntervals::addKillFlags(), llvm::RegAllocBase::allocatePhysRegs(), beginIndex(), llvm::LiveIntervalCalc::calculate(), llvm::LiveRegMatrix::checkInterference(), llvm::LiveIntervals::checkRegMaskInterference(), llvm::LiveRegMatrix::checkRegUnitInterference(), llvm::SplitAnalysis::countLiveBlocks(), covers(), endIndex(), llvm::LiveIntervals::intervalIsInOneMBB(), llvm::SplitAnalysis::isOriginalEndpoint(), join(), overlaps(), overlaps(), overlapsFrom(), print(), and removeValNo().

end() [1/2]

iterator llvm::LiveRange::end ( ) inline

Definition at line 225 of file LiveInterval.h.

References segments.

Referenced by llvm::LiveRangeUpdater::add(), llvm::LiveIntervals::addKillFlags(), addSegment(), advanceTo(), advanceTo(), llvm::LiveIntervals::checkRegMaskInterference(), llvm::SplitAnalysis::countLiveBlocks(), covers(), FindSegmentContaining(), FindSegmentContaining(), getSegmentContaining(), getSegmentContaining(), getVNInfoAt(), getVNInfoBefore(), isLiveAtIndexes(), llvm::SplitAnalysis::isOriginalEndpoint(), join(), liveAt(), MergeValueNumberInto(), overlaps(), overlaps(), overlapsFrom(), Query(), removeSegment(), llvm::LiveDebugVariables::LDVImpl::splitPHIRegister(), and verify().

end() [2/2]

const_iterator llvm::LiveRange::end ( ) const inline

endIndex()

SlotIndex llvm::LiveRange::endIndex ( ) const inline

expiredAt()

extendInBlock() [1/2]

Attempt to extend a value defined after StartIdx to include [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users.").

Both StartIdx and [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users.") should be in the same basic block. In case of subranges, an extension could be prevented by an explicit "undef" caused by a <def,read-undef> on a non-overlapping lane. The list of location of such "undefs" should be provided in Undefs. The return value is a pair: the first element is VNInfo of the value that was extended (possibly nullptr), the second is a boolean value indicating whether an "undef" was encountered. If this range is live before [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users.") in the basic block that starts at StartIdx, and there is no intervening "undef", extend it to be live up to [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users."), and return the pair {value, false}. If there is no segment before [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users.") and there is no "undef" between StartIdx and [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users."), return {nullptr, false}. If there is an "undef" before [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users."), return {nullptr, true}.

Definition at line 549 of file LiveInterval.cpp.

References segmentSet.

Referenced by llvm::LiveRangeCalc::extend().

extendInBlock() [2/2]

Simplified version of the above "extendInBlock", which assumes that no register lanes are undefined by <def,read-undef> operands.

If this range is live before [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users.") in the basic block that starts at StartIdx, extend it to be live up to [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users."), and return the value. If there is no segment before [Use](classllvm%5F1%5F1Use.html "A Use represents the edge between a Value definition and its users."), return nullptr.

Definition at line 558 of file LiveInterval.cpp.

References segmentSet.

find() [1/2]

find - Return an iterator pointing to the first segment that ends after Pos, or end().

This is the same as advanceTo(begin(), Pos), but faster when searching large ranges.

If Pos is contained in a Segment, that segment is returned. If Pos is in a hole, the following Segment is returned. If Pos is beyond endIndex, end() is returned.

Definition at line 350 of file LiveInterval.cpp.

References find(), llvm::partition_point(), and X.

Referenced by llvm::LiveIntervals::addKillFlags(), find(), find(), FindSegmentContaining(), FindSegmentContaining(), isLiveAtIndexes(), llvm::SplitAnalysis::isOriginalEndpoint(), liveAt(), overlaps(), Query(), removeSegment(), and llvm::LiveDebugVariables::LDVImpl::splitPHIRegister().

find() [2/2]

const_iterator llvm::LiveRange::find ( SlotIndex Pos) const inline

findIndexesLiveAt()

template<typename Range, typename OutputIt>

bool llvm::LiveRange::findIndexesLiveAt ( Range && R, OutputIt O ) const inline

Stores indexes from the input index sequence R at which this LiveRange is live to the output O iterator.

R is a range of ascending sorted random access iterators to the input indexes. Indexes stored at O are ascending sorted so it can be used directly in the subsequent search (for example for subranges). Returns true if found at least one index.

Definition at line 639 of file LiveInterval.h.

References assert(), llvm::is_sorted(), Range, and segments.

FindSegmentContaining() [1/2]

iterator llvm::LiveRange::FindSegmentContaining ( SlotIndex Idx) inline

FindSegmentContaining() [2/2]

const_iterator llvm::LiveRange::FindSegmentContaining ( SlotIndex Idx) const inline

flushSegmentSet()

void LiveRange::flushSegmentSet ( )

Flush segment set into the regular segment vector.

The method is to be called after the live range has been created, if use of the segment set was activated in the constructor of the live range.

Definition at line 793 of file LiveInterval.cpp.

References assert(), segments, segmentSet, and verify().

getNextValue()

getNextValue - Create a new value number and return it.

Def is the index of instruction that defines the value number.

Definition at line 340 of file LiveInterval.h.

References valnos.

getNumValNums()

unsigned llvm::LiveRange::getNumValNums ( ) const inline

getSegmentContaining() [1/2]

getSegmentContaining() [2/2]

getValNumInfo() [1/2]

getValNumInfo() [2/2]

getVNInfoAt()

getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.

Definition at line 431 of file LiveInterval.h.

References end(), FindSegmentContaining(), and I.

Referenced by llvm::VirtRegAuxInfo::allUsesAvailableAt(), llvm::ConnectedVNInfoEqClasses::Distribute(), llvm::SIRegisterInfo::findReachingDef(), hasSingleUse(), llvm::VirtRegAuxInfo::isRematerializable(), moveAndTeeForMultiUse(), llvm::LiveIntervals::removePhysRegDefAt(), llvm::LiveIntervals::removeVRegDefAt(), replaceDominatedUses(), and llvm::MachineBasicBlock::SplitCriticalEdge().

getVNInfoBefore()

hasAtLeastOneValue()

bool llvm::LiveRange::hasAtLeastOneValue ( ) const inline

isLiveAtIndexes()

isLocal()

True iff this segment is a single segment that lies between the specified boundaries, exclusively.

Vregs live across a backedge are not considered local. The boundaries are expected to lie within an extended basic block, so vregs that are not live out should contain no holes.

Definition at line 529 of file LiveInterval.h.

References beginIndex(), endIndex(), and llvm::SlotIndex::getBoundaryIndex().

isUndefIn()

isZeroLength()

join()

join - Join two live ranges (this, and other) together.

This applies mappings to the value numbers in the LHS/RHS ranges as specified. If the ranges are not joinable, this aborts.

Definition at line 629 of file LiveInterval.cpp.

References llvm::LiveRangeUpdater::add(), assert(), begin(), empty(), end(), getNumValNums(), getValNumInfo(), I, llvm::VNInfo::id, LiveRange(), LiveRangeUpdater, llvm::Other, segments, llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::LiveRange::Segment::valno, valnos, and verify().

liveAt()

Definition at line 411 of file LiveInterval.h.

References end(), and find().

Referenced by llvm::GCNDownwardRPTracker::advanceBeforeNext(), llvm::SystemZInstrInfo::foldMemoryOperandImpl(), llvm::getLiveLaneMask(), getLiveLanesAt(), llvm::RegPressureTracker::getLiveLanesAt(), llvm::LiveIntervals::isLiveInToMBB(), llvm::LiveIntervals::isLiveOutOfMBB(), rematerializeCheapDef(), replaceDominatedUses(), llvm::MachineBasicBlock::SplitCriticalEdge(), and subRangeLiveAt().

MergeSegmentsInAsValue()

Merge all of the live segments of a specific val# in RHS into this live range as the specified value number.

Merge all of the segments in RHS into this live range as the specified value number.

The segments in RHS are allowed to overlap with segments in the current range, it will replace the value numbers of the overlaped live segments with the specified value number.

The segments in RHS are allowed to overlap with segments in the current range, but only if the overlapping segments have the specified value number.

Definition at line 713 of file LiveInterval.cpp.

References llvm::LiveRangeUpdater::add(), llvm::LiveRange::Segment::end, LiveRange(), LiveRangeUpdater, and llvm::LiveRange::Segment::start.

MergeValueInAsValue()

MergeValueNumberInto()

MergeValueNumberInto - This method is called when two value numbers are found to be equivalent.

MergeValueNumberInto - This method is called when two value nubmers are found to be equivalent.

This eliminates V1, replacing all segments with the V1 value number with the V2 value number. This can cause merging of V1/V2 values numbers and compaction of the value space.

Definition at line 738 of file LiveInterval.cpp.

References assert(), begin(), llvm::VNInfo::copyFrom(), end(), I, llvm::VNInfo::id, segments, and std::swap().

operator<()

overlaps() [1/3]

overlaps() [2/3]

overlaps() [3/3]

overlapsFrom()

print()

Query()

Query Liveness at Idx.

The sub-instruction slot of Idx doesn't matter, only the instruction it refers to is considered.

Definition at line 553 of file LiveInterval.h.

References llvm::VNInfo::def, E(), end(), find(), llvm::SlotIndex::getBaseIndex(), I, llvm::SlotIndex::isEarlierInstr(), and llvm::SlotIndex::isSameInstr().

Referenced by llvm::ScheduleDAGMILive::computeCyclicCriticalPath(), llvm::RegisterOperands::detectDeadDefs(), llvm::ConnectedVNInfoEqClasses::Distribute(), llvm::LiveIntervals::handleMoveIntoNewBundle(), hasSingleUse(), isDefBetween(), isDefInSubRange(), llvm::VirtRegAuxInfo::isRematerializable(), llvm::LiveIntervals::pruneValue(), llvm::LiveIntervals::shrinkToUses(), llvm::LiveIntervals::shrinkToUses(), and llvm::ScheduleDAGMILive::updatePressureDiffs().

removeSegment() [1/3]

LiveRange::iterator LiveRange::removeSegment ( iterator I,
bool RemoveDeadValNo = false )

removeSegment() [2/3]

void llvm::LiveRange::removeSegment ( Segment S, bool RemoveDeadValNo = false ) inline

removeSegment() [3/3]

Remove the specified interval from this live range.

Does nothing if interval is not part of this live range. Note that the interval must be within a single Segment in its entirety.

Definition at line 566 of file LiveInterval.cpp.

References assert(), end(), find(), I, removeValNoIfDead(), and segments.

Referenced by moveForSingleUse(), llvm::LiveIntervals::pruneValue(), removeDeadSegment(), removeSegment(), llvm::LiveIntervals::shrinkToUses(), and llvm::MachineBasicBlock::SplitCriticalEdge().

removeValNo()

void LiveRange::removeValNo ( VNInfo * ValNo )

removeValNoIfDead()

void LiveRange::removeValNoIfDead ( VNInfo * ValNo )

RenumberValues()

void LiveRange::RenumberValues ( )

size()

size_t llvm::LiveRange::size ( ) const inline

verify()

bool LiveRange::verify ( ) const nodiscard

vni_begin() [1/2]

vni_iterator llvm::LiveRange::vni_begin ( ) inline

vni_begin() [2/2]

const_vni_iterator llvm::LiveRange::vni_begin ( ) const inline

vni_end() [1/2]

vni_iterator llvm::LiveRange::vni_end ( ) inline

vni_end() [2/2]

const_vni_iterator llvm::LiveRange::vni_end ( ) const inline

vnis() [1/2]

vnis() [2/2]

LiveRangeUpdater

segments

Segments llvm::LiveRange::segments

Definition at line 212 of file LiveInterval.h.

Referenced by append(), assign(), begin(), begin(), beginIndex(), clear(), llvm::LiveIntervalCalc::constructMainRangeFromSubranges(), empty(), end(), end(), endIndex(), findIndexesLiveAt(), flushSegmentSet(), llvm::LiveInterval::getSize(), isZeroLength(), join(), MergeValueNumberInto(), print(), removeSegment(), removeSegment(), removeValNo(), RenumberValues(), llvm::LiveIntervals::shrinkToUses(), llvm::LiveIntervals::shrinkToUses(), and size().

segmentSet

std::unique_ptr<SegmentSet> llvm::LiveRange::segmentSet

valnos

VNInfoList llvm::LiveRange::valnos

Definition at line 213 of file LiveInterval.h.

Referenced by assign(), llvm::ConnectedVNInfoEqClasses::Classify(), clear(), llvm::LiveIntervalCalc::constructMainRangeFromSubranges(), containsOneValue(), createValueCopy(), getNextValue(), getNumValNums(), getValNumInfo(), getValNumInfo(), hasAtLeastOneValue(), llvm::LiveIntervals::hasPHIKill(), join(), RenumberValues(), llvm::LiveIntervals::shrinkToUses(), stripValuesNotDefiningMask(), verify(), vni_begin(), vni_begin(), vni_end(), and vni_end().


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