35#include "llvm/Config/llvm-config.h"
64template <
typename ImplT,
typename IteratorT,
typename CollectionT>
65class CalcLiveRangeUtilBase {
70 CalcLiveRangeUtilBase(
LiveRange *LR) : LR(LR) {}
73 using Segment = LiveRange::Segment;
89 assert(!
Def.isDead() &&
"Cannot define a value at the dead slot");
91 "If ForVNI is specified, it must match Def");
92 iterator
I =
impl().find(Def);
93 if (
I == segments().
end()) {
94 VNInfo *VNI = ForVNI ? ForVNI : LR->getNextValue(Def, *VNInfoAllocator);
95 impl().insertAtEnd(Segment(Def,
Def.getDeadSlot(), VNI));
99 Segment *S = segmentAt(
I);
101 assert((!ForVNI || ForVNI == S->valno) &&
"Value number mismatch");
102 assert(S->valno->def == S->start &&
"Inconsistent existing value def");
109 Def = std::min(Def, S->start);
111 S->start = S->valno->def =
Def;
115 VNInfo *VNI = ForVNI ? ForVNI : LR->getNextValue(Def, *VNInfoAllocator);
116 segments().insert(
I, Segment(Def,
Def.getDeadSlot(), VNI));
120 VNInfo *extendInBlock(SlotIndex StartIdx, SlotIndex Use) {
121 if (segments().
empty())
124 impl().findInsertPos(Segment(
Use.getPrevSlot(), Use,
nullptr));
125 if (
I == segments().
begin())
128 if (
I->end <= StartIdx)
131 extendSegmentEndTo(
I, Use);
136 SlotIndex StartIdx, SlotIndex Use) {
137 if (segments().
empty())
138 return std::make_pair(
nullptr,
false);
139 SlotIndex BeforeUse =
Use.getPrevSlot();
140 iterator
I =
impl().findInsertPos(Segment(BeforeUse, Use,
nullptr));
141 if (
I == segments().
begin())
142 return std::make_pair(
nullptr, LR->isUndefIn(Undefs, StartIdx, BeforeUse));
144 if (
I->end <= StartIdx)
145 return std::make_pair(
nullptr, LR->isUndefIn(Undefs, StartIdx, BeforeUse));
147 if (LR->isUndefIn(Undefs,
I->end, BeforeUse))
148 return std::make_pair(
nullptr,
true);
149 extendSegmentEndTo(
I, Use);
151 return std::make_pair(
I->valno,
false);
158 void extendSegmentEndTo(iterator
I, SlotIndex NewEnd) {
159 assert(
I != segments().
end() &&
"Not a valid segment!");
160 Segment *S = segmentAt(
I);
161 VNInfo *ValNo =
I->valno;
164 iterator MergeTo = std::next(
I);
165 for (; MergeTo != segments().end() && NewEnd >= MergeTo->end; ++MergeTo)
166 assert(MergeTo->valno == ValNo &&
"Cannot merge with differing values!");
169 S->end = std::max(NewEnd, std::prev(MergeTo)->end);
173 if (MergeTo != segments().
end() && MergeTo->start <=
I->end &&
174 MergeTo->valno == ValNo) {
175 S->end = MergeTo->end;
180 segments().erase(std::next(
I), MergeTo);
186 iterator extendSegmentStartTo(iterator
I, SlotIndex NewStart) {
187 assert(
I != segments().
end() &&
"Not a valid segment!");
188 Segment *S = segmentAt(
I);
189 VNInfo *ValNo =
I->valno;
192 iterator MergeTo =
I;
194 if (MergeTo == segments().
begin()) {
196 segments().erase(MergeTo,
I);
199 assert(MergeTo->valno == ValNo &&
"Cannot merge with differing values!");
201 }
while (NewStart <= MergeTo->start);
205 if (MergeTo->end >= NewStart && MergeTo->valno == ValNo) {
206 segmentAt(MergeTo)->end = S->end;
210 Segment *MergeToSeg = segmentAt(MergeTo);
211 MergeToSeg->start = NewStart;
212 MergeToSeg->end = S->end;
215 segments().erase(std::next(MergeTo), std::next(
I));
219 iterator addSegment(Segment S) {
220 SlotIndex
Start = S.start, End = S.end;
221 iterator
I =
impl().findInsertPos(S);
225 if (
I != segments().
begin()) {
226 iterator
B = std::prev(
I);
227 if (S.valno ==
B->valno) {
228 if (
B->start <= Start &&
B->end >= Start) {
229 extendSegmentEndTo(
B, End);
236 "Cannot overlap two segments with differing ValID's"
237 " (did you def the same reg twice in a MachineInstr?)");
243 if (
I != segments().
end()) {
244 if (S.valno ==
I->valno) {
245 if (
I->start <= End) {
246 I = extendSegmentStartTo(
I, Start);
251 extendSegmentEndTo(
I, End);
258 "Cannot overlap two segments with differing ValID's");
265 return segments().insert(
I, S);
269 ImplT &
impl() {
return *
static_cast<ImplT *
>(
this); }
271 CollectionT &segments() {
return impl().segmentsColl(); }
273 Segment *segmentAt(iterator
I) {
return const_cast<Segment *
>(&(*I)); }
281class CalcLiveRangeUtilVector;
282using CalcLiveRangeUtilVectorBase =
286class CalcLiveRangeUtilVector :
public CalcLiveRangeUtilVectorBase {
288 CalcLiveRangeUtilVector(
LiveRange *LR) : CalcLiveRangeUtilVectorBase(LR) {}
291 friend CalcLiveRangeUtilVectorBase;
293 LiveRange::Segments &segmentsColl() {
return LR->
segments; }
307class CalcLiveRangeUtilSet;
308using CalcLiveRangeUtilSetBase =
309 CalcLiveRangeUtilBase<CalcLiveRangeUtilSet, LiveRange::SegmentSet::iterator,
312class CalcLiveRangeUtilSet :
public CalcLiveRangeUtilSetBase {
314 CalcLiveRangeUtilSet(
LiveRange *LR) : CalcLiveRangeUtilSetBase(LR) {}
317 friend CalcLiveRangeUtilSetBase;
319 LiveRange::SegmentSet &segmentsColl() {
return *LR->
segmentSet; }
321 void insertAtEnd(
const Segment &S) {
331 if (Pos < (*PrevI).end)
352 [&](
const Segment &
X) {
return X.end <= Pos; });
358 return CalcLiveRangeUtilSet(
this).createDeadDef(Def, &VNIAlloc,
nullptr);
360 return CalcLiveRangeUtilVector(
this).createDeadDef(Def, &VNIAlloc,
nullptr);
366 return CalcLiveRangeUtilSet(
this).createDeadDef(VNI->
def,
nullptr, VNI);
368 return CalcLiveRangeUtilVector(
this).createDeadDef(VNI->
def,
nullptr, VNI);
397 assert((StartPos->start <= i->start || StartPos == other.
begin()) &&
398 StartPos != other.
end() &&
"Bogus start position hint!");
400 if (i->start < j->start) {
401 i = std::upper_bound(i, ie, j->start);
402 if (i !=
begin()) --i;
403 }
else if (j->start < i->start) {
405 if (StartPos != other.
end() && StartPos->start <= i->start) {
407 j = std::upper_bound(j, je, i->start);
408 if (j != other.
begin()) --j;
414 if (j == je)
return false;
417 if (i->start > j->start) {
422 if (i->end > j->start)
450 if (J->start <
I->end) {
459 if (J->end >
I->end) {
467 while (J->end <=
I->start);
474 assert(Start < End &&
"Invalid range");
481 return Other.empty();
486 if (
I ==
end() ||
I->start > O.start)
490 while (
I->end < O.end) {
504void LiveRange::markValNoForDeletion(
VNInfo *ValNo) {
521 if (!Seen.
insert(VNI).second)
529void LiveRange::addSegmentToSet(Segment S) {
530 CalcLiveRangeUtilSet(
this).addSegment(S);
540 return CalcLiveRangeUtilVector(
this).addSegment(S);
545 assert(
I !=
end() &&
"Cannot merge end iterator");
549 if (Prev->valno ==
I->valno && Prev->end ==
I->start) {
575 return CalcLiveRangeUtilSet(
this).extendInBlock(Undefs, StartIdx,
Kill);
577 return CalcLiveRangeUtilVector(
this).extendInBlock(Undefs, StartIdx,
Kill);
583 return CalcLiveRangeUtilSet(
this).extendInBlock(StartIdx,
Kill);
585 return CalcLiveRangeUtilVector(
this).extendInBlock(StartIdx,
Kill);
589 bool RemoveDeadValNo) {
597 assert(
I->containsInterval(Start, End)
598 &&
"Segment is not entirely in range!");
602 if (
I->start == Start) {
638 markValNoForDeletion(ValNo);
646 [ValNo](
const Segment &S) {
return S.
valno == ValNo; });
648 markValNoForDeletion(ValNo);
652 const int *LHSValNoAssignments,
653 const int *RHSValNoAssignments,
660 bool MustMapCurValNos =
false;
662 unsigned NumNewVals = NewVNInfo.
size();
663 for (
unsigned i = 0; i != NumVals; ++i) {
664 unsigned LHSValID = LHSValNoAssignments[i];
666 (NewVNInfo[LHSValID] && NewVNInfo[LHSValID] !=
getValNumInfo(i))) {
667 MustMapCurValNos =
true;
673 if (MustMapCurValNos && !
empty()) {
677 OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
679 VNInfo* nextValNo = NewVNInfo[LHSValNoAssignments[
I->valno->id]];
680 assert(nextValNo &&
"Huh?");
685 if (OutIt->valno == nextValNo && OutIt->end ==
I->start) {
690 OutIt->valno = nextValNo;
692 OutIt->start =
I->start;
711 unsigned NumValNos = 0;
712 for (
unsigned i = 0; i < NumNewVals; ++i) {
713 VNInfo *VNI = NewVNInfo[i];
715 if (NumValNos >= NumVals)
719 VNI->
id = NumValNos++;
722 if (NumNewVals < NumVals)
723 valnos.resize(NumNewVals);
738 for (
const Segment &S : RHS.segments)
751 for (
const Segment &S : RHS.segments)
752 if (S.
valno == RHSValNo)
761 assert(
V1 != V2 &&
"Identical value#'s are always equivalent!");
769 if (
V1->id < V2->
id) {
777 if (S->valno !=
V1)
continue;
786 markValNoForDeletion(
V1);
795 "segment set can be used only initially before switching to the array");
814 if (SegmentI == SegmentE)
818 for ( ; SlotI != SlotE; ++SlotI) {
822 if (SegmentI == SegmentE)
826 if (SegmentI->contains(*SlotI))
835void LiveInterval::freeSubRange(SubRange *S) {
843 while (
I !=
nullptr) {
854 }
while (
I !=
nullptr &&
I->empty());
874 unsigned ComposeSubRegIdx) {
877 if (!
Reg || !
Reg.isVirtual())
889 assert(
MI &&
"Cannot find the definition of a value");
892 if (!MOI->isReg() || !MOI->isDef())
894 if (MOI->getReg() !=
Reg)
896 LaneBitmask OrigMask =
TRI.getSubRegIndexLaneMask(MOI->getSubReg());
899 ?
TRI.composeSubRegIndexLaneMask(ComposeSubRegIdx, OrigMask)
901 if ((ExpectedDefMask & LaneMask).
none())
910 for (
VNInfo *VNI : ToBeRemoved)
921 unsigned ComposeSubRegIdx) {
930 if (SRMask == Matching) {
936 SR.LaneMask = SRMask & ~Matching;
946 Apply(*MatchingRange);
947 ToApply &= ~Matching;
959 Sum += S.start.distance(S.end);
969 assert((VRegMask & LaneMask).any());
974 unsigned SubReg = MO.getSubReg();
975 assert(SubReg != 0 &&
"Undef should only be set on subreg defs");
978 if ((UndefMask & LaneMask).any()) {
988 return OS <<
'[' << S.
start <<
',' << S.
end <<
':' << S.
valno->
id <<
')';
991#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
993 dbgs() << *
this <<
'\n';
1028 assert(vnum == vni->
id &&
"Bad VNInfo");
1035 <<
static_cast<const LiveRange &
>(*this);
1044 OS <<
" weight:" << Weight;
1047#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1053 dbgs() << *
this <<
'\n';
1057 dbgs() << *
this <<
'\n';
1064 if (!
I->start.isValid())
1066 if (!
I->end.isValid())
1068 if (
I->start >=
I->end)
1070 if (
I->valno ==
nullptr)
1072 if (
I->valno->id >=
valnos.size())
1074 if (
I->valno !=
valnos[
I->valno->id])
1076 if (std::next(
I) != E) {
1077 if (
I->end > std::next(
I)->start)
1079 if (
I->end == std::next(
I)->start) {
1080 if (
I->valno == std::next(
I)->valno)
1099 if ((Mask & SR.LaneMask).any())
1102 Mask |= SR.LaneMask;
1105 if ((Mask & ~MaxMask).any())
1153#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1157 OS <<
"Clean updater: " << *LR <<
'\n';
1159 OS <<
"Null updater.\n";
1162 assert(LR &&
"Can't have null LR in dirty updater.");
1163 OS <<
" updater with gap = " << (ReadI - WriteI)
1164 <<
", last start = " << LastStart
1166 for (
const auto &S :
make_range(LR->begin(), WriteI))
1172 for (
const auto &S :
make_range(ReadI, LR->end()))
1185 assert(
A.start <=
B.start &&
"Unordered live segments.");
1186 if (
A.end ==
B.start)
1187 return A.valno ==
B.valno;
1188 if (
A.end <
B.start)
1190 assert(
A.valno ==
B.valno &&
"Cannot overlap different values");
1195 assert(LR &&
"Cannot add to a null destination");
1199 if (LR->segmentSet !=
nullptr) {
1200 LR->addSegmentToSet(Seg);
1205 if (!LastStart.isValid() || LastStart > Seg.
start) {
1209 assert(Spills.empty() &&
"Leftover spilled segments");
1210 WriteI = ReadI = LR->begin();
1214 LastStart = Seg.
start;
1218 if (ReadI != E && ReadI->end <= Seg.
start) {
1220 if (ReadI != WriteI)
1223 if (ReadI == WriteI)
1224 ReadI = WriteI = LR->find(Seg.
start);
1226 while (ReadI != E && ReadI->end <= Seg.
start)
1227 *WriteI++ = *ReadI++;
1233 if (ReadI != E && ReadI->start <= Seg.
start) {
1234 assert(ReadI->valno == Seg.
valno &&
"Cannot overlap different values");
1236 if (ReadI->end >= Seg.
end)
1239 Seg.
start = ReadI->start;
1245 Seg.
end = std::max(Seg.
end, ReadI->end);
1250 if (!Spills.empty() &&
coalescable(Spills.back(), Seg)) {
1251 Seg.
start = Spills.back().start;
1252 Seg.
end = std::max(Spills.back().end, Seg.
end);
1257 if (WriteI != LR->begin() &&
coalescable(WriteI[-1], Seg)) {
1258 WriteI[-1].end = std::max(WriteI[-1].
end, Seg.
end);
1263 if (WriteI != ReadI) {
1270 LR->segments.push_back(Seg);
1271 WriteI = ReadI = LR->end();
1273 Spills.push_back(Seg);
1278void LiveRangeUpdater::mergeSpills() {
1280 size_t GapSize = ReadI - WriteI;
1281 size_t NumMoved = std::min(Spills.size(), GapSize);
1291 while (Src != Dst) {
1292 if (Src !=
B && Src[-1].start > SpillSrc[-1].start)
1295 *--Dst = *--SpillSrc;
1297 assert(NumMoved ==
size_t(Spills.end() - SpillSrc));
1298 Spills.erase(SpillSrc, Spills.end());
1307 assert(LR &&
"Cannot add to a null destination");
1310 if (Spills.empty()) {
1311 LR->segments.erase(WriteI, ReadI);
1317 size_t GapSize = ReadI - WriteI;
1318 if (GapSize < Spills.size()) {
1320 size_t WritePos = WriteI - LR->begin();
1323 WriteI = LR->begin() + WritePos;
1326 LR->segments.erase(WriteI + Spills.size(), ReadI);
1328 ReadI = WriteI + Spills.size();
1338 const VNInfo *used =
nullptr, *unused =
nullptr;
1345 EqClass.join(unused->id, VNI->
id);
1352 assert(
MBB &&
"Phi-def has no defining MBB");
1356 EqClass.join(VNI->
id, PVNI->id);
1363 EqClass.join(VNI->
id, UVNI->id);
1369 EqClass.join(used->id, unused->id);
1372 return EqClass.getNumClasses();
1382 if (
MI->isDebugValue()) {
1385 SlotIndex Idx = LIS.getSlotIndexes()->getIndexBefore(*
MI);
1397 MO.setReg(LIV[EqClass - 1]->reg());
1402 unsigned NumComponents = EqClass.getNumClasses();
1409 unsigned NumValNos = SR.valnos.size();
1411 VNIMapping.
reserve(NumValNos);
1413 SubRanges.
resize(NumComponents-1,
nullptr);
1414 for (
unsigned I = 0;
I < NumValNos; ++
I) {
1415 const VNInfo &VNI = *SR.valnos[
I];
1416 unsigned ComponentNum;
1421 assert(MainRangeVNI !=
nullptr
1422 &&
"SubRange def must have corresponding main range def");
1424 if (ComponentNum > 0 && SubRanges[ComponentNum-1] ==
nullptr) {
1425 SubRanges[ComponentNum-1]
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static BasicBlock::iterator findInsertPos(Value *Addr, Instruction *MemoryInst, Value *SunkAddr)
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
A common definition of LaneBitmask for use in TableGen and CodeGen.
static void createDeadDef(SlotIndexes &Indexes, VNInfo::Allocator &Alloc, LiveRange &LR, const MachineOperand &MO)
static bool coalescable(const LiveRange::Segment &A, const LiveRange::Segment &B)
static void stripValuesNotDefiningMask(Register Reg, LiveInterval::SubRange &SR, LaneBitmask LaneMask, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx)
For each VNI in SR, check whether or not that value defines part of the mask describe by LaneMask and...
This file contains helper functions to modify live ranges.
Register const TargetRegisterInfo * TRI
place backedge safepoints impl
SI Optimize VGPR LiveRange
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
A helper class for register coalescers.
bool isCoalescable(const MachineInstr *) const
Return true if MI is a copy instruction that will become an identity copy after coalescing.
LLVM_ABI void Distribute(LiveInterval &LI, LiveInterval *LIV[], MachineRegisterInfo &MRI)
Distribute values in LI into a separate LiveIntervals for each connected component.
LLVM_ABI unsigned Classify(const LiveRange &LR)
Classify the values in LR into connected components.
unsigned getEqClass(const VNInfo *VNI) const
getEqClass - Classify creates equivalence classes numbered 0..N.
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
A live range for subregisters.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI void dump() const
LiveInterval - This class represents the liveness of a register, or stack slot.
LLVM_ABI void removeEmptySubRanges()
Removes all subranges without any segments (subranges without segments are not considered valid and s...
bool hasSubRanges() const
Returns true if subregister liveness information is available.
LLVM_ABI void dump() const
LLVM_ABI unsigned getSize() const
getSize - Returns the sum of sizes of all the LiveRange's.
SubRange * createSubRangeFrom(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, const LiveRange &CopyFrom)
Like createSubRange() but the new range is filled with a copy of the liveness information in CopyFrom...
iterator_range< subrange_iterator > subranges()
LLVM_ABI void refineSubRanges(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function< void(LiveInterval::SubRange &)> Apply, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx=0)
Refines the subranges to support LaneMask.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI void computeSubRangeUndefs(SmallVectorImpl< SlotIndex > &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const
For a given lane mask LaneMask, compute indexes at which the lane is marked undefined by subregister ...
SubRange * createSubRange(BumpPtrAllocator &Allocator, LaneBitmask LaneMask)
Creates a new empty subregister live range.
LLVM_ABI void clearSubRanges()
Removes all subregister liveness information.
Result of a LiveRange query.
VNInfo * valueIn() const
Return the value that is live-in to the instruction.
VNInfo * valueOut() const
Return the value leaving the instruction, if any.
VNInfo * valueDefined() const
Return the value defined by this instruction, if any.
LLVM_ABI void print(raw_ostream &) const
LLVM_ABI void flush()
Flush the updater state to LR so it is valid and contains all added segments.
LLVM_ABI void dump() const
bool isDirty() const
Return true if the LR is currently in an invalid state, and flush() needs to be called.
LLVM_ABI void add(LiveRange::Segment)
Add a segment to LR and coalesce when possible, just like LR.addSegment().
This class represents the liveness of a register, stack slot, etc.
LiveRange(bool UseSegmentSet=false)
Constructs a new LiveRange object.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
Segments::iterator iterator
LLVM_ABI void join(LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
join - Join two live ranges (this, and other) together.
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...
Segments::const_iterator const_iterator
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
LLVM_ABI iterator mergeAdjacentSegments(iterator I)
Merge the segment pointed to by I with its immediate neighbors when they use the same value number an...
std::set< Segment > SegmentSet
LLVM_ABI bool isLiveAtIndexes(ArrayRef< SlotIndex > Slots) const
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.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
std::unique_ptr< SegmentSet > segmentSet
LLVM_ABI void removeValNo(VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
LLVM_ABI void RenumberValues()
RenumberValues - Renumber all values in order of appearance and remove unused values.
bool overlaps(const LiveRange &other) const
overlaps - Return true if the intersection of the two live ranges is not empty.
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.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
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.
bool verify() const
Walk the range and assert if any invariants fail to hold.
LLVM_ABI void append(const LiveRange::Segment S)
Append a segment to the list of segments.
friend class LiveRangeUpdater
LLVM_ABI VNInfo * MergeValueNumberInto(VNInfo *V1, VNInfo *V2)
MergeValueNumberInto - This method is called when two value numbers are found to be equivalent.
unsigned getNumValNums() const
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 ...
SmallVector< Segment, 2 > Segments
VNInfoList::const_iterator const_vni_iterator
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
LLVM_ABI void removeValNoIfDead(VNInfo *ValNo)
Mark ValNo for deletion if no segments in this range use it.
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI void flushSegmentSet()
Flush segment set into the regular segment vector.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
bool isValid() const
isValid - Returns true until all the operands have been visited.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
iterator_range< reg_iterator > reg_operands(Register Reg) const
iterator_range< def_iterator > def_operands(Register Reg) const
const TargetRegisterInfo * getTargetRegisterInfo() const
LLVM_ABI LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
Wrapper class representing virtual and physical registers.
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.
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
isEarlierInstr - Return true if A refers to an instruction earlier than B.
SlotIndex getNextSlot() const
Returns the next slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
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...
VNInfo - Value Number Information.
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &OS) const
void markUnused()
Mark this value as unused.
BumpPtrAllocator Allocator
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
This class implements an extremely fast bulk output stream that can only output to a stream.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
NodeAddr< DefNode * > Def
NodeAddr< UseNode * > Use
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
@ Kill
The last use of a register.
@ EarlyClobber
Register definition happens before uses.
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
static void DistributeRange(LiveRangeT &LR, LiveRangeT *SplitLRs[], EqClassesT VNIClasses)
Helper function that distributes live range value numbers and the corresponding segments of a primary...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
ListT< IteratorSpecifierT< T, I, E > > IteratorT
static constexpr LaneBitmask getAll()
constexpr bool none() const
constexpr bool any() const
This represents a simple continuous liveness interval for a value.
LLVM_ABI void dump() const