43 size_t Mid = Len >> 1;
47 I += Mid + 1, Len -= Mid + 1;
54 assert(!Def.
isDead() &&
"Cannot define a value at the dead slot");
62 assert(I->valno->def == I->start &&
"Inconsistent existing value def");
69 Def = std::min(Def, I->start);
71 I->start = I->valno->def =
Def;
100 assert(!
empty() &&
"empty range");
106 assert((StartPos->start <= i->start || StartPos == other.
begin()) &&
107 StartPos != other.
end() &&
"Bogus start position hint!");
109 if (i->start < j->start) {
110 i = std::upper_bound(i, ie, j->start);
111 if (i !=
begin()) --i;
112 }
else if (j->start < i->start) {
114 if (StartPos != other.
end() && StartPos->start <= i->start) {
115 assert(StartPos < other.
end() && i <
end());
116 j = std::upper_bound(j, je, i->start);
117 if (j != other.
begin()) --j;
123 if (j == je)
return false;
126 if (i->start > j->start) {
131 if (i->end > j->start)
141 assert(!
empty() &&
"empty range");
157 assert(J->end >= I->start);
159 if (J->start < I->end) {
168 if (J->end > I->end) {
176 while (J->end < I->start);
183 assert(Start < End &&
"Invalid range");
185 return I !=
begin() && (--
I)->
end > Start;
192 void LiveRange::markValNoForDeletion(
VNInfo *ValNo) {
211 assert(!VNI->
isUnused() &&
"Unused valno used by live segment");
220 void LiveRange::extendSegmentEndTo(iterator
I,
SlotIndex NewEnd) {
221 assert(I !=
end() &&
"Not a valid segment!");
226 for (; MergeTo !=
end() && NewEnd >= MergeTo->end; ++MergeTo) {
227 assert(MergeTo->valno == ValNo &&
"Cannot merge with differing values!");
231 I->end = std::max(NewEnd,
prior(MergeTo)->
end);
235 if (MergeTo !=
end() && MergeTo->start <= I->end &&
236 MergeTo->valno == ValNo) {
237 I->end = MergeTo->end;
250 LiveRange::extendSegmentStartTo(iterator I,
SlotIndex NewStart) {
251 assert(I !=
end() &&
"Not a valid segment!");
257 if (MergeTo ==
begin()) {
262 assert(MergeTo->valno == ValNo &&
"Cannot merge with differing values!");
264 }
while (NewStart <= MergeTo->start);
268 if (MergeTo->end >= NewStart && MergeTo->valno == ValNo) {
269 MergeTo->end = I->end;
273 MergeTo->start = NewStart;
274 MergeTo->end = I->end;
283 iterator it = std::upper_bound(From,
end(), Start);
289 if (S.valno == B->valno) {
290 if (B->start <= Start && B->end >= Start) {
291 extendSegmentEndTo(B, End);
297 assert(B->end <= Start &&
298 "Cannot overlap two segments with differing ValID's"
299 " (did you def the same reg twice in a MachineInstr?)");
306 if (S.valno == it->valno) {
307 if (it->start <= End) {
308 it = extendSegmentStartTo(it, Start);
313 extendSegmentEndTo(it, End);
319 assert(it->start >= End &&
320 "Cannot overlap two segments with differing ValID's");
339 if (I->end <= StartIdx)
342 extendSegmentEndTo(I, Kill);
349 bool RemoveDeadValNo) {
352 assert(I !=
end() &&
"Segment is not in range!");
353 assert(I->containsInterval(Start, End)
354 &&
"Segment is not entirely in range!");
358 if (I->start == Start) {
360 if (RemoveDeadValNo) {
364 if (II != I && II->valno == ValNo) {
370 markValNoForDeletion(ValNo);
403 if (I->valno == ValNo)
407 markValNoForDeletion(ValNo);
411 const int *LHSValNoAssignments,
412 const int *RHSValNoAssignments,
418 bool MustMapCurValNos =
false;
420 unsigned NumNewVals = NewVNInfo.
size();
421 for (
unsigned i = 0; i != NumVals; ++i) {
422 unsigned LHSValID = LHSValNoAssignments[i];
424 (NewVNInfo[LHSValID] && NewVNInfo[LHSValID] !=
getValNumInfo(i))) {
425 MustMapCurValNos =
true;
431 if (MustMapCurValNos && !
empty()) {
435 OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
437 VNInfo* nextValNo = NewVNInfo[LHSValNoAssignments[I->valno->id]];
438 assert(nextValNo != 0 &&
"Huh?");
443 if (OutIt->valno == nextValNo && OutIt->end == I->start) {
448 OutIt->valno = nextValNo;
450 OutIt->start = I->start;
465 I->valno = NewVNInfo[RHSValNoAssignments[I->valno->id]];
469 unsigned NumValNos = 0;
470 for (
unsigned i = 0; i < NumNewVals; ++i) {
471 VNInfo *VNI = NewVNInfo[i];
473 if (NumValNos >= NumVals)
477 VNI->
id = NumValNos++;
480 if (NumNewVals < NumVals)
497 Updater.
add(I->start, I->end, LHSValNo);
510 if (I->valno == RHSValNo)
511 Updater.
add(I->start, I->end, LHSValNo);
519 assert(V1 != V2 &&
"Identical value#'s are always equivalent!");
527 if (V1->
id < V2->
id) {
535 if (S->valno != V1)
continue;
541 if (Prev->valno == V2 && Prev->end == S->start) {
559 if (I->start == S->end && I->valno == V2) {
568 markValNoForDeletion(V1);
576 Sum += I->start.distance(I->end);
581 return os <<
'[' << S.
start <<
',' << S.
end <<
':' << S.
valno->
id <<
")";
584 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
586 dbgs() << *
this <<
"\n";
596 assert(I->valno ==
getValNumInfo(I->valno->id) &&
"Bad VNInfo");
625 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
627 dbgs() << *
this <<
"\n";
631 dbgs() << *
this <<
"\n";
638 assert(I->start.isValid());
639 assert(I->end.isValid());
640 assert(I->start < I->end);
641 assert(I->valno != 0);
643 assert(I->valno ==
valnos[I->valno->id]);
686 OS <<
"Clean updater: " << *LR <<
'\n';
688 OS <<
"Null updater.\n";
691 assert(LR &&
"Can't have null LR in dirty updater.");
692 OS <<
" updater with gap = " << (ReadI - WriteI)
693 <<
", last start = " << LastStart
698 for (
unsigned I = 0, E = Spills.size(); I != E; ++
I)
699 OS <<
' ' << Spills[I];
714 assert(A.
start <= B.
start &&
"Unordered live segments.");
719 assert(A.
valno == B.
valno &&
"Cannot overlap different values");
724 assert(LR &&
"Cannot add to a null destination");
727 if (!LastStart.isValid() || LastStart > Seg.
start) {
731 assert(Spills.empty() &&
"Leftover spilled segments");
732 WriteI = ReadI = LR->begin();
736 LastStart = Seg.
start;
740 if (ReadI != E && ReadI->end <= Seg.
start) {
746 ReadI = WriteI = LR->find(Seg.
start);
748 while (ReadI != E && ReadI->end <= Seg.
start)
749 *WriteI++ = *ReadI++;
752 assert(ReadI == E || ReadI->end > Seg.
start);
755 if (ReadI != E && ReadI->start <= Seg.
start) {
756 assert(ReadI->valno == Seg.
valno &&
"Cannot overlap different values");
758 if (ReadI->end >= Seg.
end)
761 Seg.
start = ReadI->start;
767 Seg.
end = std::max(Seg.
end, ReadI->end);
772 if (!Spills.empty() &&
coalescable(Spills.back(), Seg)) {
773 Seg.
start = Spills.back().start;
774 Seg.
end = std::max(Spills.back().end, Seg.
end);
779 if (WriteI != LR->begin() &&
coalescable(WriteI[-1], Seg)) {
780 WriteI[-1].end = std::max(WriteI[-1].
end, Seg.
end);
785 if (WriteI != ReadI) {
792 LR->segments.push_back(Seg);
793 WriteI = ReadI = LR->
end();
795 Spills.push_back(Seg);
800 void LiveRangeUpdater::mergeSpills() {
802 size_t GapSize = ReadI - WriteI;
803 size_t NumMoved = std::min(Spills.size(), GapSize);
814 if (Src != B && Src[-1].start > SpillSrc[-1].start)
817 *--Dst = *--SpillSrc;
819 assert(NumMoved ==
size_t(Spills.end() - SpillSrc));
820 Spills.erase(SpillSrc, Spills.end());
829 assert(LR &&
"Cannot add to a null destination");
832 if (Spills.empty()) {
833 LR->segments.erase(WriteI, ReadI);
839 size_t GapSize = ReadI - WriteI;
840 if (GapSize < Spills.size()) {
842 size_t WritePos = WriteI - LR->begin();
845 WriteI = LR->begin() + WritePos;
848 LR->segments.erase(WriteI + Spills.size(), ReadI);
850 ReadI = WriteI + Spills.size();
860 const VNInfo *used = 0, *unused = 0;
869 EqClass.join(unused->id, VNI->
id);
876 assert(MBB &&
"Phi-def has no defining MBB");
879 PE = MBB->
pred_end(); PI != PE; ++PI)
881 EqClass.join(VNI->
id, PVNI->id);
888 EqClass.join(VNI->
id, UVNI->id);
894 EqClass.join(used->
id, unused->id);
897 return EqClass.getNumClasses();
902 assert(LIV[0] &&
"LIV[0] must be set");
907 RE = MRI.
reg_end(); RI != RE;) {
917 Idx = LIS.getSlotIndexes()->getIndexBefore(MI);
919 Idx = LIS.getInstructionIndex(MI);
926 MO.
setReg(LIV[getEqClass(VNI)]->reg);
931 while (J != E && EqClass[J->valno->id] == 0)
934 if (
unsigned eq = EqClass[I->valno->id]) {
936 "New intervals should be empty");
945 while (j != e && EqClass[j] == 0)
947 for (
unsigned i = j; i != e; ++i) {
949 if (
unsigned eq = EqClass[i]) {
void add(LiveRange::Segment)
void push_back(const T &Elt)
MachineInstr * getParent()
Segments::iterator iterator
SlotIndex def
The index of the defining instruction.
static bool coalescable(const LiveRange::Segment &A, const LiveRange::Segment &B)
void MergeValueInAsValue(const LiveRange &RHS, const VNInfo *RHSValNo, VNInfo *LHSValNo)
iterator insert(iterator I, const T &Elt)
void markUnused()
Mark this value as unused.
unsigned getNumValNums() const
LoopInfoBase< BlockT, LoopT > * LI
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
unsigned Classify(const LiveInterval *LI)
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
void print(raw_ostream &OS) const
bool isUnused() const
Returns true if this value is unused.
void MergeSegmentsInAsValue(const LiveRange &RHS, VNInfo *LHSValNo)
void Distribute(LiveInterval *LIV[], MachineRegisterInfo &MRI)
bool isDead() const
isDead - Returns true if this is a dead def kill slot.
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
VNInfo * MergeValueNumberInto(VNInfo *V1, VNInfo *V2)
bool expiredAt(SlotIndex index) const
void copyFrom(VNInfo &src)
Copy from the parameter into this VNInfo.
SlotIndex getPrevSlot() const
bool isDebugValue() const
void removeValNo(VNInfo *ValNo)
LiveQueryResult Query(SlotIndex Idx) const
bool overlaps(const LiveRange &other) const
ItTy next(ItTy it, Dist n)
VNInfo * valueDefined() const
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
void verify() const
Walk the range and assert if any invariants fail to hold.
iterator erase(iterator I)
pred_iterator pred_begin()
MachineInstr * getInstructionFromIndex(SlotIndex index) const
std::vector< MachineBasicBlock * >::const_iterator const_pred_iterator
iterator find(SlotIndex Pos)
unsigned id
The ID number of this value.
void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
bool isCoalescable(const MachineInstr *) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
VNInfo * getValNumInfo(unsigned ValNo)
SlotIndex beginIndex() const
beginIndex - Return the lowest numbered slot covered.
void print(raw_ostream &OS) const
void print(raw_ostream &) const
VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
SlotIndex endIndex() const
void setReg(unsigned Reg)
VNInfo * extendInBlock(SlotIndex StartIdx, SlotIndex Kill)
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
VNInfo * getNextValue(SlotIndex def, VNInfo::Allocator &VNInfoAllocator)
ItTy prior(ItTy it, Dist n)
void join(LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
reg_iterator reg_begin(unsigned RegNo) const
const MCRegisterInfo & MRI
static reg_iterator reg_end()
SlotIndex - An opaque wrapper around machine indexes.
bool overlapsFrom(const LiveRange &Other, const_iterator I) const
VNInfo * getVNInfoBefore(SlotIndex Idx) const