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 "Support/DepthFirstIterator.h" 14 #include <algorithm> 15 16 AnalysisID LoopInfo::ID(AnalysisID::create<LoopInfo>(), true); 17 18 //===----------------------------------------------------------------------===// 19 // Loop implementation 20 // 21 bool Loop::contains(BasicBlock *BB) const { 22 return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end(); 23 } 24 25 void LoopInfo::releaseMemory() { 26 for (std::vector<Loop*>::iterator I = TopLevelLoops.begin(), 27 E = TopLevelLoops.end(); I != E; ++I) 28 delete *I; // Delete all of the loops... 29 30 BBMap.clear(); // Reset internal state of analysis 31 TopLevelLoops.clear(); 32 } 33 34 35 //===----------------------------------------------------------------------===// 36 // LoopInfo implementation 37 // 38 bool LoopInfo::runOnFunction(Function *F) { 39 releaseMemory(); 40 Calculate(getAnalysis<DominatorSet>()); // Update 41 return false; 42 } 43 44 void LoopInfo::Calculate(const DominatorSet &DS) { 45 BasicBlock *RootNode = DS.getRoot(); 46 47 for (df_iterator<BasicBlock*> NI = df_begin(RootNode), 48 NE = df_end(RootNode); NI != NE; ++NI) 49 if (Loop *L = ConsiderForLoop(*NI, DS)) 50 TopLevelLoops.push_back(L); 51 52 for (unsigned i = 0; i < TopLevelLoops.size(); ++i) 53 TopLevelLoops[i]->setLoopDepth(1); 54 } 55 56 void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { 57 AU.setPreservesAll(); 58 AU.addRequired(DominatorSet::ID); 59 AU.addProvided(ID); 60 } 61 62 63 Loop *LoopInfo::ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS) { 64 if (BBMap.find(BB) != BBMap.end()) return 0; // Havn't processed this node? 65 66 std::vector<BasicBlock *> TodoStack; 67 68 // Scan the predecessors of BB, checking to see if BB dominates any of 69 // them. 70 for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) 71 if (DS.dominates(BB, *I)) // If BB dominates it's predecessor... 72 TodoStack.push_back(*I); 73 74 if (TodoStack.empty()) return 0; // Doesn't dominate any predecessors... 75 76 // Create a new loop to represent this basic block... 77 Loop *L = new Loop(BB); 78 BBMap[BB] = L; 79 80 while (!TodoStack.empty()) { // Process all the nodes in the loop 81 BasicBlock *X = TodoStack.back(); 82 TodoStack.pop_back(); 83 84 if (!L->contains(X)) { // As of yet unprocessed?? 85 L->Blocks.push_back(X); 86 87 // Add all of the predecessors of X to the end of the work stack... 88 TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X)); 89 } 90 } 91 92 // Add the basic blocks that comprise this loop to the BBMap so that this 93 // loop can be found for them. Also check subsidary basic blocks to see if 94 // they start subloops of their own. 95 // 96 for (std::vector<BasicBlock*>::reverse_iterator I = L->Blocks.rbegin(), 97 E = L->Blocks.rend(); I != E; ++I) { 98 99 // Check to see if this block starts a new loop 100 if (Loop *NewLoop = ConsiderForLoop(*I, DS)) { 101 L->SubLoops.push_back(NewLoop); 102 NewLoop->ParentLoop = L; 103 } 104 105 if (BBMap.find(*I) == BBMap.end()) 106 BBMap.insert(std::make_pair(*I, L)); 107 } 108 109 return L; 110 } 111