1 //===- LoopInfo.cpp - Natural Loop Calculator -------------------------------=// 2 // 3 // This file defines the LoopInfo class that is used to identify natural loops 4 // and determine the loop depth of various nodes of the CFG. Note that the 5 // loops identified may actually be several natural loops that share the same 6 // header node... not just a single natural loop. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/Analysis/LoopInfo.h" 11 #include "llvm/Analysis/Dominators.h" 12 #include "llvm/Support/CFG.h" 13 #include "llvm/Assembly/Writer.h" 14 #include "Support/DepthFirstIterator.h" 15 #include <algorithm> 16 17 static RegisterAnalysis<LoopInfo> 18 X("loops", "Natural Loop Construction", true); 19 20 //===----------------------------------------------------------------------===// 21 // Loop implementation 22 // 23 bool Loop::contains(const BasicBlock *BB) const { 24 return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end(); 25 } 26 27 bool Loop::isLoopExit(const BasicBlock *BB) const { 28 for (BasicBlock::succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB); 29 SI != SE; ++SI) { 30 if (! contains(*SI)) 31 return true; 32 } 33 return false; 34 } 35 36 unsigned Loop::getNumBackEdges() const { 37 unsigned numBackEdges = 0; 38 BasicBlock *header = Blocks.front(); 39 40 for (std::vector<BasicBlock*>::const_iterator i = Blocks.begin(), e = Blocks.end(); 41 i != e; ++i) { 42 for (BasicBlock::succ_iterator Successor = succ_begin(*i), SEnd = succ_end(*i); 43 Successor != SEnd; ++Successor) { 44 if (header == *Successor) 45 ++numBackEdges; 46 } 47 } 48 return numBackEdges; 49 } 50 51 void Loop::print(std::ostream &OS) const { 52 OS << std::string(getLoopDepth()*2, ' ') << "Loop Containing: "; 53 54 for (unsigned i = 0; i < getBlocks().size(); ++i) { 55 if (i) OS << ","; 56 WriteAsOperand(OS, (const Value*)getBlocks()[i]); 57 } 58 OS << "\n"; 59 60 for (unsigned i = 0, e = getSubLoops().size(); i != e; ++i) 61 getSubLoops()[i]->print(OS); 62 } 63 64 //===----------------------------------------------------------------------===// 65 // LoopInfo implementation 66 // 67 void LoopInfo::stub() {} 68 69 bool LoopInfo::runOnFunction(Function &) { 70 releaseMemory(); 71 Calculate(getAnalysis<DominatorSet>()); // Update 72 return false; 73 } 74 75 void LoopInfo::releaseMemory() { 76 for (std::vector<Loop*>::iterator I = TopLevelLoops.begin(), 77 E = TopLevelLoops.end(); I != E; ++I) 78 delete *I; // Delete all of the loops... 79 80 BBMap.clear(); // Reset internal state of analysis 81 TopLevelLoops.clear(); 82 } 83 84 85 void LoopInfo::Calculate(const DominatorSet &DS) { 86 BasicBlock *RootNode = DS.getRoot(); 87 88 for (df_iterator<BasicBlock*> NI = df_begin(RootNode), 89 NE = df_end(RootNode); NI != NE; ++NI) 90 if (Loop *L = ConsiderForLoop(*NI, DS)) 91 TopLevelLoops.push_back(L); 92 93 for (unsigned i = 0; i < TopLevelLoops.size(); ++i) 94 TopLevelLoops[i]->setLoopDepth(1); 95 } 96 97 void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { 98 AU.setPreservesAll(); 99 AU.addRequired<DominatorSet>(); 100 } 101 102 void LoopInfo::print(std::ostream &OS) const { 103 for (unsigned i = 0; i < TopLevelLoops.size(); ++i) 104 TopLevelLoops[i]->print(OS); 105 } 106 107 Loop *LoopInfo::ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS) { 108 if (BBMap.find(BB) != BBMap.end()) return 0; // Haven't processed this node? 109 110 std::vector<BasicBlock *> TodoStack; 111 112 // Scan the predecessors of BB, checking to see if BB dominates any of 113 // them. 114 for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) 115 if (DS.dominates(BB, *I)) // If BB dominates it's predecessor... 116 TodoStack.push_back(*I); 117 118 if (TodoStack.empty()) return 0; // Doesn't dominate any predecessors... 119 120 // Create a new loop to represent this basic block... 121 Loop *L = new Loop(BB); 122 BBMap[BB] = L; 123 124 while (!TodoStack.empty()) { // Process all the nodes in the loop 125 BasicBlock *X = TodoStack.back(); 126 TodoStack.pop_back(); 127 128 if (!L->contains(X)) { // As of yet unprocessed?? 129 L->Blocks.push_back(X); 130 131 // Add all of the predecessors of X to the end of the work stack... 132 TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X)); 133 } 134 } 135 136 // Add the basic blocks that comprise this loop to the BBMap so that this 137 // loop can be found for them. Also check subsidary basic blocks to see if 138 // they start subloops of their own. 139 // 140 for (std::vector<BasicBlock*>::reverse_iterator I = L->Blocks.rbegin(), 141 E = L->Blocks.rend(); I != E; ++I) { 142 143 // Check to see if this block starts a new loop 144 if (Loop *NewLoop = ConsiderForLoop(*I, DS)) { 145 L->SubLoops.push_back(NewLoop); 146 NewLoop->ParentLoop = L; 147 } 148 149 if (BBMap.find(*I) == BBMap.end()) 150 BBMap.insert(std::make_pair(*I, L)); 151 } 152 153 return L; 154 } 155 156 /// getLoopPreheader - If there is a preheader for this loop, return it. A 157 /// loop has a preheader if there is only one edge to the header of the loop 158 /// from outside of the loop. If this is the case, the block branching to the 159 /// header of the loop is the preheader node. The "preheaders" pass can be 160 /// "Required" to ensure that there is always a preheader node for every loop. 161 /// 162 /// This method returns null if there is no preheader for the loop (either 163 /// because the loop is dead or because multiple blocks branch to the header 164 /// node of this loop). 165 /// 166 BasicBlock *Loop::getLoopPreheader() const { 167 // Keep track of nodes outside the loop branching to the header... 168 BasicBlock *Out = 0; 169 170 // Loop over the predecessors of the header node... 171 BasicBlock *Header = getHeader(); 172 for (pred_iterator PI = pred_begin(Header), PE = pred_end(Header); 173 PI != PE; ++PI) 174 if (!contains(*PI)) { // If the block is not in the loop... 175 if (Out && Out != *PI) 176 return 0; // Multiple predecessors outside the loop 177 Out = *PI; 178 } 179 180 // If there is exactly one preheader, return it. If there was zero, then Out 181 // is still null. 182 return Out; 183 } 184 185 /// addBasicBlockToLoop - This function is used by other analyses to update loop 186 /// information. NewBB is set to be a new member of the current loop. Because 187 /// of this, it is added as a member of all parent loops, and is added to the 188 /// specified LoopInfo object as being in the current basic block. It is not 189 /// valid to replace the loop header with this method. 190 /// 191 void Loop::addBasicBlockToLoop(BasicBlock *NewBB, LoopInfo &LI) { 192 assert(LI[getHeader()] == this && "Incorrect LI specified for this loop!"); 193 assert(NewBB && "Cannot add a null basic block to the loop!"); 194 assert(LI[NewBB] == 0 && "BasicBlock already in the loop!"); 195 196 // Add the loop mapping to the LoopInfo object... 197 LI.BBMap[NewBB] = this; 198 199 // Add the basic block to this loop and all parent loops... 200 Loop *L = this; 201 while (L) { 202 L->Blocks.push_back(NewBB); 203 L = L->getParentLoop(); 204 } 205 } 206