LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LiveInterval.cpp
Go to the documentation of this file.
1 //===-- LiveInterval.cpp - Live Interval Representation -------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the LiveRange and LiveInterval classes. Given some
11 // numbering of each the machine instructions an interval [i, j) is said to be a
12 // live range for register v if there is no instruction with number j' >= j
13 // such that v is live at j' and there is no instruction with number i' < i such
14 // that v is live at i'. In this implementation ranges can have holes,
15 // i.e. a range might look like [1,20), [50,65), [1000,1001). Each
16 // individual segment is represented as an instance of LiveRange::Segment,
17 // and the whole range is represented as an instance of LiveRange.
18 //
19 //===----------------------------------------------------------------------===//
20 
22 #include "RegisterCoalescer.h"
23 #include "llvm/ADT/DenseMap.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/ADT/SmallSet.h"
28 #include "llvm/Support/Debug.h"
31 #include <algorithm>
32 using namespace llvm;
33 
35  // This algorithm is basically std::upper_bound.
36  // Unfortunately, std::upper_bound cannot be used with mixed types until we
37  // adopt C++0x. Many libraries can do it, but not all.
38  if (empty() || Pos >= endIndex())
39  return end();
40  iterator I = begin();
41  size_t Len = size();
42  do {
43  size_t Mid = Len >> 1;
44  if (Pos < I[Mid].end)
45  Len = Mid;
46  else
47  I += Mid + 1, Len -= Mid + 1;
48  } while (Len);
49  return I;
50 }
51 
53  VNInfo::Allocator &VNInfoAllocator) {
54  assert(!Def.isDead() && "Cannot define a value at the dead slot");
55  iterator I = find(Def);
56  if (I == end()) {
57  VNInfo *VNI = getNextValue(Def, VNInfoAllocator);
58  segments.push_back(Segment(Def, Def.getDeadSlot(), VNI));
59  return VNI;
60  }
61  if (SlotIndex::isSameInstr(Def, I->start)) {
62  assert(I->valno->def == I->start && "Inconsistent existing value def");
63 
64  // It is possible to have both normal and early-clobber defs of the same
65  // register on an instruction. It doesn't make a lot of sense, but it is
66  // possible to specify in inline assembly.
67  //
68  // Just convert everything to early-clobber.
69  Def = std::min(Def, I->start);
70  if (Def != I->start)
71  I->start = I->valno->def = Def;
72  return I->valno;
73  }
74  assert(SlotIndex::isEarlierInstr(Def, I->start) && "Already live at def");
75  VNInfo *VNI = getNextValue(Def, VNInfoAllocator);
76  segments.insert(I, Segment(Def, Def.getDeadSlot(), VNI));
77  return VNI;
78 }
79 
80 // overlaps - Return true if the intersection of the two live ranges is
81 // not empty.
82 //
83 // An example for overlaps():
84 //
85 // 0: A = ...
86 // 4: B = ...
87 // 8: C = A + B ;; last use of A
88 //
89 // The live ranges should look like:
90 //
91 // A = [3, 11)
92 // B = [7, x)
93 // C = [11, y)
94 //
95 // A->overlaps(C) should return false since we want to be able to join
96 // A and C.
97 //
99  const_iterator StartPos) const {
100  assert(!empty() && "empty range");
101  const_iterator i = begin();
102  const_iterator ie = end();
103  const_iterator j = StartPos;
104  const_iterator je = other.end();
105 
106  assert((StartPos->start <= i->start || StartPos == other.begin()) &&
107  StartPos != other.end() && "Bogus start position hint!");
108 
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) {
113  ++StartPos;
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;
118  }
119  } else {
120  return true;
121  }
122 
123  if (j == je) return false;
124 
125  while (i != ie) {
126  if (i->start > j->start) {
127  std::swap(i, j);
128  std::swap(ie, je);
129  }
130 
131  if (i->end > j->start)
132  return true;
133  ++i;
134  }
135 
136  return false;
137 }
138 
139 bool LiveRange::overlaps(const LiveRange &Other, const CoalescerPair &CP,
140  const SlotIndexes &Indexes) const {
141  assert(!empty() && "empty range");
142  if (Other.empty())
143  return false;
144 
145  // Use binary searches to find initial positions.
146  const_iterator I = find(Other.beginIndex());
147  const_iterator IE = end();
148  if (I == IE)
149  return false;
150  const_iterator J = Other.find(I->start);
151  const_iterator JE = Other.end();
152  if (J == JE)
153  return false;
154 
155  for (;;) {
156  // J has just been advanced to satisfy:
157  assert(J->end >= I->start);
158  // Check for an overlap.
159  if (J->start < I->end) {
160  // I and J are overlapping. Find the later start.
161  SlotIndex Def = std::max(I->start, J->start);
162  // Allow the overlap if Def is a coalescable copy.
163  if (Def.isBlock() ||
164  !CP.isCoalescable(Indexes.getInstructionFromIndex(Def)))
165  return true;
166  }
167  // Advance the iterator that ends first to check for more overlaps.
168  if (J->end > I->end) {
169  std::swap(I, J);
170  std::swap(IE, JE);
171  }
172  // Advance J until J->end >= I->start.
173  do
174  if (++J == JE)
175  return false;
176  while (J->end < I->start);
177  }
178 }
179 
180 /// overlaps - Return true if the live range overlaps an interval specified
181 /// by [Start, End).
182 bool LiveRange::overlaps(SlotIndex Start, SlotIndex End) const {
183  assert(Start < End && "Invalid range");
184  const_iterator I = std::lower_bound(begin(), end(), End);
185  return I != begin() && (--I)->end > Start;
186 }
187 
188 
189 /// ValNo is dead, remove it. If it is the largest value number, just nuke it
190 /// (and any other deleted values neighboring it), otherwise mark it as ~1U so
191 /// it can be nuked later.
192 void LiveRange::markValNoForDeletion(VNInfo *ValNo) {
193  if (ValNo->id == getNumValNums()-1) {
194  do {
195  valnos.pop_back();
196  } while (!valnos.empty() && valnos.back()->isUnused());
197  } else {
198  ValNo->markUnused();
199  }
200 }
201 
202 /// RenumberValues - Renumber all values in order of appearance and delete the
203 /// remaining unused values.
206  valnos.clear();
207  for (const_iterator I = begin(), E = end(); I != E; ++I) {
208  VNInfo *VNI = I->valno;
209  if (!Seen.insert(VNI))
210  continue;
211  assert(!VNI->isUnused() && "Unused valno used by live segment");
212  VNI->id = (unsigned)valnos.size();
213  valnos.push_back(VNI);
214  }
215 }
216 
217 /// This method is used when we want to extend the segment specified by I to end
218 /// at the specified endpoint. To do this, we should merge and eliminate all
219 /// segments that this will overlap with. The iterator is not invalidated.
220 void LiveRange::extendSegmentEndTo(iterator I, SlotIndex NewEnd) {
221  assert(I != end() && "Not a valid segment!");
222  VNInfo *ValNo = I->valno;
223 
224  // Search for the first segment that we can't merge with.
225  iterator MergeTo = llvm::next(I);
226  for (; MergeTo != end() && NewEnd >= MergeTo->end; ++MergeTo) {
227  assert(MergeTo->valno == ValNo && "Cannot merge with differing values!");
228  }
229 
230  // If NewEnd was in the middle of a segment, make sure to get its endpoint.
231  I->end = std::max(NewEnd, prior(MergeTo)->end);
232 
233  // If the newly formed segment now touches the segment after it and if they
234  // have the same value number, merge the two segments into one segment.
235  if (MergeTo != end() && MergeTo->start <= I->end &&
236  MergeTo->valno == ValNo) {
237  I->end = MergeTo->end;
238  ++MergeTo;
239  }
240 
241  // Erase any dead segments.
242  segments.erase(llvm::next(I), MergeTo);
243 }
244 
245 
246 /// This method is used when we want to extend the segment specified by I to
247 /// start at the specified endpoint. To do this, we should merge and eliminate
248 /// all segments that this will overlap with.
250 LiveRange::extendSegmentStartTo(iterator I, SlotIndex NewStart) {
251  assert(I != end() && "Not a valid segment!");
252  VNInfo *ValNo = I->valno;
253 
254  // Search for the first segment that we can't merge with.
255  iterator MergeTo = I;
256  do {
257  if (MergeTo == begin()) {
258  I->start = NewStart;
259  segments.erase(MergeTo, I);
260  return I;
261  }
262  assert(MergeTo->valno == ValNo && "Cannot merge with differing values!");
263  --MergeTo;
264  } while (NewStart <= MergeTo->start);
265 
266  // If we start in the middle of another segment, just delete a range and
267  // extend that segment.
268  if (MergeTo->end >= NewStart && MergeTo->valno == ValNo) {
269  MergeTo->end = I->end;
270  } else {
271  // Otherwise, extend the segment right after.
272  ++MergeTo;
273  MergeTo->start = NewStart;
274  MergeTo->end = I->end;
275  }
276 
277  segments.erase(llvm::next(MergeTo), llvm::next(I));
278  return MergeTo;
279 }
280 
281 LiveRange::iterator LiveRange::addSegmentFrom(Segment S, iterator From) {
282  SlotIndex Start = S.start, End = S.end;
283  iterator it = std::upper_bound(From, end(), Start);
284 
285  // If the inserted segment starts in the middle or right at the end of
286  // another segment, just extend that segment to contain the segment of S.
287  if (it != begin()) {
288  iterator B = prior(it);
289  if (S.valno == B->valno) {
290  if (B->start <= Start && B->end >= Start) {
291  extendSegmentEndTo(B, End);
292  return B;
293  }
294  } else {
295  // Check to make sure that we are not overlapping two live segments with
296  // different valno's.
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?)");
300  }
301  }
302 
303  // Otherwise, if this segment ends in the middle of, or right next to, another
304  // segment, merge it into that segment.
305  if (it != end()) {
306  if (S.valno == it->valno) {
307  if (it->start <= End) {
308  it = extendSegmentStartTo(it, Start);
309 
310  // If S is a complete superset of a segment, we may need to grow its
311  // endpoint as well.
312  if (End > it->end)
313  extendSegmentEndTo(it, End);
314  return it;
315  }
316  } else {
317  // Check to make sure that we are not overlapping two live segments with
318  // different valno's.
319  assert(it->start >= End &&
320  "Cannot overlap two segments with differing ValID's");
321  }
322  }
323 
324  // Otherwise, this is just a new segment that doesn't interact with anything.
325  // Insert it.
326  return segments.insert(it, S);
327 }
328 
329 /// extendInBlock - If this range is live before Kill in the basic
330 /// block that starts at StartIdx, extend it to be live up to Kill and return
331 /// the value. If there is no live range before Kill, return NULL.
333  if (empty())
334  return 0;
335  iterator I = std::upper_bound(begin(), end(), Kill.getPrevSlot());
336  if (I == begin())
337  return 0;
338  --I;
339  if (I->end <= StartIdx)
340  return 0;
341  if (I->end < Kill)
342  extendSegmentEndTo(I, Kill);
343  return I->valno;
344 }
345 
346 /// Remove the specified segment from this range. Note that the segment must
347 /// be in a single Segment in its entirety.
349  bool RemoveDeadValNo) {
350  // Find the Segment containing this span.
351  iterator I = find(Start);
352  assert(I != end() && "Segment is not in range!");
353  assert(I->containsInterval(Start, End)
354  && "Segment is not entirely in range!");
355 
356  // If the span we are removing is at the start of the Segment, adjust it.
357  VNInfo *ValNo = I->valno;
358  if (I->start == Start) {
359  if (I->end == End) {
360  if (RemoveDeadValNo) {
361  // Check if val# is dead.
362  bool isDead = true;
363  for (const_iterator II = begin(), EE = end(); II != EE; ++II)
364  if (II != I && II->valno == ValNo) {
365  isDead = false;
366  break;
367  }
368  if (isDead) {
369  // Now that ValNo is dead, remove it.
370  markValNoForDeletion(ValNo);
371  }
372  }
373 
374  segments.erase(I); // Removed the whole Segment.
375  } else
376  I->start = End;
377  return;
378  }
379 
380  // Otherwise if the span we are removing is at the end of the Segment,
381  // adjust the other way.
382  if (I->end == End) {
383  I->end = Start;
384  return;
385  }
386 
387  // Otherwise, we are splitting the Segment into two pieces.
388  SlotIndex OldEnd = I->end;
389  I->end = Start; // Trim the old segment.
390 
391  // Insert the new one.
392  segments.insert(llvm::next(I), Segment(End, OldEnd, ValNo));
393 }
394 
395 /// removeValNo - Remove all the segments defined by the specified value#.
396 /// Also remove the value# from value# list.
398  if (empty()) return;
399  iterator I = end();
400  iterator E = begin();
401  do {
402  --I;
403  if (I->valno == ValNo)
404  segments.erase(I);
405  } while (I != E);
406  // Now that ValNo is dead, remove it.
407  markValNoForDeletion(ValNo);
408 }
409 
411  const int *LHSValNoAssignments,
412  const int *RHSValNoAssignments,
413  SmallVectorImpl<VNInfo *> &NewVNInfo) {
414  verify();
415 
416  // Determine if any of our values are mapped. This is uncommon, so we want
417  // to avoid the range scan if not.
418  bool MustMapCurValNos = false;
419  unsigned NumVals = getNumValNums();
420  unsigned NumNewVals = NewVNInfo.size();
421  for (unsigned i = 0; i != NumVals; ++i) {
422  unsigned LHSValID = LHSValNoAssignments[i];
423  if (i != LHSValID ||
424  (NewVNInfo[LHSValID] && NewVNInfo[LHSValID] != getValNumInfo(i))) {
425  MustMapCurValNos = true;
426  break;
427  }
428  }
429 
430  // If we have to apply a mapping to our base range assignment, rewrite it now.
431  if (MustMapCurValNos && !empty()) {
432  // Map the first live range.
433 
434  iterator OutIt = begin();
435  OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
436  for (iterator I = llvm::next(OutIt), E = end(); I != E; ++I) {
437  VNInfo* nextValNo = NewVNInfo[LHSValNoAssignments[I->valno->id]];
438  assert(nextValNo != 0 && "Huh?");
439 
440  // If this live range has the same value # as its immediate predecessor,
441  // and if they are neighbors, remove one Segment. This happens when we
442  // have [0,4:0)[4,7:1) and map 0/1 onto the same value #.
443  if (OutIt->valno == nextValNo && OutIt->end == I->start) {
444  OutIt->end = I->end;
445  } else {
446  // Didn't merge. Move OutIt to the next segment,
447  ++OutIt;
448  OutIt->valno = nextValNo;
449  if (OutIt != I) {
450  OutIt->start = I->start;
451  OutIt->end = I->end;
452  }
453  }
454  }
455  // If we merge some segments, chop off the end.
456  ++OutIt;
457  segments.erase(OutIt, end());
458  }
459 
460  // Rewrite Other values before changing the VNInfo ids.
461  // This can leave Other in an invalid state because we're not coalescing
462  // touching segments that now have identical values. That's OK since Other is
463  // not supposed to be valid after calling join();
464  for (iterator I = Other.begin(), E = Other.end(); I != E; ++I)
465  I->valno = NewVNInfo[RHSValNoAssignments[I->valno->id]];
466 
467  // Update val# info. Renumber them and make sure they all belong to this
468  // LiveRange now. Also remove dead val#'s.
469  unsigned NumValNos = 0;
470  for (unsigned i = 0; i < NumNewVals; ++i) {
471  VNInfo *VNI = NewVNInfo[i];
472  if (VNI) {
473  if (NumValNos >= NumVals)
474  valnos.push_back(VNI);
475  else
476  valnos[NumValNos] = VNI;
477  VNI->id = NumValNos++; // Renumber val#.
478  }
479  }
480  if (NumNewVals < NumVals)
481  valnos.resize(NumNewVals); // shrinkify
482 
483  // Okay, now insert the RHS live segments into the LHS.
484  LiveRangeUpdater Updater(this);
485  for (iterator I = Other.begin(), E = Other.end(); I != E; ++I)
486  Updater.add(*I);
487 }
488 
489 /// Merge all of the segments in RHS into this live range as the specified
490 /// value number. The segments in RHS are allowed to overlap with segments in
491 /// the current range, but only if the overlapping segments have the
492 /// specified value number.
494  VNInfo *LHSValNo) {
495  LiveRangeUpdater Updater(this);
496  for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I)
497  Updater.add(I->start, I->end, LHSValNo);
498 }
499 
500 /// MergeValueInAsValue - Merge all of the live segments of a specific val#
501 /// in RHS into this live range as the specified value number.
502 /// The segments in RHS are allowed to overlap with segments in the
503 /// current range, it will replace the value numbers of the overlaped
504 /// segments with the specified value number.
506  const VNInfo *RHSValNo,
507  VNInfo *LHSValNo) {
508  LiveRangeUpdater Updater(this);
509  for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I)
510  if (I->valno == RHSValNo)
511  Updater.add(I->start, I->end, LHSValNo);
512 }
513 
514 /// MergeValueNumberInto - This method is called when two value nubmers
515 /// are found to be equivalent. This eliminates V1, replacing all
516 /// segments with the V1 value number with the V2 value number. This can
517 /// cause merging of V1/V2 values numbers and compaction of the value space.
519  assert(V1 != V2 && "Identical value#'s are always equivalent!");
520 
521  // This code actually merges the (numerically) larger value number into the
522  // smaller value number, which is likely to allow us to compactify the value
523  // space. The only thing we have to be careful of is to preserve the
524  // instruction that defines the result value.
525 
526  // Make sure V2 is smaller than V1.
527  if (V1->id < V2->id) {
528  V1->copyFrom(*V2);
529  std::swap(V1, V2);
530  }
531 
532  // Merge V1 segments into V2.
533  for (iterator I = begin(); I != end(); ) {
534  iterator S = I++;
535  if (S->valno != V1) continue; // Not a V1 Segment.
536 
537  // Okay, we found a V1 live range. If it had a previous, touching, V2 live
538  // range, extend it.
539  if (S != begin()) {
540  iterator Prev = S-1;
541  if (Prev->valno == V2 && Prev->end == S->start) {
542  Prev->end = S->end;
543 
544  // Erase this live-range.
545  segments.erase(S);
546  I = Prev+1;
547  S = Prev;
548  }
549  }
550 
551  // Okay, now we have a V1 or V2 live range that is maximally merged forward.
552  // Ensure that it is a V2 live-range.
553  S->valno = V2;
554 
555  // If we can merge it into later V2 segments, do so now. We ignore any
556  // following V1 segments, as they will be merged in subsequent iterations
557  // of the loop.
558  if (I != end()) {
559  if (I->start == S->end && I->valno == V2) {
560  S->end = I->end;
561  segments.erase(I);
562  I = S+1;
563  }
564  }
565  }
566 
567  // Now that V1 is dead, remove it.
568  markValNoForDeletion(V1);
569 
570  return V2;
571 }
572 
573 unsigned LiveInterval::getSize() const {
574  unsigned Sum = 0;
575  for (const_iterator I = begin(), E = end(); I != E; ++I)
576  Sum += I->start.distance(I->end);
577  return Sum;
578 }
579 
581  return os << '[' << S.start << ',' << S.end << ':' << S.valno->id << ")";
582 }
583 
584 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
586  dbgs() << *this << "\n";
587 }
588 #endif
589 
590 void LiveRange::print(raw_ostream &OS) const {
591  if (empty())
592  OS << "EMPTY";
593  else {
594  for (const_iterator I = begin(), E = end(); I != E; ++I) {
595  OS << *I;
596  assert(I->valno == getValNumInfo(I->valno->id) && "Bad VNInfo");
597  }
598  }
599 
600  // Print value number info.
601  if (getNumValNums()) {
602  OS << " ";
603  unsigned vnum = 0;
604  for (const_vni_iterator i = vni_begin(), e = vni_end(); i != e;
605  ++i, ++vnum) {
606  const VNInfo *vni = *i;
607  if (vnum) OS << " ";
608  OS << vnum << "@";
609  if (vni->isUnused()) {
610  OS << "x";
611  } else {
612  OS << vni->def;
613  if (vni->isPHIDef())
614  OS << "-phi";
615  }
616  }
617  }
618 }
619 
621  OS << PrintReg(reg) << ' ';
622  super::print(OS);
623 }
624 
625 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
626 void LiveRange::dump() const {
627  dbgs() << *this << "\n";
628 }
629 
630 void LiveInterval::dump() const {
631  dbgs() << *this << "\n";
632 }
633 #endif
634 
635 #ifndef NDEBUG
636 void LiveRange::verify() const {
637  for (const_iterator I = begin(), E = end(); I != E; ++I) {
638  assert(I->start.isValid());
639  assert(I->end.isValid());
640  assert(I->start < I->end);
641  assert(I->valno != 0);
642  assert(I->valno->id < valnos.size());
643  assert(I->valno == valnos[I->valno->id]);
644  if (llvm::next(I) != E) {
645  assert(I->end <= llvm::next(I)->start);
646  if (I->end == llvm::next(I)->start)
647  assert(I->valno != llvm::next(I)->valno);
648  }
649  }
650 }
651 #endif
652 
653 
654 //===----------------------------------------------------------------------===//
655 // LiveRangeUpdater class
656 //===----------------------------------------------------------------------===//
657 //
658 // The LiveRangeUpdater class always maintains these invariants:
659 //
660 // - When LastStart is invalid, Spills is empty and the iterators are invalid.
661 // This is the initial state, and the state created by flush().
662 // In this state, isDirty() returns false.
663 //
664 // Otherwise, segments are kept in three separate areas:
665 //
666 // 1. [begin; WriteI) at the front of LR.
667 // 2. [ReadI; end) at the back of LR.
668 // 3. Spills.
669 //
670 // - LR.begin() <= WriteI <= ReadI <= LR.end().
671 // - Segments in all three areas are fully ordered and coalesced.
672 // - Segments in area 1 precede and can't coalesce with segments in area 2.
673 // - Segments in Spills precede and can't coalesce with segments in area 2.
674 // - No coalescing is possible between segments in Spills and segments in area
675 // 1, and there are no overlapping segments.
676 //
677 // The segments in Spills are not ordered with respect to the segments in area
678 // 1. They need to be merged.
679 //
680 // When they exist, Spills.back().start <= LastStart,
681 // and WriteI[-1].start <= LastStart.
682 
684  if (!isDirty()) {
685  if (LR)
686  OS << "Clean updater: " << *LR << '\n';
687  else
688  OS << "Null updater.\n";
689  return;
690  }
691  assert(LR && "Can't have null LR in dirty updater.");
692  OS << " updater with gap = " << (ReadI - WriteI)
693  << ", last start = " << LastStart
694  << ":\n Area 1:";
695  for (LiveRange::const_iterator I = LR->begin(); I != WriteI; ++I)
696  OS << ' ' << *I;
697  OS << "\n Spills:";
698  for (unsigned I = 0, E = Spills.size(); I != E; ++I)
699  OS << ' ' << Spills[I];
700  OS << "\n Area 2:";
701  for (LiveRange::const_iterator I = ReadI, E = LR->end(); I != E; ++I)
702  OS << ' ' << *I;
703  OS << '\n';
704 }
705 
707 {
708  print(errs());
709 }
710 
711 // Determine if A and B should be coalesced.
712 static inline bool coalescable(const LiveRange::Segment &A,
713  const LiveRange::Segment &B) {
714  assert(A.start <= B.start && "Unordered live segments.");
715  if (A.end == B.start)
716  return A.valno == B.valno;
717  if (A.end < B.start)
718  return false;
719  assert(A.valno == B.valno && "Cannot overlap different values");
720  return true;
721 }
722 
724  assert(LR && "Cannot add to a null destination");
725 
726  // Flush the state if Start moves backwards.
727  if (!LastStart.isValid() || LastStart > Seg.start) {
728  if (isDirty())
729  flush();
730  // This brings us to an uninitialized state. Reinitialize.
731  assert(Spills.empty() && "Leftover spilled segments");
732  WriteI = ReadI = LR->begin();
733  }
734 
735  // Remember start for next time.
736  LastStart = Seg.start;
737 
738  // Advance ReadI until it ends after Seg.start.
739  LiveRange::iterator E = LR->end();
740  if (ReadI != E && ReadI->end <= Seg.start) {
741  // First try to close the gap between WriteI and ReadI with spills.
742  if (ReadI != WriteI)
743  mergeSpills();
744  // Then advance ReadI.
745  if (ReadI == WriteI)
746  ReadI = WriteI = LR->find(Seg.start);
747  else
748  while (ReadI != E && ReadI->end <= Seg.start)
749  *WriteI++ = *ReadI++;
750  }
751 
752  assert(ReadI == E || ReadI->end > Seg.start);
753 
754  // Check if the ReadI segment begins early.
755  if (ReadI != E && ReadI->start <= Seg.start) {
756  assert(ReadI->valno == Seg.valno && "Cannot overlap different values");
757  // Bail if Seg is completely contained in ReadI.
758  if (ReadI->end >= Seg.end)
759  return;
760  // Coalesce into Seg.
761  Seg.start = ReadI->start;
762  ++ReadI;
763  }
764 
765  // Coalesce as much as possible from ReadI into Seg.
766  while (ReadI != E && coalescable(Seg, *ReadI)) {
767  Seg.end = std::max(Seg.end, ReadI->end);
768  ++ReadI;
769  }
770 
771  // Try coalescing Spills.back() into Seg.
772  if (!Spills.empty() && coalescable(Spills.back(), Seg)) {
773  Seg.start = Spills.back().start;
774  Seg.end = std::max(Spills.back().end, Seg.end);
775  Spills.pop_back();
776  }
777 
778  // Try coalescing Seg into WriteI[-1].
779  if (WriteI != LR->begin() && coalescable(WriteI[-1], Seg)) {
780  WriteI[-1].end = std::max(WriteI[-1].end, Seg.end);
781  return;
782  }
783 
784  // Seg doesn't coalesce with anything, and needs to be inserted somewhere.
785  if (WriteI != ReadI) {
786  *WriteI++ = Seg;
787  return;
788  }
789 
790  // Finally, append to LR or Spills.
791  if (WriteI == E) {
792  LR->segments.push_back(Seg);
793  WriteI = ReadI = LR->end();
794  } else
795  Spills.push_back(Seg);
796 }
797 
798 // Merge as many spilled segments as possible into the gap between WriteI
799 // and ReadI. Advance WriteI to reflect the inserted instructions.
800 void LiveRangeUpdater::mergeSpills() {
801  // Perform a backwards merge of Spills and [SpillI;WriteI).
802  size_t GapSize = ReadI - WriteI;
803  size_t NumMoved = std::min(Spills.size(), GapSize);
804  LiveRange::iterator Src = WriteI;
805  LiveRange::iterator Dst = Src + NumMoved;
806  LiveRange::iterator SpillSrc = Spills.end();
807  LiveRange::iterator B = LR->begin();
808 
809  // This is the new WriteI position after merging spills.
810  WriteI = Dst;
811 
812  // Now merge Src and Spills backwards.
813  while (Src != Dst) {
814  if (Src != B && Src[-1].start > SpillSrc[-1].start)
815  *--Dst = *--Src;
816  else
817  *--Dst = *--SpillSrc;
818  }
819  assert(NumMoved == size_t(Spills.end() - SpillSrc));
820  Spills.erase(SpillSrc, Spills.end());
821 }
822 
824  if (!isDirty())
825  return;
826  // Clear the dirty state.
827  LastStart = SlotIndex();
828 
829  assert(LR && "Cannot add to a null destination");
830 
831  // Nothing to merge?
832  if (Spills.empty()) {
833  LR->segments.erase(WriteI, ReadI);
834  LR->verify();
835  return;
836  }
837 
838  // Resize the WriteI - ReadI gap to match Spills.
839  size_t GapSize = ReadI - WriteI;
840  if (GapSize < Spills.size()) {
841  // The gap is too small. Make some room.
842  size_t WritePos = WriteI - LR->begin();
843  LR->segments.insert(ReadI, Spills.size() - GapSize, LiveRange::Segment());
844  // This also invalidated ReadI, but it is recomputed below.
845  WriteI = LR->begin() + WritePos;
846  } else {
847  // Shrink the gap if necessary.
848  LR->segments.erase(WriteI + Spills.size(), ReadI);
849  }
850  ReadI = WriteI + Spills.size();
851  mergeSpills();
852  LR->verify();
853 }
854 
856  // Create initial equivalence classes.
857  EqClass.clear();
858  EqClass.grow(LI->getNumValNums());
859 
860  const VNInfo *used = 0, *unused = 0;
861 
862  // Determine connections.
863  for (LiveInterval::const_vni_iterator I = LI->vni_begin(), E = LI->vni_end();
864  I != E; ++I) {
865  const VNInfo *VNI = *I;
866  // Group all unused values into one class.
867  if (VNI->isUnused()) {
868  if (unused)
869  EqClass.join(unused->id, VNI->id);
870  unused = VNI;
871  continue;
872  }
873  used = VNI;
874  if (VNI->isPHIDef()) {
875  const MachineBasicBlock *MBB = LIS.getMBBFromIndex(VNI->def);
876  assert(MBB && "Phi-def has no defining MBB");
877  // Connect to values live out of predecessors.
879  PE = MBB->pred_end(); PI != PE; ++PI)
880  if (const VNInfo *PVNI = LI->getVNInfoBefore(LIS.getMBBEndIdx(*PI)))
881  EqClass.join(VNI->id, PVNI->id);
882  } else {
883  // Normal value defined by an instruction. Check for two-addr redef.
884  // FIXME: This could be coincidental. Should we really check for a tied
885  // operand constraint?
886  // Note that VNI->def may be a use slot for an early clobber def.
887  if (const VNInfo *UVNI = LI->getVNInfoBefore(VNI->def))
888  EqClass.join(VNI->id, UVNI->id);
889  }
890  }
891 
892  // Lump all the unused values in with the last used value.
893  if (used && unused)
894  EqClass.join(used->id, unused->id);
895 
896  EqClass.compress();
897  return EqClass.getNumClasses();
898 }
899 
902  assert(LIV[0] && "LIV[0] must be set");
903  LiveInterval &LI = *LIV[0];
904 
905  // Rewrite instructions.
907  RE = MRI.reg_end(); RI != RE;) {
908  MachineOperand &MO = RI.getOperand();
909  MachineInstr *MI = MO.getParent();
910  ++RI;
911  // DBG_VALUE instructions don't have slot indexes, so get the index of the
912  // instruction before them.
913  // Normally, DBG_VALUE instructions are removed before this function is
914  // called, but it is not a requirement.
915  SlotIndex Idx;
916  if (MI->isDebugValue())
917  Idx = LIS.getSlotIndexes()->getIndexBefore(MI);
918  else
919  Idx = LIS.getInstructionIndex(MI);
920  LiveQueryResult LRQ = LI.Query(Idx);
921  const VNInfo *VNI = MO.readsReg() ? LRQ.valueIn() : LRQ.valueDefined();
922  // In the case of an <undef> use that isn't tied to any def, VNI will be
923  // NULL. If the use is tied to a def, VNI will be the defined value.
924  if (!VNI)
925  continue;
926  MO.setReg(LIV[getEqClass(VNI)]->reg);
927  }
928 
929  // Move runs to new intervals.
930  LiveInterval::iterator J = LI.begin(), E = LI.end();
931  while (J != E && EqClass[J->valno->id] == 0)
932  ++J;
933  for (LiveInterval::iterator I = J; I != E; ++I) {
934  if (unsigned eq = EqClass[I->valno->id]) {
935  assert((LIV[eq]->empty() || LIV[eq]->expiredAt(I->start)) &&
936  "New intervals should be empty");
937  LIV[eq]->segments.push_back(*I);
938  } else
939  *J++ = *I;
940  }
941  LI.segments.erase(J, E);
942 
943  // Transfer VNInfos to their new owners and renumber them.
944  unsigned j = 0, e = LI.getNumValNums();
945  while (j != e && EqClass[j] == 0)
946  ++j;
947  for (unsigned i = j; i != e; ++i) {
948  VNInfo *VNI = LI.getValNumInfo(i);
949  if (unsigned eq = EqClass[i]) {
950  VNI->id = LIV[eq]->getNumValNums();
951  LIV[eq]->valnos.push_back(VNI);
952  } else {
953  VNI->id = j;
954  LI.valnos[j++] = VNI;
955  }
956  }
957  LI.valnos.resize(j);
958 }
void add(LiveRange::Segment)
void push_back(const T &Elt)
Definition: SmallVector.h:236
raw_ostream & errs()
MachineInstr * getParent()
Segments::iterator iterator
Definition: LiveInterval.h:191
const unsigned reg
Definition: LiveInterval.h:532
SlotIndex def
The index of the defining instruction.
Definition: LiveInterval.h:52
static bool coalescable(const LiveRange::Segment &A, const LiveRange::Segment &B)
void MergeValueInAsValue(const LiveRange &RHS, const VNInfo *RHSValNo, VNInfo *LHSValNo)
vni_iterator vni_begin()
Definition: LiveInterval.h:200
void dump() const
bool insert(PtrType Ptr)
Definition: SmallPtrSet.h:253
iterator insert(iterator I, const T &Elt)
Definition: SmallVector.h:537
size_t size() const
Definition: LiveInterval.h:238
void markUnused()
Mark this value as unused.
Definition: LiveInterval.h:79
unsigned getNumValNums() const
Definition: LiveInterval.h:246
bool empty() const
Definition: LiveInterval.h:311
LoopInfoBase< BlockT, LoopT > * LI
Definition: LoopInfoImpl.h:411
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
Definition: SlotIndexes.h:212
iterator end()
Definition: LiveInterval.h:193
unsigned Classify(const LiveInterval *LI)
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
Definition: SlotIndexes.h:229
unsigned getSize() const
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
Definition: SlotIndexes.h:262
void print(raw_ostream &OS) const
bool isUnused() const
Returns true if this value is unused.
Definition: LiveInterval.h:76
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.
Definition: SlotIndexes.h:239
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
Definition: SmallVector.h:56
Segments segments
Definition: LiveInterval.h:188
VNInfo * MergeValueNumberInto(VNInfo *V1, VNInfo *V2)
bool expiredAt(SlotIndex index) const
Definition: LiveInterval.h:326
void copyFrom(VNInfo &src)
Copy from the parameter into this VNInfo.
Definition: LiveInterval.h:65
SlotIndex getPrevSlot() const
Definition: SlotIndexes.h:292
bool isDebugValue() const
Definition: MachineInstr.h:639
void removeValNo(VNInfo *ValNo)
LiveQueryResult Query(SlotIndex Idx) const
Definition: LiveInterval.h:441
bool overlaps(const LiveRange &other) const
Definition: LiveInterval.h:377
ItTy next(ItTy it, Dist n)
Definition: STLExtras.h:154
VNInfo * valueDefined() const
Definition: LiveInterval.h:124
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)
Definition: SmallVector.h:478
bool isPHIDef() const
Definition: LiveInterval.h:73
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Definition: SlotIndexes.h:423
std::vector< MachineBasicBlock * >::const_iterator const_pred_iterator
iterator find(SlotIndex Pos)
unsigned id
The ID number of this value.
Definition: LiveInterval.h:49
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.
Definition: SlotIndexes.h:206
bool isCoalescable(const MachineInstr *) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:591
VNInfoList valnos
Definition: LiveInterval.h:189
VNInfo * getValNumInfo(unsigned ValNo)
Definition: LiveInterval.h:250
SlotIndex beginIndex() const
beginIndex - Return the lowest numbered slot covered.
Definition: LiveInterval.h:314
void print(raw_ostream &OS) const
void print(raw_ostream &) const
VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
SlotIndex endIndex() const
Definition: LiveInterval.h:321
void setReg(unsigned Reg)
#define I(x, y, z)
Definition: MD5.cpp:54
void resize(unsigned N)
Definition: SmallVector.h:401
VNInfo * extendInBlock(SlotIndex StartIdx, SlotIndex Kill)
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
Definition: APInt.h:1688
iterator begin()
Definition: LiveInterval.h:192
VNInfo * getNextValue(SlotIndex def, VNInfo::Allocator &VNInfoAllocator)
Definition: LiveInterval.h:264
ItTy prior(ItTy it, Dist n)
Definition: STLExtras.h:167
void join(LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
reg_iterator reg_begin(unsigned RegNo) const
const MCRegisterInfo & MRI
bool readsReg() const
VNInfo * valueIn() const
Definition: LiveInterval.h:100
void dump() const
static reg_iterator reg_end()
SlotIndex - An opaque wrapper around machine indexes.
Definition: SlotIndexes.h:92
bool overlapsFrom(const LiveRange &Other, const_iterator I) const
vni_iterator vni_end()
Definition: LiveInterval.h:201
VNInfo * getVNInfoBefore(SlotIndex Idx) const
Definition: LiveInterval.h:358