Unbreak the MSVC build, that next() thing again.
[oota-llvm.git] / include / llvm / CodeGen / SlotIndexes.h
1 //===- llvm/CodeGen/SlotIndexes.h - Slot indexes representation -*- C++ -*-===//
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 SlotIndex and related classes. The purpose of SlotIndex
11 // is to describe a position at which a register can become live, or cease to
12 // be live.
13 //
14 // SlotIndex is mostly a proxy for entries of the SlotIndexList, a class which
15 // is held is LiveIntervals and provides the real numbering. This allows
16 // LiveIntervals to perform largely transparent renumbering.
17 //===----------------------------------------------------------------------===//
18
19 #ifndef LLVM_CODEGEN_SLOTINDEXES_H
20 #define LLVM_CODEGEN_SLOTINDEXES_H
21
22 #include "llvm/CodeGen/MachineInstrBundle.h"
23 #include "llvm/CodeGen/MachineFunction.h"
24 #include "llvm/CodeGen/MachineFunctionPass.h"
25 #include "llvm/ADT/PointerIntPair.h"
26 #include "llvm/ADT/ilist.h"
27 #include "llvm/ADT/SmallVector.h"
28 #include "llvm/ADT/DenseMap.h"
29 #include "llvm/Support/Allocator.h"
30
31 namespace llvm {
32
33   /// This class represents an entry in the slot index list held in the
34   /// SlotIndexes pass. It should not be used directly. See the
35   /// SlotIndex & SlotIndexes classes for the public interface to this
36   /// information.
37   class IndexListEntry : public ilist_node<IndexListEntry> {
38     MachineInstr *mi;
39     unsigned index;
40
41   public:
42
43     IndexListEntry(MachineInstr *mi, unsigned index) : mi(mi), index(index) {}
44
45     MachineInstr* getInstr() const { return mi; }
46     void setInstr(MachineInstr *mi) {
47       this->mi = mi;
48     }
49
50     unsigned getIndex() const { return index; }
51     void setIndex(unsigned index) {
52       this->index = index;
53     }
54
55   };
56
57   template <>
58   struct ilist_traits<IndexListEntry> : public ilist_default_traits<IndexListEntry> {
59   private:
60     mutable ilist_half_node<IndexListEntry> Sentinel;
61   public:
62     IndexListEntry *createSentinel() const {
63       return static_cast<IndexListEntry*>(&Sentinel);
64     }
65     void destroySentinel(IndexListEntry *) const {}
66
67     IndexListEntry *provideInitialHead() const { return createSentinel(); }
68     IndexListEntry *ensureHead(IndexListEntry*) const { return createSentinel(); }
69     static void noteHead(IndexListEntry*, IndexListEntry*) {}
70     void deleteNode(IndexListEntry *N) {}
71
72   private:
73     void createNode(const IndexListEntry &);
74   };
75
76   // Specialize PointerLikeTypeTraits for IndexListEntry.
77   template <>
78   class PointerLikeTypeTraits<IndexListEntry*> {
79   public:
80     static inline void* getAsVoidPointer(IndexListEntry *p) {
81       return p;
82     }
83     static inline IndexListEntry* getFromVoidPointer(void *p) {
84       return static_cast<IndexListEntry*>(p);
85     }
86     enum { NumLowBitsAvailable = 3 };
87   };
88
89   /// SlotIndex - An opaque wrapper around machine indexes.
90   class SlotIndex {
91     friend class SlotIndexes;
92     friend struct DenseMapInfo<SlotIndex>;
93
94     enum Slot {
95       /// Basic block boundary.  Used for live ranges entering and leaving a
96       /// block without being live in the layout neighbor.  Also used as the
97       /// def slot of PHI-defs.
98       Slot_Block,
99
100       /// Early-clobber register use/def slot.  A live range defined at
101       /// Slot_EarlyCLobber interferes with normal live ranges killed at
102       /// Slot_Register.  Also used as the kill slot for live ranges tied to an
103       /// early-clobber def.
104       Slot_EarlyClobber,
105
106       /// Normal register use/def slot.  Normal instructions kill and define
107       /// register live ranges at this slot.
108       Slot_Register,
109
110       /// Dead def kill point.  Kill slot for a live range that is defined by
111       /// the same instruction (Slot_Register or Slot_EarlyClobber), but isn't
112       /// used anywhere.
113       Slot_Dead,
114
115       Slot_Count
116     };
117
118     PointerIntPair<IndexListEntry*, 2, unsigned> lie;
119
120     SlotIndex(IndexListEntry *entry, unsigned slot)
121       : lie(entry, slot) {}
122
123     IndexListEntry* listEntry() const {
124       assert(isValid() && "Attempt to compare reserved index.");
125       return lie.getPointer();
126     }
127
128     int getIndex() const {
129       return listEntry()->getIndex() | getSlot();
130     }
131
132     /// Returns the slot for this SlotIndex.
133     Slot getSlot() const {
134       return static_cast<Slot>(lie.getInt());
135     }
136
137     static inline unsigned getHashValue(const SlotIndex &v) {
138       void *ptrVal = v.lie.getOpaqueValue();
139       return (unsigned((intptr_t)ptrVal)) ^ (unsigned((intptr_t)ptrVal) >> 9);
140     }
141
142   public:
143     enum {
144       /// The default distance between instructions as returned by distance().
145       /// This may vary as instructions are inserted and removed.
146       InstrDist = 4 * Slot_Count
147     };
148
149     static inline SlotIndex getEmptyKey() {
150       return SlotIndex(0, 1);
151     }
152
153     static inline SlotIndex getTombstoneKey() {
154       return SlotIndex(0, 2);
155     }
156
157     /// Construct an invalid index.
158     SlotIndex() : lie(0, 0) {}
159
160     // Construct a new slot index from the given one, and set the slot.
161     SlotIndex(const SlotIndex &li, Slot s) : lie(li.listEntry(), unsigned(s)) {
162       assert(lie.getPointer() != 0 &&
163              "Attempt to construct index with 0 pointer.");
164     }
165
166     /// Returns true if this is a valid index. Invalid indicies do
167     /// not point into an index table, and cannot be compared.
168     bool isValid() const {
169       return lie.getPointer();
170     }
171
172     /// Return true for a valid index.
173     operator bool() const { return isValid(); }
174
175     /// Print this index to the given raw_ostream.
176     void print(raw_ostream &os) const;
177
178     /// Dump this index to stderr.
179     void dump() const;
180
181     /// Compare two SlotIndex objects for equality.
182     bool operator==(SlotIndex other) const {
183       return lie == other.lie;
184     }
185     /// Compare two SlotIndex objects for inequality.
186     bool operator!=(SlotIndex other) const {
187       return lie != other.lie;
188     }
189
190     /// Compare two SlotIndex objects. Return true if the first index
191     /// is strictly lower than the second.
192     bool operator<(SlotIndex other) const {
193       return getIndex() < other.getIndex();
194     }
195     /// Compare two SlotIndex objects. Return true if the first index
196     /// is lower than, or equal to, the second.
197     bool operator<=(SlotIndex other) const {
198       return getIndex() <= other.getIndex();
199     }
200
201     /// Compare two SlotIndex objects. Return true if the first index
202     /// is greater than the second.
203     bool operator>(SlotIndex other) const {
204       return getIndex() > other.getIndex();
205     }
206
207     /// Compare two SlotIndex objects. Return true if the first index
208     /// is greater than, or equal to, the second.
209     bool operator>=(SlotIndex other) const {
210       return getIndex() >= other.getIndex();
211     }
212
213     /// isSameInstr - Return true if A and B refer to the same instruction.
214     static bool isSameInstr(SlotIndex A, SlotIndex B) {
215       return A.lie.getPointer() == B.lie.getPointer();
216     }
217
218     /// isEarlierInstr - Return true if A refers to an instruction earlier than
219     /// B. This is equivalent to A < B && !isSameInstr(A, B).
220     static bool isEarlierInstr(SlotIndex A, SlotIndex B) {
221       return A.listEntry()->getIndex() < B.listEntry()->getIndex();
222     }
223
224     /// Return the distance from this index to the given one.
225     int distance(SlotIndex other) const {
226       return other.getIndex() - getIndex();
227     }
228
229     /// isBlock - Returns true if this is a block boundary slot.
230     bool isBlock() const { return getSlot() == Slot_Block; }
231
232     /// isEarlyClobber - Returns true if this is an early-clobber slot.
233     bool isEarlyClobber() const { return getSlot() == Slot_EarlyClobber; }
234
235     /// isRegister - Returns true if this is a normal register use/def slot.
236     /// Note that early-clobber slots may also be used for uses and defs.
237     bool isRegister() const { return getSlot() == Slot_Register; }
238
239     /// isDead - Returns true if this is a dead def kill slot.
240     bool isDead() const { return getSlot() == Slot_Dead; }
241
242     /// Returns the base index for associated with this index. The base index
243     /// is the one associated with the Slot_Block slot for the instruction
244     /// pointed to by this index.
245     SlotIndex getBaseIndex() const {
246       return SlotIndex(listEntry(), Slot_Block);
247     }
248
249     /// Returns the boundary index for associated with this index. The boundary
250     /// index is the one associated with the Slot_Block slot for the instruction
251     /// pointed to by this index.
252     SlotIndex getBoundaryIndex() const {
253       return SlotIndex(listEntry(), Slot_Dead);
254     }
255
256     /// Returns the register use/def slot in the current instruction for a
257     /// normal or early-clobber def.
258     SlotIndex getRegSlot(bool EC = false) const {
259       return SlotIndex(listEntry(), EC ? Slot_EarlyClobber : Slot_Register);
260     }
261
262     /// Returns the dead def kill slot for the current instruction.
263     SlotIndex getDeadSlot() const {
264       return SlotIndex(listEntry(), Slot_Dead);
265     }
266
267     /// Returns the next slot in the index list. This could be either the
268     /// next slot for the instruction pointed to by this index or, if this
269     /// index is a STORE, the first slot for the next instruction.
270     /// WARNING: This method is considerably more expensive than the methods
271     /// that return specific slots (getUseIndex(), etc). If you can - please
272     /// use one of those methods.
273     SlotIndex getNextSlot() const {
274       Slot s = getSlot();
275       if (s == Slot_Dead) {
276         return SlotIndex(listEntry()->getNextNode(), Slot_Block);
277       }
278       return SlotIndex(listEntry(), s + 1);
279     }
280
281     /// Returns the next index. This is the index corresponding to the this
282     /// index's slot, but for the next instruction.
283     SlotIndex getNextIndex() const {
284       return SlotIndex(listEntry()->getNextNode(), getSlot());
285     }
286
287     /// Returns the previous slot in the index list. This could be either the
288     /// previous slot for the instruction pointed to by this index or, if this
289     /// index is a Slot_Block, the last slot for the previous instruction.
290     /// WARNING: This method is considerably more expensive than the methods
291     /// that return specific slots (getUseIndex(), etc). If you can - please
292     /// use one of those methods.
293     SlotIndex getPrevSlot() const {
294       Slot s = getSlot();
295       if (s == Slot_Block) {
296         return SlotIndex(listEntry()->getPrevNode(), Slot_Dead);
297       }
298       return SlotIndex(listEntry(), s - 1);
299     }
300
301     /// Returns the previous index. This is the index corresponding to this
302     /// index's slot, but for the previous instruction.
303     SlotIndex getPrevIndex() const {
304       return SlotIndex(listEntry()->getPrevNode(), getSlot());
305     }
306
307   };
308
309   /// DenseMapInfo specialization for SlotIndex.
310   template <>
311   struct DenseMapInfo<SlotIndex> {
312     static inline SlotIndex getEmptyKey() {
313       return SlotIndex::getEmptyKey();
314     }
315     static inline SlotIndex getTombstoneKey() {
316       return SlotIndex::getTombstoneKey();
317     }
318     static inline unsigned getHashValue(const SlotIndex &v) {
319       return SlotIndex::getHashValue(v);
320     }
321     static inline bool isEqual(const SlotIndex &LHS, const SlotIndex &RHS) {
322       return (LHS == RHS);
323     }
324   };
325
326   template <> struct isPodLike<SlotIndex> { static const bool value = true; };
327
328
329   inline raw_ostream& operator<<(raw_ostream &os, SlotIndex li) {
330     li.print(os);
331     return os;
332   }
333
334   typedef std::pair<SlotIndex, MachineBasicBlock*> IdxMBBPair;
335
336   inline bool operator<(SlotIndex V, const IdxMBBPair &IM) {
337     return V < IM.first;
338   }
339
340   inline bool operator<(const IdxMBBPair &IM, SlotIndex V) {
341     return IM.first < V;
342   }
343
344   struct Idx2MBBCompare {
345     bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const {
346       return LHS.first < RHS.first;
347     }
348   };
349
350   /// SlotIndexes pass.
351   ///
352   /// This pass assigns indexes to each instruction.
353   class SlotIndexes : public MachineFunctionPass {
354   private:
355
356     typedef ilist<IndexListEntry> IndexList;
357     IndexList indexList;
358
359     MachineFunction *mf;
360     unsigned functionSize;
361
362     typedef DenseMap<const MachineInstr*, SlotIndex> Mi2IndexMap;
363     Mi2IndexMap mi2iMap;
364
365     /// MBBRanges - Map MBB number to (start, stop) indexes.
366     SmallVector<std::pair<SlotIndex, SlotIndex>, 8> MBBRanges;
367
368     /// Idx2MBBMap - Sorted list of pairs of index of first instruction
369     /// and MBB id.
370     SmallVector<IdxMBBPair, 8> idx2MBBMap;
371
372     // IndexListEntry allocator.
373     BumpPtrAllocator ileAllocator;
374
375     IndexListEntry* createEntry(MachineInstr *mi, unsigned index) {
376       IndexListEntry *entry =
377         static_cast<IndexListEntry*>(
378           ileAllocator.Allocate(sizeof(IndexListEntry),
379           alignOf<IndexListEntry>()));
380
381       new (entry) IndexListEntry(mi, index);
382
383       return entry;
384     }
385
386     /// Renumber locally after inserting curItr.
387     void renumberIndexes(IndexList::iterator curItr);
388
389   public:
390     static char ID;
391
392     SlotIndexes() : MachineFunctionPass(ID) {
393       initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
394     }
395
396     virtual void getAnalysisUsage(AnalysisUsage &au) const;
397     virtual void releaseMemory();
398
399     virtual bool runOnMachineFunction(MachineFunction &fn);
400
401     /// Dump the indexes.
402     void dump() const;
403
404     /// Renumber the index list, providing space for new instructions.
405     void renumberIndexes();
406
407     /// Returns the zero index for this analysis.
408     SlotIndex getZeroIndex() {
409       assert(indexList.front().getIndex() == 0 && "First index is not 0?");
410       return SlotIndex(&indexList.front(), 0);
411     }
412
413     /// Returns the base index of the last slot in this analysis.
414     SlotIndex getLastIndex() {
415       return SlotIndex(&indexList.back(), 0);
416     }
417
418     /// Returns the distance between the highest and lowest indexes allocated
419     /// so far.
420     unsigned getIndexesLength() const {
421       assert(indexList.front().getIndex() == 0 &&
422              "Initial index isn't zero?");
423       return indexList.back().getIndex();
424     }
425
426     /// Returns the number of instructions in the function.
427     unsigned getFunctionSize() const {
428       return functionSize;
429     }
430
431     /// Returns true if the given machine instr is mapped to an index,
432     /// otherwise returns false.
433     bool hasIndex(const MachineInstr *instr) const {
434       return mi2iMap.count(instr);
435     }
436
437     /// Returns the base index for the given instruction.
438     SlotIndex getInstructionIndex(const MachineInstr *MI) const {
439       // Instructions inside a bundle have the same number as the bundle itself.
440       Mi2IndexMap::const_iterator itr = mi2iMap.find(getBundleStart(MI));
441       assert(itr != mi2iMap.end() && "Instruction not found in maps.");
442       return itr->second;
443     }
444
445     /// Returns the instruction for the given index, or null if the given
446     /// index has no instruction associated with it.
447     MachineInstr* getInstructionFromIndex(SlotIndex index) const {
448       return index.isValid() ? index.listEntry()->getInstr() : 0;
449     }
450
451     /// Returns the next non-null index.
452     SlotIndex getNextNonNullIndex(SlotIndex index) {
453       IndexList::iterator itr(index.listEntry());
454       ++itr;
455       while (itr != indexList.end() && itr->getInstr() == 0) { ++itr; }
456       return SlotIndex(itr, index.getSlot());
457     }
458
459     /// getIndexBefore - Returns the index of the last indexed instruction
460     /// before MI, or the the start index of its basic block.
461     /// MI is not required to have an index.
462     SlotIndex getIndexBefore(const MachineInstr *MI) const {
463       const MachineBasicBlock *MBB = MI->getParent();
464       assert(MBB && "MI must be inserted inna basic block");
465       MachineBasicBlock::const_iterator I = MI, B = MBB->begin();
466       for (;;) {
467         if (I == B)
468           return getMBBStartIdx(MBB);
469         --I;
470         Mi2IndexMap::const_iterator MapItr = mi2iMap.find(I);
471         if (MapItr != mi2iMap.end())
472           return MapItr->second;
473       }
474     }
475
476     /// getIndexAfter - Returns the index of the first indexed instruction
477     /// after MI, or the end index of its basic block.
478     /// MI is not required to have an index.
479     SlotIndex getIndexAfter(const MachineInstr *MI) const {
480       const MachineBasicBlock *MBB = MI->getParent();
481       assert(MBB && "MI must be inserted inna basic block");
482       MachineBasicBlock::const_iterator I = MI, E = MBB->end();
483       for (;;) {
484         ++I;
485         if (I == E)
486           return getMBBEndIdx(MBB);
487         Mi2IndexMap::const_iterator MapItr = mi2iMap.find(I);
488         if (MapItr != mi2iMap.end())
489           return MapItr->second;
490       }
491     }
492
493     /// Return the (start,end) range of the given basic block number.
494     const std::pair<SlotIndex, SlotIndex> &
495     getMBBRange(unsigned Num) const {
496       return MBBRanges[Num];
497     }
498
499     /// Return the (start,end) range of the given basic block.
500     const std::pair<SlotIndex, SlotIndex> &
501     getMBBRange(const MachineBasicBlock *MBB) const {
502       return getMBBRange(MBB->getNumber());
503     }
504
505     /// Returns the first index in the given basic block number.
506     SlotIndex getMBBStartIdx(unsigned Num) const {
507       return getMBBRange(Num).first;
508     }
509
510     /// Returns the first index in the given basic block.
511     SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const {
512       return getMBBRange(mbb).first;
513     }
514
515     /// Returns the last index in the given basic block number.
516     SlotIndex getMBBEndIdx(unsigned Num) const {
517       return getMBBRange(Num).second;
518     }
519
520     /// Returns the last index in the given basic block.
521     SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const {
522       return getMBBRange(mbb).second;
523     }
524
525     /// Returns the basic block which the given index falls in.
526     MachineBasicBlock* getMBBFromIndex(SlotIndex index) const {
527       if (MachineInstr *MI = getInstructionFromIndex(index))
528         return MI->getParent();
529       SmallVectorImpl<IdxMBBPair>::const_iterator I =
530         std::lower_bound(idx2MBBMap.begin(), idx2MBBMap.end(), index);
531       // Take the pair containing the index
532       SmallVectorImpl<IdxMBBPair>::const_iterator J =
533         ((I != idx2MBBMap.end() && I->first > index) ||
534          (I == idx2MBBMap.end() && idx2MBBMap.size()>0)) ? (I-1): I;
535
536       assert(J != idx2MBBMap.end() && J->first <= index &&
537              index < getMBBEndIdx(J->second) &&
538              "index does not correspond to an MBB");
539       return J->second;
540     }
541
542     bool findLiveInMBBs(SlotIndex start, SlotIndex end,
543                         SmallVectorImpl<MachineBasicBlock*> &mbbs) const {
544       SmallVectorImpl<IdxMBBPair>::const_iterator itr =
545         std::lower_bound(idx2MBBMap.begin(), idx2MBBMap.end(), start);
546       bool resVal = false;
547
548       while (itr != idx2MBBMap.end()) {
549         if (itr->first >= end)
550           break;
551         mbbs.push_back(itr->second);
552         resVal = true;
553         ++itr;
554       }
555       return resVal;
556     }
557
558     /// Returns the MBB covering the given range, or null if the range covers
559     /// more than one basic block.
560     MachineBasicBlock* getMBBCoveringRange(SlotIndex start, SlotIndex end) const {
561
562       assert(start < end && "Backwards ranges not allowed.");
563
564       SmallVectorImpl<IdxMBBPair>::const_iterator itr =
565         std::lower_bound(idx2MBBMap.begin(), idx2MBBMap.end(), start);
566
567       if (itr == idx2MBBMap.end()) {
568         itr = prior(itr);
569         return itr->second;
570       }
571
572       // Check that we don't cross the boundary into this block.
573       if (itr->first < end)
574         return 0;
575
576       itr = prior(itr);
577
578       if (itr->first <= start)
579         return itr->second;
580
581       return 0;
582     }
583
584     /// Insert the given machine instruction into the mapping. Returns the
585     /// assigned index.
586     /// If Late is set and there are null indexes between mi's neighboring
587     /// instructions, create the new index after the null indexes instead of
588     /// before them.
589     SlotIndex insertMachineInstrInMaps(MachineInstr *mi, bool Late = false) {
590       assert(!mi->isInsideBundle() &&
591              "Instructions inside bundles should use bundle start's slot.");
592       assert(mi2iMap.find(mi) == mi2iMap.end() && "Instr already indexed.");
593       // Numbering DBG_VALUE instructions could cause code generation to be
594       // affected by debug information.
595       assert(!mi->isDebugValue() && "Cannot number DBG_VALUE instructions.");
596
597       assert(mi->getParent() != 0 && "Instr must be added to function.");
598
599       // Get the entries where mi should be inserted.
600       IndexList::iterator prevItr, nextItr;
601       if (Late) {
602         // Insert mi's index immediately before the following instruction.
603         nextItr = getIndexAfter(mi).listEntry();
604         prevItr = prior(nextItr);
605       } else {
606         // Insert mi's index immediately after the preceeding instruction.
607         prevItr = getIndexBefore(mi).listEntry();
608         nextItr = llvm::next(prevItr);
609       }
610
611       // Get a number for the new instr, or 0 if there's no room currently.
612       // In the latter case we'll force a renumber later.
613       unsigned dist = ((nextItr->getIndex() - prevItr->getIndex())/2) & ~3u;
614       unsigned newNumber = prevItr->getIndex() + dist;
615
616       // Insert a new list entry for mi.
617       IndexList::iterator newItr =
618         indexList.insert(nextItr, createEntry(mi, newNumber));
619
620       // Renumber locally if we need to.
621       if (dist == 0)
622         renumberIndexes(newItr);
623
624       SlotIndex newIndex(&*newItr, SlotIndex::Slot_Block);
625       mi2iMap.insert(std::make_pair(mi, newIndex));
626       return newIndex;
627     }
628
629     /// Remove the given machine instruction from the mapping.
630     void removeMachineInstrFromMaps(MachineInstr *mi) {
631       // remove index -> MachineInstr and
632       // MachineInstr -> index mappings
633       Mi2IndexMap::iterator mi2iItr = mi2iMap.find(mi);
634       if (mi2iItr != mi2iMap.end()) {
635         IndexListEntry *miEntry(mi2iItr->second.listEntry());
636         assert(miEntry->getInstr() == mi && "Instruction indexes broken.");
637         // FIXME: Eventually we want to actually delete these indexes.
638         miEntry->setInstr(0);
639         mi2iMap.erase(mi2iItr);
640       }
641     }
642
643     /// ReplaceMachineInstrInMaps - Replacing a machine instr with a new one in
644     /// maps used by register allocator.
645     void replaceMachineInstrInMaps(MachineInstr *mi, MachineInstr *newMI) {
646       Mi2IndexMap::iterator mi2iItr = mi2iMap.find(mi);
647       if (mi2iItr == mi2iMap.end())
648         return;
649       SlotIndex replaceBaseIndex = mi2iItr->second;
650       IndexListEntry *miEntry(replaceBaseIndex.listEntry());
651       assert(miEntry->getInstr() == mi &&
652              "Mismatched instruction in index tables.");
653       miEntry->setInstr(newMI);
654       mi2iMap.erase(mi2iItr);
655       mi2iMap.insert(std::make_pair(newMI, replaceBaseIndex));
656     }
657
658     /// Add the given MachineBasicBlock into the maps.
659     void insertMBBInMaps(MachineBasicBlock *mbb) {
660       MachineFunction::iterator nextMBB =
661         llvm::next(MachineFunction::iterator(mbb));
662       IndexListEntry *startEntry = createEntry(0, 0);
663       IndexListEntry *stopEntry = createEntry(0, 0);
664       IndexListEntry *nextEntry = 0;
665
666       if (nextMBB == mbb->getParent()->end()) {
667         nextEntry = indexList.end();
668       } else {
669         nextEntry = getMBBStartIdx(nextMBB).listEntry();
670       }
671
672       indexList.insert(nextEntry, startEntry);
673       indexList.insert(nextEntry, stopEntry);
674
675       SlotIndex startIdx(startEntry, SlotIndex::Slot_Block);
676       SlotIndex endIdx(nextEntry, SlotIndex::Slot_Block);
677
678       assert(unsigned(mbb->getNumber()) == MBBRanges.size() &&
679              "Blocks must be added in order");
680       MBBRanges.push_back(std::make_pair(startIdx, endIdx));
681
682       idx2MBBMap.push_back(IdxMBBPair(startIdx, mbb));
683
684       renumberIndexes();
685       std::sort(idx2MBBMap.begin(), idx2MBBMap.end(), Idx2MBBCompare());
686     }
687
688   };
689
690
691   // Specialize IntervalMapInfo for half-open slot index intervals.
692   template <typename> struct IntervalMapInfo;
693   template <> struct IntervalMapInfo<SlotIndex> {
694     static inline bool startLess(const SlotIndex &x, const SlotIndex &a) {
695       return x < a;
696     }
697     static inline bool stopLess(const SlotIndex &b, const SlotIndex &x) {
698       return b <= x;
699     }
700     static inline bool adjacent(const SlotIndex &a, const SlotIndex &b) {
701       return a == b;
702     }
703   };
704
705 }
706
707 #endif // LLVM_CODEGEN_SLOTINDEXES_H