35#include "llvm/Config/llvm-config.h"
64template <
typename ImplT,
typename IteratorT,
typename CollectionT>
65class CalcLiveRangeUtilBase {
70 CalcLiveRangeUtilBase(
LiveRange *LR) : LR(LR) {}
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()) {
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;
116 segments().insert(
I, Segment(Def,
Def.getDeadSlot(), VNI));
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);
137 if (segments().empty())
138 return std::make_pair(
nullptr,
false);
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));
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);
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);
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) {
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;
307class CalcLiveRangeUtilSet;
308using CalcLiveRangeUtilSetBase =
309 CalcLiveRangeUtilBase<CalcLiveRangeUtilSet, LiveRange::SegmentSet::iterator,
312class CalcLiveRangeUtilSet :
public CalcLiveRangeUtilSetBase {
314 CalcLiveRangeUtilSet(
LiveRange *LR) : CalcLiveRangeUtilSetBase(LR) {}
317 friend CalcLiveRangeUtilSetBase;
321 void insertAtEnd(
const Segment &S) {
330 iterator PrevI = std::prev(
I);
331 if (Pos < (*PrevI).end)
336 iterator findInsertPos(Segment S) {
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);
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);
553 return CalcLiveRangeUtilSet(
this).extendInBlock(Undefs, StartIdx, Kill);
555 return CalcLiveRangeUtilVector(
this).extendInBlock(Undefs, StartIdx, Kill);
561 return CalcLiveRangeUtilSet(
this).extendInBlock(StartIdx, Kill);
563 return CalcLiveRangeUtilVector(
this).extendInBlock(StartIdx, Kill);
567 bool RemoveDeadValNo) {
576 &&
"Segment is not entirely in range!");
580 if (
I->start == Start) {
616 markValNoForDeletion(ValNo);
624 [ValNo](
const Segment &S) {
return S.
valno == ValNo; });
626 markValNoForDeletion(ValNo);
630 const int *LHSValNoAssignments,
631 const int *RHSValNoAssignments,
638 bool MustMapCurValNos =
false;
640 unsigned NumNewVals = NewVNInfo.
size();
641 for (
unsigned i = 0; i != NumVals; ++i) {
642 unsigned LHSValID = LHSValNoAssignments[i];
644 (NewVNInfo[LHSValID] && NewVNInfo[LHSValID] !=
getValNumInfo(i))) {
645 MustMapCurValNos =
true;
651 if (MustMapCurValNos && !
empty()) {
655 OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
657 VNInfo* nextValNo = NewVNInfo[LHSValNoAssignments[
I->valno->id]];
658 assert(nextValNo &&
"Huh?");
663 if (OutIt->valno == nextValNo && OutIt->end ==
I->start) {
668 OutIt->valno = nextValNo;
670 OutIt->start =
I->start;
689 unsigned NumValNos = 0;
690 for (
unsigned i = 0; i < NumNewVals; ++i) {
691 VNInfo *VNI = NewVNInfo[i];
693 if (NumValNos >= NumVals)
697 VNI->
id = NumValNos++;
700 if (NumNewVals < NumVals)
730 if (S.
valno == RHSValNo)
739 assert(V1 != V2 &&
"Identical value#'s are always equivalent!");
747 if (V1->
id < V2->id) {
755 if (S->valno != V1)
continue;
761 if (Prev->valno == V2 && Prev->end == S->start) {
779 if (
I->start == S->end &&
I->valno == V2) {
788 markValNoForDeletion(V1);
797 "segment set can be used only initially before switching to the array");
816 if (SegmentI == SegmentE)
820 for ( ; SlotI != SlotE; ++SlotI) {
824 if (SegmentI == SegmentE)
828 if (SegmentI->contains(*SlotI))
837void LiveInterval::freeSubRange(SubRange *S) {
845 while (
I !=
nullptr) {
856 }
while (
I !=
nullptr &&
I->empty());
862 for (
SubRange *
I = SubRanges, *Next;
I !=
nullptr;
I = Next) {
876 unsigned ComposeSubRegIdx) {
891 assert(
MI &&
"Cannot find the definition of a value");
894 if (!MOI->isReg() || !MOI->isDef())
896 if (MOI->getReg() != Reg)
898 LaneBitmask OrigMask =
TRI.getSubRegIndexLaneMask(MOI->getSubReg());
901 ?
TRI.composeSubRegIndexLaneMask(ComposeSubRegIdx, OrigMask)
903 if ((ExpectedDefMask & LaneMask).
none())
912 for (
VNInfo *VNI : ToBeRemoved)
923 unsigned ComposeSubRegIdx) {
932 if (SRMask == Matching) {
948 Apply(*MatchingRange);
949 ToApply &= ~Matching;
961 Sum += S.start.distance(S.end);
971 assert((VRegMask & LaneMask).any());
976 unsigned SubReg = MO.getSubReg();
977 assert(
SubReg != 0 &&
"Undef should only be set on subreg defs");
980 if ((UndefMask & LaneMask).any()) {
982 bool EarlyClobber = MO.isEarlyClobber();
993#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
995 dbgs() << *
this <<
'\n';
1016 if (vnum)
OS <<
' ';
1031 <<
static_cast<const LiveRange &
>(*this);
1038 for (
const SubRange &SR : subranges())
1040 OS <<
" weight:" << Weight;
1043#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1045 dbgs() << *
this <<
'\n';
1049 dbgs() << *
this <<
'\n';
1053 dbgs() << *
this <<
'\n';
1066 if (std::next(
I) != E) {
1067 assert(
I->end <= std::next(
I)->start);
1068 if (
I->end == std::next(
I)->start)
1069 assert(
I->valno != std::next(
I)->valno);
1081 for (
const SubRange &SR : subranges()) {
1083 assert((Mask & SR.LaneMask).none());
1084 Mask |= SR.LaneMask;
1127#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1131 OS <<
"Clean updater: " << *LR <<
'\n';
1133 OS <<
"Null updater.\n";
1136 assert(LR &&
"Can't have null LR in dirty updater.");
1137 OS <<
" updater with gap = " << (ReadI - WriteI)
1138 <<
", last start = " << LastStart
1143 for (
unsigned I = 0, E = Spills.size();
I != E; ++
I)
1144 OS <<
' ' << Spills[
I];
1159 assert(
A.start <=
B.start &&
"Unordered live segments.");
1160 if (
A.end ==
B.start)
1161 return A.valno ==
B.valno;
1162 if (
A.end <
B.start)
1164 assert(
A.valno ==
B.valno &&
"Cannot overlap different values");
1169 assert(LR &&
"Cannot add to a null destination");
1174 LR->addSegmentToSet(Seg);
1179 if (!LastStart.isValid() || LastStart > Seg.
start) {
1183 assert(Spills.empty() &&
"Leftover spilled segments");
1184 WriteI = ReadI = LR->
begin();
1188 LastStart = Seg.
start;
1192 if (ReadI != E && ReadI->end <= Seg.
start) {
1194 if (ReadI != WriteI)
1197 if (ReadI == WriteI)
1200 while (ReadI != E && ReadI->end <= Seg.
start)
1201 *WriteI++ = *ReadI++;
1207 if (ReadI != E && ReadI->start <= Seg.
start) {
1208 assert(ReadI->valno == Seg.
valno &&
"Cannot overlap different values");
1210 if (ReadI->end >= Seg.
end)
1213 Seg.
start = ReadI->start;
1219 Seg.
end = std::max(Seg.
end, ReadI->end);
1224 if (!Spills.empty() &&
coalescable(Spills.back(), Seg)) {
1225 Seg.
start = Spills.back().start;
1226 Seg.
end = std::max(Spills.back().end, Seg.
end);
1232 WriteI[-1].end = std::max(WriteI[-1].
end, Seg.
end);
1237 if (WriteI != ReadI) {
1245 WriteI = ReadI = LR->
end();
1247 Spills.push_back(Seg);
1252void LiveRangeUpdater::mergeSpills() {
1254 size_t GapSize = ReadI - WriteI;
1255 size_t NumMoved = std::min(Spills.size(), GapSize);
1265 while (Src != Dst) {
1266 if (Src !=
B && Src[-1].start > SpillSrc[-1].start)
1269 *--Dst = *--SpillSrc;
1271 assert(NumMoved ==
size_t(Spills.end() - SpillSrc));
1272 Spills.erase(SpillSrc, Spills.end());
1281 assert(LR &&
"Cannot add to a null destination");
1284 if (Spills.empty()) {
1291 size_t GapSize = ReadI - WriteI;
1292 if (GapSize < Spills.size()) {
1294 size_t WritePos = WriteI - LR->
begin();
1297 WriteI = LR->
begin() + WritePos;
1302 ReadI = WriteI + Spills.size();
1312 const VNInfo *used =
nullptr, *unused =
nullptr;
1319 EqClass.join(unused->id, VNI->
id);
1326 assert(
MBB &&
"Phi-def has no defining MBB");
1330 EqClass.join(VNI->
id, PVNI->id);
1337 EqClass.join(VNI->
id, UVNI->id);
1343 EqClass.join(used->
id, unused->id);
1346 return EqClass.getNumClasses();
1356 if (
MI->isDebugValue()) {
1370 if (
unsigned EqClass = getEqClass(VNI))
1371 MO.setReg(LIV[EqClass - 1]->reg());
1376 unsigned NumComponents = EqClass.getNumClasses();
1383 unsigned NumValNos = SR.valnos.size();
1385 VNIMapping.
reserve(NumValNos);
1387 SubRanges.
resize(NumComponents-1,
nullptr);
1388 for (
unsigned I = 0;
I < NumValNos; ++
I) {
1389 const VNInfo &VNI = *SR.valnos[
I];
1390 unsigned ComponentNum;
1395 assert(MainRangeVNI !=
nullptr
1396 &&
"SubRange def must have corresponding main range def");
1397 ComponentNum = getEqClass(MainRangeVNI);
1398 if (ComponentNum > 0 && SubRanges[ComponentNum-1] ==
nullptr) {
1399 SubRanges[ComponentNum-1]
unsigned const MachineRegisterInfo * MRI
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
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(unsigned 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.
unsigned const TargetRegisterInfo * TRI
place backedge safepoints impl
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Allocate memory in an ever growing pool, as if by bump-pointer.
A helper class for register coalescers.
void Distribute(LiveInterval &LI, LiveInterval *LIV[], MachineRegisterInfo &MRI)
Distribute values in LI into a separate LiveIntervals for each connected component.
unsigned Classify(const LiveRange &LR)
Classify the values in LR into connected components.
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
A live range for subregisters.
void print(raw_ostream &OS) const
LiveInterval - This class represents the liveness of a register, or stack slot.
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.
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()
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.
void print(raw_ostream &OS) const
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.
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.
Helper class for performant LiveRange bulk updates.
void print(raw_ostream &) const
void flush()
Flush the updater state to LR so it is valid and contains all added segments.
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.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
Segments::iterator iterator
void join(LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
join - Join two live ranges (this, and other) together.
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...
VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
std::set< Segment > SegmentSet
bool isLiveAtIndexes(ArrayRef< SlotIndex > Slots) const
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
void removeValNo(VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
void verify() const
Walk the range and assert if any invariants fail to hold.
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.
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 necessarilly including Idx,...
std::pair< VNInfo *, bool > extendInBlock(ArrayRef< SlotIndex > Undefs, SlotIndex StartIdx, SlotIndex Kill)
Attempt to extend a value defined after StartIdx to include Use.
void append(const LiveRange::Segment S)
Append a segment to the list of segments.
VNInfo * MergeValueNumberInto(VNInfo *V1, VNInfo *V2)
MergeValueNumberInto - This method is called when two value numbers are found to be equivalent.
unsigned getNumValNums() const
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 ...
bool isUndefIn(ArrayRef< SlotIndex > Undefs, SlotIndex Begin, SlotIndex End) const
Returns true if there is an explicit "undef" between Begin End.
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
void removeValNoIfDead(VNInfo *ValNo)
Mark ValNo for deletion if no segments in this range use it.
void print(raw_ostream &OS) const
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.
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.
iterator_range< pred_iterator > predecessors()
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
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)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
A Use represents the edge between a Value definition and its users.
VNInfo - Value Number Information.
void copyFrom(VNInfo &src)
Copy from the parameter into this VNInfo.
void markUnused()
Mark this value as unused.
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
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
const_iterator end(StringRef path)
Get end iterator over path.
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.
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...
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.
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)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
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.