1233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames//===-- SlotIndexes.cpp - Slot Indexes Pass ------------------------------===// 2233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// 3233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// The LLVM Compiler Infrastructure 4233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// 5233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// This file is distributed under the University of Illinois Open Source 6233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// License. See LICENSE.TXT for details. 7233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// 8233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames//===----------------------------------------------------------------------===// 9233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 10233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames#define DEBUG_TYPE "slotindexes" 11233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 12233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames#include "llvm/CodeGen/SlotIndexes.h" 1310c5f2dad5e11e2502ebc0b9e9ea56e449f42d16Jakob Stoklund Olesen#include "llvm/ADT/Statistic.h" 14233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames#include "llvm/CodeGen/MachineFunction.h" 15233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames#include "llvm/Support/Debug.h" 16233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames#include "llvm/Support/raw_ostream.h" 171caedd056dbc3eda1537ad8251323bd985819b80Dale Johannesen#include "llvm/Target/TargetInstrInfo.h" 18233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 19233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesusing namespace llvm; 20233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 21233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hameschar SlotIndexes::ID = 0; 22d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(SlotIndexes, "slotindexes", 23ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Slot index numbering", false, false) 24233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 25979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund OlesenSTATISTIC(NumLocalRenum, "Number of local renumberings"); 26979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund OlesenSTATISTIC(NumGlobalRenum, "Number of global renumberings"); 2710c5f2dad5e11e2502ebc0b9e9ea56e449f42d16Jakob Stoklund Olesen 28233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesvoid SlotIndexes::getAnalysisUsage(AnalysisUsage &au) const { 29233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames au.setPreservesAll(); 30233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames MachineFunctionPass::getAnalysisUsage(au); 31233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 32233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 33233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesvoid SlotIndexes::releaseMemory() { 34233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames mi2iMap.clear(); 35a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen MBBRanges.clear(); 36233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames idx2MBBMap.clear(); 37613dfb219c167717576b2383ee57573f4d8f53cfLang Hames indexList.clear(); 38613dfb219c167717576b2383ee57573f4d8f53cfLang Hames ileAllocator.Reset(); 39233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 40233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 41233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesbool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { 42233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 43233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Compute numbering as follows: 44233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Grab an iterator to the start of the index list. 45233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Iterate over all MBBs, and within each MBB all MIs, keeping the MI 46233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // iterator in lock-step (though skipping it over indexes which have 47233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // null pointers in the instruction field). 48233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // At each iteration assert that the instruction pointed to in the index 49613dfb219c167717576b2383ee57573f4d8f53cfLang Hames // is the same one pointed to by the MI iterator. This 50233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 51233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // FIXME: This can be simplified. The mi2iMap_, Idx2MBBMap, etc. should 52233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // only need to be set up once after the first numbering is computed. 53233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 54233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames mf = &fn; 55233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 56233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Check that the list contains only the sentinal. 57613dfb219c167717576b2383ee57573f4d8f53cfLang Hames assert(indexList.empty() && "Index list non-empty at initial numbering?"); 58233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames assert(idx2MBBMap.empty() && 59233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames "Index -> MBB mapping non-empty at initial numbering?"); 60a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen assert(MBBRanges.empty() && 61233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames "MBB -> Index mapping non-empty at initial numbering?"); 62233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames assert(mi2iMap.empty() && 63233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames "MachineInstr -> Index mapping non-empty at initial numbering?"); 64233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 65233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames unsigned index = 0; 66a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen MBBRanges.resize(mf->getNumBlockIDs()); 67a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen idx2MBBMap.reserve(mf->size()); 68233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 69613dfb219c167717576b2383ee57573f4d8f53cfLang Hames indexList.push_back(createEntry(0, index)); 7074ab5eeffbd70f2387338e3ee8195be9f73e6dd8Lang Hames 71f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman // Iterate over the function. 72233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames for (MachineFunction::iterator mbbItr = mf->begin(), mbbEnd = mf->end(); 73233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames mbbItr != mbbEnd; ++mbbItr) { 74233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames MachineBasicBlock *mbb = &*mbbItr; 75233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 76233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Insert an index for the MBB start. 77613dfb219c167717576b2383ee57573f4d8f53cfLang Hames SlotIndex blockStartIndex(&indexList.back(), SlotIndex::Slot_Block); 78233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 79233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames for (MachineBasicBlock::iterator miItr = mbb->begin(), miEnd = mbb->end(); 80233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames miItr != miEnd; ++miItr) { 81518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner MachineInstr *mi = miItr; 82518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner if (mi->isDebugValue()) 831caedd056dbc3eda1537ad8251323bd985819b80Dale Johannesen continue; 84233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 85233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Insert a store index for the instr. 86613dfb219c167717576b2383ee57573f4d8f53cfLang Hames indexList.push_back(createEntry(mi, index += SlotIndex::InstrDist)); 87233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 88233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Save this base index in the maps. 89613dfb219c167717576b2383ee57573f4d8f53cfLang Hames mi2iMap.insert(std::make_pair(mi, SlotIndex(&indexList.back(), 902debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen SlotIndex::Slot_Block))); 91233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames } 92233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 93f0cf2d357cf5540f21400e330028045e65e60835Jakob Stoklund Olesen // We insert one blank instructions between basic blocks. 94613dfb219c167717576b2383ee57573f4d8f53cfLang Hames indexList.push_back(createEntry(0, index += SlotIndex::InstrDist)); 9574ab5eeffbd70f2387338e3ee8195be9f73e6dd8Lang Hames 96a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen MBBRanges[mbb->getNumber()].first = blockStartIndex; 97613dfb219c167717576b2383ee57573f4d8f53cfLang Hames MBBRanges[mbb->getNumber()].second = SlotIndex(&indexList.back(), 982debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen SlotIndex::Slot_Block); 99233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames idx2MBBMap.push_back(IdxMBBPair(blockStartIndex, mbb)); 100233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames } 101233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 102233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // Sort the Idx2MBBMap 103233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames std::sort(idx2MBBMap.begin(), idx2MBBMap.end(), Idx2MBBCompare()); 104233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 1051ce6a36610f06a1fb4047ddde1e9bc2f071c0bfbJakob Stoklund Olesen DEBUG(mf->print(dbgs(), this)); 106233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 107233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames // And we're done! 108233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames return false; 109233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 110233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 111b3661585c0f87b6045f0d65b5cac16921ae27086Lang Hamesvoid SlotIndexes::renumberIndexes() { 112fbb8fa247ec13067d9ad3f0c426e2029d15222b2Lang Hames // Renumber updates the index of every element of the index list. 11397af98678cc943050cf23951a66c89e922cf21c4Jakob Stoklund Olesen DEBUG(dbgs() << "\n*** Renumbering SlotIndexes ***\n"); 114979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen ++NumGlobalRenum; 115233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 116fbb8fa247ec13067d9ad3f0c426e2029d15222b2Lang Hames unsigned index = 0; 117fbb8fa247ec13067d9ad3f0c426e2029d15222b2Lang Hames 118613dfb219c167717576b2383ee57573f4d8f53cfLang Hames for (IndexList::iterator I = indexList.begin(), E = indexList.end(); 119613dfb219c167717576b2383ee57573f4d8f53cfLang Hames I != E; ++I) { 120613dfb219c167717576b2383ee57573f4d8f53cfLang Hames I->setIndex(index); 121f0cf2d357cf5540f21400e330028045e65e60835Jakob Stoklund Olesen index += SlotIndex::InstrDist; 122fbb8fa247ec13067d9ad3f0c426e2029d15222b2Lang Hames } 123233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 124233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 125613dfb219c167717576b2383ee57573f4d8f53cfLang Hames// Renumber indexes locally after curItr was inserted, but failed to get a new 126979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen// index. 127613dfb219c167717576b2383ee57573f4d8f53cfLang Hamesvoid SlotIndexes::renumberIndexes(IndexList::iterator curItr) { 128979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen // Number indexes with half the default spacing so we can catch up quickly. 129979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen const unsigned Space = SlotIndex::InstrDist/2; 130979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen assert((Space & 3) == 0 && "InstrDist must be a multiple of 2*NUM"); 131979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen 132613dfb219c167717576b2383ee57573f4d8f53cfLang Hames IndexList::iterator startItr = prior(curItr); 133613dfb219c167717576b2383ee57573f4d8f53cfLang Hames unsigned index = startItr->getIndex(); 134979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen do { 135613dfb219c167717576b2383ee57573f4d8f53cfLang Hames curItr->setIndex(index += Space); 136613dfb219c167717576b2383ee57573f4d8f53cfLang Hames ++curItr; 137979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen // If the next index is bigger, we have caught up. 138613dfb219c167717576b2383ee57573f4d8f53cfLang Hames } while (curItr != indexList.end() && curItr->getIndex() <= index); 139979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen 140613dfb219c167717576b2383ee57573f4d8f53cfLang Hames DEBUG(dbgs() << "\n*** Renumbered SlotIndexes " << startItr->getIndex() << '-' 141979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen << index << " ***\n"); 142979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen ++NumLocalRenum; 143979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen} 144979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen 145349cf349987a65be89078913e34126898bcdd138Cameron Zwarich// Repair indexes after adding and removing instructions. 146349cf349987a65be89078913e34126898bcdd138Cameron Zwarichvoid SlotIndexes::repairIndexesInRange(MachineBasicBlock *MBB, 147349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineBasicBlock::iterator Begin, 148349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineBasicBlock::iterator End) { 149c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich // FIXME: Is this really necessary? The only caller repairIntervalsForRange() 150c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich // does the same thing. 151c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich // Find anchor points, which are at the beginning/end of blocks or at 152c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich // instructions that already have indexes. 153c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich while (Begin != MBB->begin() && !hasIndex(Begin)) 154c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich --Begin; 155c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich while (End != MBB->end() && !hasIndex(End)) 156c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich ++End; 157c5b6135fb55362f5c052625043ebf3286f799f86Cameron Zwarich 158349cf349987a65be89078913e34126898bcdd138Cameron Zwarich bool includeStart = (Begin == MBB->begin()); 159349cf349987a65be89078913e34126898bcdd138Cameron Zwarich SlotIndex startIdx; 160349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (includeStart) 161349cf349987a65be89078913e34126898bcdd138Cameron Zwarich startIdx = getMBBStartIdx(MBB); 162349cf349987a65be89078913e34126898bcdd138Cameron Zwarich else 163349cf349987a65be89078913e34126898bcdd138Cameron Zwarich startIdx = getInstructionIndex(Begin); 164349cf349987a65be89078913e34126898bcdd138Cameron Zwarich 165349cf349987a65be89078913e34126898bcdd138Cameron Zwarich SlotIndex endIdx; 166349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (End == MBB->end()) 167349cf349987a65be89078913e34126898bcdd138Cameron Zwarich endIdx = getMBBEndIdx(MBB); 168349cf349987a65be89078913e34126898bcdd138Cameron Zwarich else 169349cf349987a65be89078913e34126898bcdd138Cameron Zwarich endIdx = getInstructionIndex(End); 170349cf349987a65be89078913e34126898bcdd138Cameron Zwarich 171349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // FIXME: Conceptually, this code is implementing an iterator on MBB that 172349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // optionally includes an additional position prior to MBB->begin(), indicated 173349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // by the includeStart flag. This is done so that we can iterate MIs in a MBB 174349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // in parallel with SlotIndexes, but there should be a better way to do this. 175349cf349987a65be89078913e34126898bcdd138Cameron Zwarich IndexList::iterator ListB = startIdx.listEntry(); 176349cf349987a65be89078913e34126898bcdd138Cameron Zwarich IndexList::iterator ListI = endIdx.listEntry(); 177349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineBasicBlock::iterator MBBI = End; 178349cf349987a65be89078913e34126898bcdd138Cameron Zwarich bool pastStart = false; 179349cf349987a65be89078913e34126898bcdd138Cameron Zwarich while (ListI != ListB || MBBI != Begin || (includeStart && !pastStart)) { 180349cf349987a65be89078913e34126898bcdd138Cameron Zwarich assert(ListI->getIndex() >= startIdx.getIndex() && 181349cf349987a65be89078913e34126898bcdd138Cameron Zwarich (includeStart || !pastStart) && 182349cf349987a65be89078913e34126898bcdd138Cameron Zwarich "Decremented past the beginning of region to repair."); 183349cf349987a65be89078913e34126898bcdd138Cameron Zwarich 184349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineInstr *SlotMI = ListI->getInstr(); 185349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineInstr *MI = (MBBI != MBB->end() && !pastStart) ? MBBI : 0; 186349cf349987a65be89078913e34126898bcdd138Cameron Zwarich bool MBBIAtBegin = MBBI == Begin && (!includeStart || pastStart); 187349cf349987a65be89078913e34126898bcdd138Cameron Zwarich 188349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (SlotMI == MI && !MBBIAtBegin) { 189349cf349987a65be89078913e34126898bcdd138Cameron Zwarich --ListI; 190349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (MBBI != Begin) 191349cf349987a65be89078913e34126898bcdd138Cameron Zwarich --MBBI; 192349cf349987a65be89078913e34126898bcdd138Cameron Zwarich else 193349cf349987a65be89078913e34126898bcdd138Cameron Zwarich pastStart = true; 194349cf349987a65be89078913e34126898bcdd138Cameron Zwarich } else if (MI && mi2iMap.find(MI) == mi2iMap.end()) { 195349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (MBBI != Begin) 196349cf349987a65be89078913e34126898bcdd138Cameron Zwarich --MBBI; 197349cf349987a65be89078913e34126898bcdd138Cameron Zwarich else 198349cf349987a65be89078913e34126898bcdd138Cameron Zwarich pastStart = true; 199349cf349987a65be89078913e34126898bcdd138Cameron Zwarich } else { 200349cf349987a65be89078913e34126898bcdd138Cameron Zwarich --ListI; 201349cf349987a65be89078913e34126898bcdd138Cameron Zwarich if (SlotMI) 202349cf349987a65be89078913e34126898bcdd138Cameron Zwarich removeMachineInstrFromMaps(SlotMI); 203349cf349987a65be89078913e34126898bcdd138Cameron Zwarich } 204349cf349987a65be89078913e34126898bcdd138Cameron Zwarich } 205349cf349987a65be89078913e34126898bcdd138Cameron Zwarich 206349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // In theory this could be combined with the previous loop, but it is tricky 207349cf349987a65be89078913e34126898bcdd138Cameron Zwarich // to update the IndexList while we are iterating it. 208349cf349987a65be89078913e34126898bcdd138Cameron Zwarich for (MachineBasicBlock::iterator I = End; I != Begin;) { 209349cf349987a65be89078913e34126898bcdd138Cameron Zwarich --I; 210349cf349987a65be89078913e34126898bcdd138Cameron Zwarich MachineInstr *MI = I; 21179f5ab1931e5abf6e9c304db25e50d592dd8f5b8Cameron Zwarich if (!MI->isDebugValue() && mi2iMap.find(MI) == mi2iMap.end()) 212349cf349987a65be89078913e34126898bcdd138Cameron Zwarich insertMachineInstrInMaps(MI); 213349cf349987a65be89078913e34126898bcdd138Cameron Zwarich } 214349cf349987a65be89078913e34126898bcdd138Cameron Zwarich} 215979869c28e5bc68e2d4d546c7019525177f1d399Jakob Stoklund Olesen 216b720be6a50f4e1b3280d2b029ee38dda14577525Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 217233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesvoid SlotIndexes::dump() const { 218613dfb219c167717576b2383ee57573f4d8f53cfLang Hames for (IndexList::const_iterator itr = indexList.begin(); 219613dfb219c167717576b2383ee57573f4d8f53cfLang Hames itr != indexList.end(); ++itr) { 22087b0efc86dcc1dac30fcd6b4d1c51110f707a28cDavid Greene dbgs() << itr->getIndex() << " "; 221233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 222233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames if (itr->getInstr() != 0) { 22387b0efc86dcc1dac30fcd6b4d1c51110f707a28cDavid Greene dbgs() << *itr->getInstr(); 224233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames } else { 22587b0efc86dcc1dac30fcd6b4d1c51110f707a28cDavid Greene dbgs() << "\n"; 226233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames } 227233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames } 228233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 229a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen for (unsigned i = 0, e = MBBRanges.size(); i != e; ++i) 230a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen dbgs() << "BB#" << i << "\t[" << MBBRanges[i].first << ';' 231a122eaaee22750c4f92c33672e149eb2f0c538cbJakob Stoklund Olesen << MBBRanges[i].second << ")\n"; 232233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 23377e300e8f0b8db8eec448cae9c87d7c5bfad9757Manman Ren#endif 234233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 235233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// Print a SlotIndex to a raw_ostream. 236233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesvoid SlotIndex::print(raw_ostream &os) const { 23797af98678cc943050cf23951a66c89e922cf21c4Jakob Stoklund Olesen if (isValid()) 238613dfb219c167717576b2383ee57573f4d8f53cfLang Hames os << listEntry()->getIndex() << "Berd"[getSlot()]; 23997af98678cc943050cf23951a66c89e922cf21c4Jakob Stoklund Olesen else 24097af98678cc943050cf23951a66c89e922cf21c4Jakob Stoklund Olesen os << "invalid"; 241233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 242233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 243b720be6a50f4e1b3280d2b029ee38dda14577525Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 244233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames// Dump a SlotIndex to stderr. 245233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hamesvoid SlotIndex::dump() const { 24687b0efc86dcc1dac30fcd6b4d1c51110f707a28cDavid Greene print(dbgs()); 24787b0efc86dcc1dac30fcd6b4d1c51110f707a28cDavid Greene dbgs() << "\n"; 248233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames} 24977e300e8f0b8db8eec448cae9c87d7c5bfad9757Manman Ren#endif 250233a60ec40b41027ff429e2f2c27fa2be762f2e9Lang Hames 251