15907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//===-- InterferenceCache.h - Caching per-block interference ---*- C++ -*--===//
25907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//
35907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
45907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//
55907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
65907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen// License. See LICENSE.TXT for details.
75907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//
85907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//===----------------------------------------------------------------------===//
95907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//
10042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen// InterferenceCache remembers per-block interference from LiveIntervalUnions,
11042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen// fixed RegUnit interference, and register masks.
125907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//
135907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen//===----------------------------------------------------------------------===//
145907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
155907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen#ifndef LLVM_CODEGEN_INTERFERENCECACHE
165907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen#define LLVM_CODEGEN_INTERFERENCECACHE
175907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
181ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalUnion.h"
195907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
205907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesennamespace llvm {
215907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
226ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesenclass LiveIntervals;
236ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen
245907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesenclass InterferenceCache {
255907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  const TargetRegisterInfo *TRI;
265907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  LiveIntervalUnion *LIUArray;
275907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  MachineFunction *MF;
285907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
295907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// BlockInterference - information about the interference in a single basic
305907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// block.
315907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  struct BlockInterference {
325907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    BlockInterference() : Tag(0) {}
335907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    unsigned Tag;
345907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndex First;
355907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndex Last;
365907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  };
375907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
385907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// Entry - A cache entry containing interference information for all aliases
395907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// of PhysReg in all basic blocks.
405907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  class Entry {
415907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// PhysReg - The register currently represented.
425907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    unsigned PhysReg;
435907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
445907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// Tag - Cache tag is changed when any of the underlying LiveIntervalUnions
455907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// change.
465907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    unsigned Tag;
475907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
48f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    /// RefCount - The total number of Cursor instances referring to this Entry.
49f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    unsigned RefCount;
50f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
519d29cbad32814f31c91cd2464a3c74df412b0aacJakob Stoklund Olesen    /// MF - The current function.
529d29cbad32814f31c91cd2464a3c74df412b0aacJakob Stoklund Olesen    MachineFunction *MF;
539d29cbad32814f31c91cd2464a3c74df412b0aacJakob Stoklund Olesen
545907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// Indexes - Mapping block numbers to SlotIndex ranges.
555907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndexes *Indexes;
565907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
576ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen    /// LIS - Used for accessing register mask interference maps.
586ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen    LiveIntervals *LIS;
596ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen
605907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// PrevPos - The previous position the iterators were moved to.
615907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndex PrevPos;
625907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
63042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    /// RegUnitInfo - Information tracked about each RegUnit in PhysReg.
64042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    /// When PrevPos is set, the iterators are valid as if advanceTo(PrevPos)
65042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    /// had just been called.
66042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    struct RegUnitInfo {
67042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      /// Iterator pointing into the LiveIntervalUnion containing virtual
68042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      /// register interference.
69042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      LiveIntervalUnion::SegmentIter VirtI;
705907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
71042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      /// Tag of the LIU last time we looked.
72042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      unsigned VirtTag;
735907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
74042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      /// Fixed interference in RegUnit.
75042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      LiveInterval *Fixed;
76042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen
77042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      /// Iterator pointing into the fixed RegUnit interference.
78042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      LiveInterval::iterator FixedI;
79042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen
80042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      RegUnitInfo(LiveIntervalUnion &LIU) : VirtTag(LIU.getTag()), Fixed(0) {
81042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen        VirtI.setMap(LIU.getMap());
82042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen      }
83042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    };
84042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen
85042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    /// Info for each RegUnit in PhysReg. It is very rare ofr a PHysReg to have
86042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    /// more than 4 RegUnits.
87042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    SmallVector<RegUnitInfo, 4> RegUnits;
885907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
895907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// Blocks - Interference for each block in the function.
905907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SmallVector<BlockInterference, 8> Blocks;
915907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
925907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// update - Recompute Blocks[MBBNum]
935907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    void update(unsigned MBBNum);
945907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
955907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  public:
966ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen    Entry() : PhysReg(0), Tag(0), RefCount(0), Indexes(0), LIS(0) {}
975907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
986ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen    void clear(MachineFunction *mf, SlotIndexes *indexes, LiveIntervals *lis) {
99f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      assert(!hasRefs() && "Cannot clear cache entry with references");
1005907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      PhysReg = 0;
1019d29cbad32814f31c91cd2464a3c74df412b0aacJakob Stoklund Olesen      MF = mf;
1025907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      Indexes = indexes;
1036ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen      LIS = lis;
1045907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
1055907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1065907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    unsigned getPhysReg() const { return PhysReg; }
1075907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
108f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    void addRef(int Delta) { RefCount += Delta; }
109f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
110f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    bool hasRefs() const { return RefCount > 0; }
111f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
112042888db2bb195c86bf34afbb6907d70855d2830Jakob Stoklund Olesen    void revalidate(LiveIntervalUnion *LIUArray, const TargetRegisterInfo *TRI);
1135907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1145907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// valid - Return true if this is a valid entry for physReg.
1155907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    bool valid(LiveIntervalUnion *LIUArray, const TargetRegisterInfo *TRI);
1165907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1175907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// reset - Initialize entry to represent physReg's aliases.
1185907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    void reset(unsigned physReg,
1195907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen               LiveIntervalUnion *LIUArray,
1205907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen               const TargetRegisterInfo *TRI,
1215907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen               const MachineFunction *MF);
1225907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1235907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// get - Return an up to date BlockInterference.
1245907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    BlockInterference *get(unsigned MBBNum) {
1255907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      if (Blocks[MBBNum].Tag != Tag)
1265907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen        update(MBBNum);
1275907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      return &Blocks[MBBNum];
1285907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
1295907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  };
1305907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1315907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // We don't keep a cache entry for every physical register, that would use too
1325907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // much memory. Instead, a fixed number of cache entries are used in a round-
1335907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // robin manner.
1345907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  enum { CacheEntries = 32 };
1355907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1365907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // Point to an entry for each physreg. The entry pointed to may not be up to
1375907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // date, and it may have been reused for a different physreg.
1385907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  SmallVector<unsigned char, 2> PhysRegEntries;
1395907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1405907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // Next round-robin entry to be picked.
1415907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  unsigned RoundRobin;
1425907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1435907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // The actual cache entries.
1445907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  Entry Entries[CacheEntries];
1455907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1465907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  // get - Get a valid entry for PhysReg.
1475907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  Entry *get(unsigned PhysReg);
1485907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1495907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesenpublic:
1503bf7a1cc3c090e766b8912c6a14c3e2ec5dde7f8Jakob Stoklund Olesen  InterferenceCache() : TRI(0), LIUArray(0), MF(0), RoundRobin(0) {}
1515907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
1525907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// init - Prepare cache for a new function.
1536ef7da0197735a16aa534e9e2c80709d3d6e8c56Jakob Stoklund Olesen  void init(MachineFunction*, LiveIntervalUnion*, SlotIndexes*, LiveIntervals*,
1545907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen            const TargetRegisterInfo *);
1555907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
156f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen  /// getMaxCursors - Return the maximum number of concurrent cursors that can
157f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen  /// be supported.
158f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen  unsigned getMaxCursors() const { return CacheEntries; }
159f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
1605907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  /// Cursor - The primary query interface for the block interference cache.
1615907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  class Cursor {
1625907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    Entry *CacheEntry;
1635907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    BlockInterference *Current;
164c7931fd725b390142f9112952b1426560000e6b4Jakob Stoklund Olesen    static BlockInterference NoInterference;
165f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
166f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    void setEntry(Entry *E) {
167f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      Current = 0;
168f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      // Update reference counts. Nothing happens when RefCount reaches 0, so
169f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      // we don't have to check for E == CacheEntry etc.
170f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      if (CacheEntry)
171f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen        CacheEntry->addRef(-1);
172f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      CacheEntry = E;
173f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      if (CacheEntry)
174f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen        CacheEntry->addRef(+1);
175f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    }
176f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
1775907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  public:
178c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen    /// Cursor - Create a dangling cursor.
179c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen    Cursor() : CacheEntry(0), Current(0) {}
180f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    ~Cursor() { setEntry(0); }
181f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
182f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    Cursor(const Cursor &O) : CacheEntry(0), Current(0) {
183f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      setEntry(O.CacheEntry);
184f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    }
185f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen
186f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    Cursor &operator=(const Cursor &O) {
187f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      setEntry(O.CacheEntry);
188f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      return *this;
189f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen    }
190c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen
191c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen    /// setPhysReg - Point this cursor to PhysReg's interference.
192c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen    void setPhysReg(InterferenceCache &Cache, unsigned PhysReg) {
193f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      // Release reference before getting a new one. That guarantees we can
194f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      // actually have CacheEntries live cursors.
195f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      setEntry(0);
196f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen      if (PhysReg)
197f1c709837bd11c5383fce3b8a026a7c8eaabba86Jakob Stoklund Olesen        setEntry(Cache.get(PhysReg));
198c66a37df73f70ec3dbed06277763624f33ee3512Jakob Stoklund Olesen    }
1995907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2005907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// moveTo - Move cursor to basic block MBBNum.
2015907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    void moveToBlock(unsigned MBBNum) {
202c7931fd725b390142f9112952b1426560000e6b4Jakob Stoklund Olesen      Current = CacheEntry ? CacheEntry->get(MBBNum) : &NoInterference;
2035907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
2045907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2055907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// hasInterference - Return true if the current block has any interference.
2065907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    bool hasInterference() {
2075907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      return Current->First.isValid();
2085907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
2095907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2105907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// first - Return the starting index of the first interfering range in the
2115907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// current block.
2125907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndex first() {
2135907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      return Current->First;
2145907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
2155907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2165907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// last - Return the ending index of the last interfering range in the
2175907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    /// current block.
2185907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    SlotIndex last() {
2195907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen      return Current->Last;
2205907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen    }
2215907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  };
2225907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2235907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen  friend class Cursor;
2245907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen};
2255907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2265907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen} // namespace llvm
2275907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen
2285907d863659eb972ebb2afe07bc863a4c616f0efJakob Stoklund Olesen#endif
229