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