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