LiveInterval.cpp revision d4e4937b79a7da789379a09117cc74f20cd60623
1//===-- LiveInterval.cpp - Live Interval Representation -------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source 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 interval for register v if there is no instruction with number j' > j
13// such that v is live at j' abd there is no instruction with number i' < i such
14// that v is live at i'. In this implementation intervals can have holes,
15// i.e. an interval might look like [1,20), [50,65), [1000,1001).  Each
16// individual range is represented as an instance of LiveRange, and the whole
17// interval is represented as an instance of LiveInterval.
18//
19//===----------------------------------------------------------------------===//
20
21#include "llvm/CodeGen/LiveInterval.h"
22#include "llvm/ADT/STLExtras.h"
23#include "llvm/Support/Streams.h"
24#include "llvm/Target/MRegisterInfo.h"
25#include <algorithm>
26#include <map>
27#include <ostream>
28using namespace llvm;
29
30// An example for liveAt():
31//
32// this = [1,4), liveAt(0) will return false. The instruction defining this
33// spans slots [0,3]. The interval belongs to an spilled definition of the
34// variable it represents. This is because slot 1 is used (def slot) and spans
35// up to slot 3 (store slot).
36//
37bool LiveInterval::liveAt(unsigned I) const {
38  Ranges::const_iterator r = std::upper_bound(ranges.begin(), ranges.end(), I);
39
40  if (r == ranges.begin())
41    return false;
42
43  --r;
44  return r->contains(I);
45}
46
47// overlaps - Return true if the intersection of the two live intervals is
48// not empty.
49//
50// An example for overlaps():
51//
52// 0: A = ...
53// 4: B = ...
54// 8: C = A + B ;; last use of A
55//
56// The live intervals should look like:
57//
58// A = [3, 11)
59// B = [7, x)
60// C = [11, y)
61//
62// A->overlaps(C) should return false since we want to be able to join
63// A and C.
64//
65bool LiveInterval::overlapsFrom(const LiveInterval& other,
66                                const_iterator StartPos) const {
67  const_iterator i = begin();
68  const_iterator ie = end();
69  const_iterator j = StartPos;
70  const_iterator je = other.end();
71
72  assert((StartPos->start <= i->start || StartPos == other.begin()) &&
73         StartPos != other.end() && "Bogus start position hint!");
74
75  if (i->start < j->start) {
76    i = std::upper_bound(i, ie, j->start);
77    if (i != ranges.begin()) --i;
78  } else if (j->start < i->start) {
79    ++StartPos;
80    if (StartPos != other.end() && StartPos->start <= i->start) {
81      assert(StartPos < other.end() && i < end());
82      j = std::upper_bound(j, je, i->start);
83      if (j != other.ranges.begin()) --j;
84    }
85  } else {
86    return true;
87  }
88
89  if (j == je) return false;
90
91  while (i != ie) {
92    if (i->start > j->start) {
93      std::swap(i, j);
94      std::swap(ie, je);
95    }
96
97    if (i->end > j->start)
98      return true;
99    ++i;
100  }
101
102  return false;
103}
104
105/// extendIntervalEndTo - This method is used when we want to extend the range
106/// specified by I to end at the specified endpoint.  To do this, we should
107/// merge and eliminate all ranges that this will overlap with.  The iterator is
108/// not invalidated.
109void LiveInterval::extendIntervalEndTo(Ranges::iterator I, unsigned NewEnd) {
110  assert(I != ranges.end() && "Not a valid interval!");
111  VNInfo *ValNo = I->valno;
112  unsigned OldEnd = I->end;
113
114  // Search for the first interval that we can't merge with.
115  Ranges::iterator MergeTo = next(I);
116  for (; MergeTo != ranges.end() && NewEnd >= MergeTo->end; ++MergeTo) {
117    assert(MergeTo->valno == ValNo && "Cannot merge with differing values!");
118  }
119
120  // If NewEnd was in the middle of an interval, make sure to get its endpoint.
121  I->end = std::max(NewEnd, prior(MergeTo)->end);
122
123  // Erase any dead ranges.
124  ranges.erase(next(I), MergeTo);
125
126  // Update kill info.
127  removeKills(*ValNo, OldEnd, I->end-1);
128
129  // If the newly formed range now touches the range after it and if they have
130  // the same value number, merge the two ranges into one range.
131  Ranges::iterator Next = next(I);
132  if (Next != ranges.end() && Next->start <= I->end && Next->valno == ValNo) {
133    I->end = Next->end;
134    ranges.erase(Next);
135  }
136}
137
138
139/// extendIntervalStartTo - This method is used when we want to extend the range
140/// specified by I to start at the specified endpoint.  To do this, we should
141/// merge and eliminate all ranges that this will overlap with.
142LiveInterval::Ranges::iterator
143LiveInterval::extendIntervalStartTo(Ranges::iterator I, unsigned NewStart) {
144  assert(I != ranges.end() && "Not a valid interval!");
145  VNInfo *ValNo = I->valno;
146
147  // Search for the first interval that we can't merge with.
148  Ranges::iterator MergeTo = I;
149  do {
150    if (MergeTo == ranges.begin()) {
151      I->start = NewStart;
152      ranges.erase(MergeTo, I);
153      return I;
154    }
155    assert(MergeTo->valno == ValNo && "Cannot merge with differing values!");
156    --MergeTo;
157  } while (NewStart <= MergeTo->start);
158
159  // If we start in the middle of another interval, just delete a range and
160  // extend that interval.
161  if (MergeTo->end >= NewStart && MergeTo->valno == ValNo) {
162    MergeTo->end = I->end;
163  } else {
164    // Otherwise, extend the interval right after.
165    ++MergeTo;
166    MergeTo->start = NewStart;
167    MergeTo->end = I->end;
168  }
169
170  ranges.erase(next(MergeTo), next(I));
171  return MergeTo;
172}
173
174LiveInterval::iterator
175LiveInterval::addRangeFrom(LiveRange LR, iterator From) {
176  unsigned Start = LR.start, End = LR.end;
177  iterator it = std::upper_bound(From, ranges.end(), Start);
178
179  // If the inserted interval starts in the middle or right at the end of
180  // another interval, just extend that interval to contain the range of LR.
181  if (it != ranges.begin()) {
182    iterator B = prior(it);
183    if (LR.valno == B->valno) {
184      if (B->start <= Start && B->end >= Start) {
185        extendIntervalEndTo(B, End);
186        return B;
187      }
188    } else {
189      // Check to make sure that we are not overlapping two live ranges with
190      // different valno's.
191      assert(B->end <= Start &&
192             "Cannot overlap two LiveRanges with differing ValID's"
193             " (did you def the same reg twice in a MachineInstr?)");
194    }
195  }
196
197  // Otherwise, if this range ends in the middle of, or right next to, another
198  // interval, merge it into that interval.
199  if (it != ranges.end())
200    if (LR.valno == it->valno) {
201      if (it->start <= End) {
202        it = extendIntervalStartTo(it, Start);
203
204        // If LR is a complete superset of an interval, we may need to grow its
205        // endpoint as well.
206        if (End > it->end)
207          extendIntervalEndTo(it, End);
208        return it;
209      }
210    } else {
211      // Check to make sure that we are not overlapping two live ranges with
212      // different valno's.
213      assert(it->start >= End &&
214             "Cannot overlap two LiveRanges with differing ValID's");
215    }
216
217  // Otherwise, this is just a new range that doesn't interact with anything.
218  // Insert it.
219  return ranges.insert(it, LR);
220}
221
222
223/// removeRange - Remove the specified range from this interval.  Note that
224/// the range must already be in this interval in its entirety.
225void LiveInterval::removeRange(unsigned Start, unsigned End) {
226  // Find the LiveRange containing this span.
227  Ranges::iterator I = std::upper_bound(ranges.begin(), ranges.end(), Start);
228  assert(I != ranges.begin() && "Range is not in interval!");
229  --I;
230  assert(I->contains(Start) && I->contains(End-1) &&
231         "Range is not entirely in interval!");
232
233  // If the span we are removing is at the start of the LiveRange, adjust it.
234  if (I->start == Start) {
235    if (I->end == End) {
236      removeKills(*I->valno, Start, End);
237      ranges.erase(I);  // Removed the whole LiveRange.
238    } else
239      I->start = End;
240    return;
241  }
242
243  // Otherwise if the span we are removing is at the end of the LiveRange,
244  // adjust the other way.
245  if (I->end == End) {
246    removeKills(*I->valno, Start, End);
247    I->end = Start;
248    return;
249  }
250
251  // Otherwise, we are splitting the LiveRange into two pieces.
252  unsigned OldEnd = I->end;
253  I->end = Start;   // Trim the old interval.
254
255  // Insert the new one.
256  ranges.insert(next(I), LiveRange(End, OldEnd, I->valno));
257}
258
259/// getLiveRangeContaining - Return the live range that contains the
260/// specified index, or null if there is none.
261LiveInterval::const_iterator
262LiveInterval::FindLiveRangeContaining(unsigned Idx) const {
263  const_iterator It = std::upper_bound(begin(), end(), Idx);
264  if (It != ranges.begin()) {
265    --It;
266    if (It->contains(Idx))
267      return It;
268  }
269
270  return end();
271}
272
273LiveInterval::iterator
274LiveInterval::FindLiveRangeContaining(unsigned Idx) {
275  iterator It = std::upper_bound(begin(), end(), Idx);
276  if (It != begin()) {
277    --It;
278    if (It->contains(Idx))
279      return It;
280  }
281
282  return end();
283}
284
285/// join - Join two live intervals (this, and other) together.  This applies
286/// mappings to the value numbers in the LHS/RHS intervals as specified.  If
287/// the intervals are not joinable, this aborts.
288void LiveInterval::join(LiveInterval &Other, int *LHSValNoAssignments,
289                        int *RHSValNoAssignments,
290                        SmallVector<VNInfo*, 16> &NewVNInfo) {
291
292  // There might be some dead val#, create VNInfo for them.
293  for (unsigned i = 0, e = NewVNInfo.size(); i != e; ++i) {
294    VNInfo *VNI = NewVNInfo[i];
295    if (!VNI) {
296      VNI = new VNInfo(this, i, ~1U, 0);
297      NewVNInfo[i] = VNI;
298    }
299  }
300
301  // Determine if any of our live range values are mapped.  This is uncommon, so
302  // we want to avoid the interval scan if not.
303  bool MustMapCurValNos = false;
304  for (vni_iterator i = vni_begin(), e = vni_end(); i != e; ++i) {
305    VNInfo *VNI = *i;
306    unsigned VN = VNI->id;
307    if (VNI->def == ~1U) continue;  // tombstone value #
308    if (VNI != NewVNInfo[LHSValNoAssignments[VN]]) {
309      MustMapCurValNos = true;
310      break;
311    }
312  }
313
314  // If we have to apply a mapping to our base interval assignment, rewrite it
315  // now.
316  if (MustMapCurValNos) {
317    // Map the first live range.
318    iterator OutIt = begin();
319    OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
320    ++OutIt;
321    for (iterator I = OutIt, E = end(); I != E; ++I) {
322      OutIt->valno = NewVNInfo[LHSValNoAssignments[I->valno->id]];
323
324      // If this live range has the same value # as its immediate predecessor,
325      // and if they are neighbors, remove one LiveRange.  This happens when we
326      // have [0,3:0)[4,7:1) and map 0/1 onto the same value #.
327      if (OutIt->valno == (OutIt-1)->valno && (OutIt-1)->end == OutIt->start) {
328        (OutIt-1)->end = OutIt->end;
329      } else {
330        if (I != OutIt) {
331          OutIt->start = I->start;
332          OutIt->end = I->end;
333        }
334
335        // Didn't merge, on to the next one.
336        ++OutIt;
337      }
338    }
339
340    // If we merge some live ranges, chop off the end.
341    ranges.erase(OutIt, end());
342  }
343
344  // Remember assignements because val# ids are changing.
345  std::vector<unsigned> OtherAssignments;
346  for (iterator I = Other.begin(), E = Other.end(); I != E; ++I)
347    OtherAssignments.push_back(RHSValNoAssignments[I->valno->id]);
348
349  // Update val# info. Renumber them and make sure they all belong to this
350  // LiveInterval now.
351  valnos.clear();
352  for (unsigned i = 0, e = NewVNInfo.size(); i != e; ++i) {
353    VNInfo *VNI = NewVNInfo[i];
354    VNI->parent = this;
355    VNI->id = i;  // Renumber val#.
356    valnos.push_back(VNI);
357  }
358
359  // Okay, now insert the RHS live ranges into the LHS.
360  iterator InsertPos = begin();
361  unsigned RangeNo = 0;
362  for (iterator I = Other.begin(), E = Other.end(); I != E; ++I, ++RangeNo) {
363    // Map the valno in the other live range to the current live range.
364    I->valno = NewVNInfo[OtherAssignments[RangeNo]];
365    InsertPos = addRangeFrom(*I, InsertPos);
366  }
367
368  weight += Other.weight;
369  if (Other.preference && !preference)
370    preference = Other.preference;
371}
372
373/// MergeRangesInAsValue - Merge all of the intervals in RHS into this live
374/// interval as the specified value number.  The LiveRanges in RHS are
375/// allowed to overlap with LiveRanges in the current interval, but only if
376/// the overlapping LiveRanges have the specified value number.
377void LiveInterval::MergeRangesInAsValue(const LiveInterval &RHS,
378                                        VNInfo *LHSValNo) {
379  // TODO: Make this more efficient.
380  iterator InsertPos = begin();
381  for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I) {
382    // Map the valno in the other live range to the current live range.
383    LiveRange Tmp = *I;
384    Tmp.valno = LHSValNo;
385    InsertPos = addRangeFrom(Tmp, InsertPos);
386  }
387}
388
389
390/// MergeInClobberRanges - For any live ranges that are not defined in the
391/// current interval, but are defined in the Clobbers interval, mark them
392/// used with an unknown definition value.
393void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers) {
394  if (Clobbers.begin() == Clobbers.end()) return;
395
396  // Find a value # to use for the clobber ranges.  If there is already a value#
397  // for unknown values, use it.
398  // FIXME: Use a single sentinal number for these!
399  VNInfo *ClobberValNo = getNextValue(~0U, 0);
400
401  iterator IP = begin();
402  for (const_iterator I = Clobbers.begin(), E = Clobbers.end(); I != E; ++I) {
403    unsigned Start = I->start, End = I->end;
404    IP = std::upper_bound(IP, end(), Start);
405
406    // If the start of this range overlaps with an existing liverange, trim it.
407    if (IP != begin() && IP[-1].end > Start) {
408      Start = IP[-1].end;
409      // Trimmed away the whole range?
410      if (Start >= End) continue;
411    }
412    // If the end of this range overlaps with an existing liverange, trim it.
413    if (IP != end() && End > IP->start) {
414      End = IP->start;
415      // If this trimmed away the whole range, ignore it.
416      if (Start == End) continue;
417    }
418
419    // Insert the clobber interval.
420    IP = addRangeFrom(LiveRange(Start, End, ClobberValNo), IP);
421  }
422}
423
424/// MergeValueNumberInto - This method is called when two value nubmers
425/// are found to be equivalent.  This eliminates V1, replacing all
426/// LiveRanges with the V1 value number with the V2 value number.  This can
427/// cause merging of V1/V2 values numbers and compaction of the value space.
428void LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
429  assert(V1 != V2 && "Identical value#'s are always equivalent!");
430
431  // This code actually merges the (numerically) larger value number into the
432  // smaller value number, which is likely to allow us to compactify the value
433  // space.  The only thing we have to be careful of is to preserve the
434  // instruction that defines the result value.
435
436  // Make sure V2 is smaller than V1.
437  if (V1->id < V2->id) {
438    copyValNumInfo(*V1, *V2);
439    std::swap(V1, V2);
440  }
441
442  // Merge V1 live ranges into V2.
443  for (iterator I = begin(); I != end(); ) {
444    iterator LR = I++;
445    if (LR->valno != V1) continue;  // Not a V1 LiveRange.
446
447    // Okay, we found a V1 live range.  If it had a previous, touching, V2 live
448    // range, extend it.
449    if (LR != begin()) {
450      iterator Prev = LR-1;
451      if (Prev->valno == V2 && Prev->end == LR->start) {
452        Prev->end = LR->end;
453
454        // Erase this live-range.
455        ranges.erase(LR);
456        I = Prev+1;
457        LR = Prev;
458      }
459    }
460
461    // Okay, now we have a V1 or V2 live range that is maximally merged forward.
462    // Ensure that it is a V2 live-range.
463    LR->valno = V2;
464
465    // If we can merge it into later V2 live ranges, do so now.  We ignore any
466    // following V1 live ranges, as they will be merged in subsequent iterations
467    // of the loop.
468    if (I != end()) {
469      if (I->start == LR->end && I->valno == V2) {
470        LR->end = I->end;
471        ranges.erase(I);
472        I = LR+1;
473      }
474    }
475  }
476
477  // Now that V1 is dead, remove it.  If it is the largest value number, just
478  // nuke it (and any other deleted values neighboring it), otherwise mark it as
479  // ~1U so it can be nuked later.
480  if (V1->id == getNumValNums()-1) {
481    do {
482      VNInfo *VNI = valnos.back();
483      valnos.pop_back();
484      delete VNI;
485    } while (valnos.back()->def == ~1U);
486  } else {
487    V1->def = ~1U;
488  }
489}
490
491unsigned LiveInterval::getSize() const {
492  unsigned Sum = 0;
493  for (const_iterator I = begin(), E = end(); I != E; ++I)
494    Sum += I->end - I->start;
495  return Sum;
496}
497
498std::ostream& llvm::operator<<(std::ostream& os, const LiveRange &LR) {
499  return os << '[' << LR.start << ',' << LR.end << ':' << LR.valno->id << ")";
500}
501
502void LiveRange::dump() const {
503  cerr << *this << "\n";
504}
505
506void LiveInterval::print(std::ostream &OS, const MRegisterInfo *MRI) const {
507  if (MRI && MRegisterInfo::isPhysicalRegister(reg))
508    OS << MRI->getName(reg);
509  else
510    OS << "%reg" << reg;
511
512  OS << ',' << weight;
513
514  if (empty())
515    OS << "EMPTY";
516  else {
517    OS << " = ";
518    for (LiveInterval::Ranges::const_iterator I = ranges.begin(),
519           E = ranges.end(); I != E; ++I)
520    OS << *I;
521  }
522
523  // Print value number info.
524  if (getNumValNums()) {
525    OS << "  ";
526    unsigned vnum = 0;
527    for (const_vni_iterator i = vni_begin(), e = vni_end(); i != e;
528         ++i, ++vnum) {
529      const VNInfo *vni = *i;
530      if (vnum) OS << " ";
531      OS << vnum << "@";
532      if (vni->def == ~1U) {
533        OS << "x";
534      } else {
535        if (vni->def == ~0U)
536          OS << "?";
537        else
538          OS << vni->def;
539        unsigned ee = vni->kills.size();
540        if (ee) {
541          OS << "-(";
542          for (unsigned j = 0; j != ee; ++j) {
543            OS << vni->kills[j];
544            if (j != ee-1)
545              OS << " ";
546          }
547          OS << ")";
548        }
549      }
550    }
551  }
552}
553
554void LiveInterval::dump() const {
555  cerr << *this << "\n";
556}
557
558
559void LiveRange::print(std::ostream &os) const {
560  os << *this;
561}
562