| Chris Lattner | cf3056d | 2003-10-13 03:32:08 +0000 | [diff] [blame] | 1 | //===- LoopInfo.cpp - Natural Loop Calculator -----------------------------===// | 
| John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the LLVM research group and is distributed under | 
|  | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 9 | // | 
|  | 10 | // This file defines the LoopInfo class that is used to identify natural loops | 
|  | 11 | // and determine the loop depth of various nodes of the CFG.  Note that the | 
|  | 12 | // loops identified may actually be several natural loops that share the same | 
|  | 13 | // header node... not just a single natural loop. | 
|  | 14 | // | 
|  | 15 | //===----------------------------------------------------------------------===// | 
|  | 16 |  | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 17 | #include "llvm/Analysis/Dominators.h" | 
| Misha Brukman | 10d208d | 2004-01-30 17:26:24 +0000 | [diff] [blame^] | 18 | #include "llvm/Analysis/LoopInfo.h" | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 19 | #include "llvm/Assembly/Writer.h" | 
| Misha Brukman | 10d208d | 2004-01-30 17:26:24 +0000 | [diff] [blame^] | 20 | #include "llvm/Support/CFG.h" | 
| Chris Lattner | cee8f9a | 2001-11-27 00:03:19 +0000 | [diff] [blame] | 21 | #include "Support/DepthFirstIterator.h" | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 22 | #include <algorithm> | 
|  | 23 |  | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 24 | namespace llvm { | 
|  | 25 |  | 
| Chris Lattner | 1e43516 | 2002-07-26 21:12:44 +0000 | [diff] [blame] | 26 | static RegisterAnalysis<LoopInfo> | 
| Chris Lattner | 17689df | 2002-07-30 16:27:52 +0000 | [diff] [blame] | 27 | X("loops", "Natural Loop Construction", true); | 
| Chris Lattner | 93193f8 | 2002-01-31 00:42:27 +0000 | [diff] [blame] | 28 |  | 
|  | 29 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | 1b7f7dc | 2002-04-28 16:21:30 +0000 | [diff] [blame] | 30 | // Loop implementation | 
| Chris Lattner | 93193f8 | 2002-01-31 00:42:27 +0000 | [diff] [blame] | 31 | // | 
| Chris Lattner | 0f99555 | 2002-06-03 22:10:52 +0000 | [diff] [blame] | 32 | bool Loop::contains(const BasicBlock *BB) const { | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 33 | return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end(); | 
|  | 34 | } | 
|  | 35 |  | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 36 | bool Loop::isLoopExit(const BasicBlock *BB) const { | 
| Chris Lattner | 03f252f | 2003-09-24 22:18:35 +0000 | [diff] [blame] | 37 | for (succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB); | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 38 | SI != SE; ++SI) { | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 39 | if (!contains(*SI)) | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 40 | return true; | 
|  | 41 | } | 
|  | 42 | return false; | 
|  | 43 | } | 
|  | 44 |  | 
| Chris Lattner | 2ef1236 | 2003-10-12 22:14:27 +0000 | [diff] [blame] | 45 | /// getNumBackEdges - Calculate the number of back edges to the loop header. | 
|  | 46 | /// | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 47 | unsigned Loop::getNumBackEdges() const { | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 48 | unsigned NumBackEdges = 0; | 
|  | 49 | BasicBlock *H = getHeader(); | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 50 |  | 
| Chris Lattner | 2ef1236 | 2003-10-12 22:14:27 +0000 | [diff] [blame] | 51 | for (pred_iterator I = pred_begin(H), E = pred_end(H); I != E; ++I) | 
|  | 52 | if (contains(*I)) | 
|  | 53 | ++NumBackEdges; | 
|  | 54 |  | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 55 | return NumBackEdges; | 
| Misha Brukman | 6b290a5 | 2002-10-11 05:31:10 +0000 | [diff] [blame] | 56 | } | 
|  | 57 |  | 
| Chris Lattner | 7dd46b0 | 2003-08-16 20:57:16 +0000 | [diff] [blame] | 58 | void Loop::print(std::ostream &OS, unsigned Depth) const { | 
|  | 59 | OS << std::string(Depth*2, ' ') << "Loop Containing: "; | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 60 |  | 
|  | 61 | for (unsigned i = 0; i < getBlocks().size(); ++i) { | 
|  | 62 | if (i) OS << ","; | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 63 | WriteAsOperand(OS, getBlocks()[i], false); | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 64 | } | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 65 | if (!ExitBlocks.empty()) { | 
|  | 66 | OS << "\tExitBlocks: "; | 
|  | 67 | for (unsigned i = 0; i < getExitBlocks().size(); ++i) { | 
|  | 68 | if (i) OS << ","; | 
|  | 69 | WriteAsOperand(OS, getExitBlocks()[i], false); | 
|  | 70 | } | 
|  | 71 | } | 
|  | 72 |  | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 73 | OS << "\n"; | 
|  | 74 |  | 
| Chris Lattner | 329c1c6 | 2004-01-08 00:09:44 +0000 | [diff] [blame] | 75 | for (iterator I = begin(), E = end(); I != E; ++I) | 
|  | 76 | (*I)->print(OS, Depth+2); | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 77 | } | 
|  | 78 |  | 
| Chris Lattner | bb05f1e | 2003-02-28 16:54:45 +0000 | [diff] [blame] | 79 | void Loop::dump() const { | 
|  | 80 | print(std::cerr); | 
|  | 81 | } | 
|  | 82 |  | 
| Chris Lattner | 420df9b | 2003-02-22 21:33:11 +0000 | [diff] [blame] | 83 |  | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 84 | //===----------------------------------------------------------------------===// | 
|  | 85 | // LoopInfo implementation | 
|  | 86 | // | 
| Anand Shukla | e0b6b78 | 2002-08-26 16:45:19 +0000 | [diff] [blame] | 87 | void LoopInfo::stub() {} | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 88 |  | 
|  | 89 | bool LoopInfo::runOnFunction(Function &) { | 
|  | 90 | releaseMemory(); | 
|  | 91 | Calculate(getAnalysis<DominatorSet>());    // Update | 
|  | 92 | return false; | 
|  | 93 | } | 
|  | 94 |  | 
| Chris Lattner | 1b7f7dc | 2002-04-28 16:21:30 +0000 | [diff] [blame] | 95 | void LoopInfo::releaseMemory() { | 
| Chris Lattner | 918c4ec | 2002-04-09 05:43:19 +0000 | [diff] [blame] | 96 | for (std::vector<Loop*>::iterator I = TopLevelLoops.begin(), | 
|  | 97 | E = TopLevelLoops.end(); I != E; ++I) | 
|  | 98 | delete *I;   // Delete all of the loops... | 
|  | 99 |  | 
|  | 100 | BBMap.clear();                             // Reset internal state of analysis | 
|  | 101 | TopLevelLoops.clear(); | 
|  | 102 | } | 
|  | 103 |  | 
| Chris Lattner | 93193f8 | 2002-01-31 00:42:27 +0000 | [diff] [blame] | 104 |  | 
| Chris Lattner | 1b7f7dc | 2002-04-28 16:21:30 +0000 | [diff] [blame] | 105 | void LoopInfo::Calculate(const DominatorSet &DS) { | 
| Chris Lattner | a298d27 | 2002-04-28 00:15:57 +0000 | [diff] [blame] | 106 | BasicBlock *RootNode = DS.getRoot(); | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 107 |  | 
| Chris Lattner | a298d27 | 2002-04-28 00:15:57 +0000 | [diff] [blame] | 108 | for (df_iterator<BasicBlock*> NI = df_begin(RootNode), | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 109 | NE = df_end(RootNode); NI != NE; ++NI) | 
|  | 110 | if (Loop *L = ConsiderForLoop(*NI, DS)) | 
|  | 111 | TopLevelLoops.push_back(L); | 
|  | 112 |  | 
|  | 113 | for (unsigned i = 0; i < TopLevelLoops.size(); ++i) | 
|  | 114 | TopLevelLoops[i]->setLoopDepth(1); | 
|  | 115 | } | 
|  | 116 |  | 
| Chris Lattner | 1b7f7dc | 2002-04-28 16:21:30 +0000 | [diff] [blame] | 117 | void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { | 
| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 118 | AU.setPreservesAll(); | 
| Chris Lattner | dd5b495 | 2002-08-08 19:01:28 +0000 | [diff] [blame] | 119 | AU.addRequired<DominatorSet>(); | 
| Chris Lattner | 93193f8 | 2002-01-31 00:42:27 +0000 | [diff] [blame] | 120 | } | 
|  | 121 |  | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 122 | void LoopInfo::print(std::ostream &OS) const { | 
| Chris Lattner | fce46ef | 2002-09-26 16:15:54 +0000 | [diff] [blame] | 123 | for (unsigned i = 0; i < TopLevelLoops.size(); ++i) | 
|  | 124 | TopLevelLoops[i]->print(OS); | 
| Chris Lattner | 420df9b | 2003-02-22 21:33:11 +0000 | [diff] [blame] | 125 | #if 0 | 
|  | 126 | for (std::map<BasicBlock*, Loop*>::const_iterator I = BBMap.begin(), | 
|  | 127 | E = BBMap.end(); I != E; ++I) | 
|  | 128 | OS << "BB '" << I->first->getName() << "' level = " | 
|  | 129 | << I->second->LoopDepth << "\n"; | 
|  | 130 | #endif | 
| Chris Lattner | a59cbb2 | 2002-07-27 01:12:17 +0000 | [diff] [blame] | 131 | } | 
| Chris Lattner | 93193f8 | 2002-01-31 00:42:27 +0000 | [diff] [blame] | 132 |  | 
| Chris Lattner | 39c987a | 2003-05-15 18:03:51 +0000 | [diff] [blame] | 133 | static bool isNotAlreadyContainedIn(Loop *SubLoop, Loop *ParentLoop) { | 
|  | 134 | if (SubLoop == 0) return true; | 
|  | 135 | if (SubLoop == ParentLoop) return false; | 
|  | 136 | return isNotAlreadyContainedIn(SubLoop->getParentLoop(), ParentLoop); | 
|  | 137 | } | 
|  | 138 |  | 
| Chris Lattner | 1b7f7dc | 2002-04-28 16:21:30 +0000 | [diff] [blame] | 139 | Loop *LoopInfo::ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS) { | 
| Chris Lattner | 699b305 | 2002-09-26 05:32:50 +0000 | [diff] [blame] | 140 | if (BBMap.find(BB) != BBMap.end()) return 0;   // Haven't processed this node? | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 141 |  | 
| Chris Lattner | a298d27 | 2002-04-28 00:15:57 +0000 | [diff] [blame] | 142 | std::vector<BasicBlock *> TodoStack; | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 143 |  | 
|  | 144 | // Scan the predecessors of BB, checking to see if BB dominates any of | 
| Chris Lattner | 99224ae | 2003-04-26 19:34:18 +0000 | [diff] [blame] | 145 | // them.  This identifies backedges which target this node... | 
| Chris Lattner | a298d27 | 2002-04-28 00:15:57 +0000 | [diff] [blame] | 146 | for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 147 | if (DS.dominates(BB, *I))   // If BB dominates it's predecessor... | 
|  | 148 | TodoStack.push_back(*I); | 
|  | 149 |  | 
| Chris Lattner | 99224ae | 2003-04-26 19:34:18 +0000 | [diff] [blame] | 150 | if (TodoStack.empty()) return 0;  // No backedges to this block... | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 151 |  | 
|  | 152 | // Create a new loop to represent this basic block... | 
|  | 153 | Loop *L = new Loop(BB); | 
|  | 154 | BBMap[BB] = L; | 
|  | 155 |  | 
| Chris Lattner | 59dc178 | 2003-10-22 16:41:21 +0000 | [diff] [blame] | 156 | BasicBlock *EntryBlock = &BB->getParent()->getEntryBlock(); | 
|  | 157 |  | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 158 | while (!TodoStack.empty()) {  // Process all the nodes in the loop | 
| Chris Lattner | a298d27 | 2002-04-28 00:15:57 +0000 | [diff] [blame] | 159 | BasicBlock *X = TodoStack.back(); | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 160 | TodoStack.pop_back(); | 
|  | 161 |  | 
| Chris Lattner | 59dc178 | 2003-10-22 16:41:21 +0000 | [diff] [blame] | 162 | if (!L->contains(X) &&         // As of yet unprocessed?? | 
|  | 163 | DS.dominates(EntryBlock, X)) {   // X is reachable from entry block? | 
| Chris Lattner | 99224ae | 2003-04-26 19:34:18 +0000 | [diff] [blame] | 164 | // Check to see if this block already belongs to a loop.  If this occurs | 
|  | 165 | // then we have a case where a loop that is supposed to be a child of the | 
|  | 166 | // current loop was processed before the current loop.  When this occurs, | 
|  | 167 | // this child loop gets added to a part of the current loop, making it a | 
|  | 168 | // sibling to the current loop.  We have to reparent this loop. | 
|  | 169 | if (Loop *SubLoop = const_cast<Loop*>(getLoopFor(X))) | 
| Chris Lattner | 39c987a | 2003-05-15 18:03:51 +0000 | [diff] [blame] | 170 | if (SubLoop->getHeader() == X && isNotAlreadyContainedIn(SubLoop, L)) { | 
| Chris Lattner | 99224ae | 2003-04-26 19:34:18 +0000 | [diff] [blame] | 171 | // Remove the subloop from it's current parent... | 
|  | 172 | assert(SubLoop->ParentLoop && SubLoop->ParentLoop != L); | 
|  | 173 | Loop *SLP = SubLoop->ParentLoop;  // SubLoopParent | 
|  | 174 | std::vector<Loop*>::iterator I = | 
|  | 175 | std::find(SLP->SubLoops.begin(), SLP->SubLoops.end(), SubLoop); | 
|  | 176 | assert(I != SLP->SubLoops.end() && "SubLoop not a child of parent?"); | 
|  | 177 | SLP->SubLoops.erase(I);   // Remove from parent... | 
|  | 178 |  | 
|  | 179 | // Add the subloop to THIS loop... | 
|  | 180 | SubLoop->ParentLoop = L; | 
|  | 181 | L->SubLoops.push_back(SubLoop); | 
|  | 182 | } | 
|  | 183 |  | 
|  | 184 | // Normal case, add the block to our loop... | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 185 | L->Blocks.push_back(X); | 
| Chris Lattner | 99224ae | 2003-04-26 19:34:18 +0000 | [diff] [blame] | 186 |  | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 187 | // Add all of the predecessors of X to the end of the work stack... | 
| Chris Lattner | 455889a | 2002-02-12 22:39:50 +0000 | [diff] [blame] | 188 | TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X)); | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 189 | } | 
|  | 190 | } | 
|  | 191 |  | 
| Chris Lattner | 420df9b | 2003-02-22 21:33:11 +0000 | [diff] [blame] | 192 | // If there are any loops nested within this loop, create them now! | 
|  | 193 | for (std::vector<BasicBlock*>::iterator I = L->Blocks.begin(), | 
|  | 194 | E = L->Blocks.end(); I != E; ++I) | 
|  | 195 | if (Loop *NewLoop = ConsiderForLoop(*I, DS)) { | 
|  | 196 | L->SubLoops.push_back(NewLoop); | 
|  | 197 | NewLoop->ParentLoop = L; | 
|  | 198 | } | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 199 |  | 
| Chris Lattner | 420df9b | 2003-02-22 21:33:11 +0000 | [diff] [blame] | 200 | // Add the basic blocks that comprise this loop to the BBMap so that this | 
|  | 201 | // loop can be found for them. | 
|  | 202 | // | 
|  | 203 | for (std::vector<BasicBlock*>::iterator I = L->Blocks.begin(), | 
|  | 204 | E = L->Blocks.end(); I != E; ++I) { | 
|  | 205 | std::map<BasicBlock*, Loop*>::iterator BBMI = BBMap.lower_bound(*I); | 
|  | 206 | if (BBMI == BBMap.end() || BBMI->first != *I)  // Not in map yet... | 
|  | 207 | BBMap.insert(BBMI, std::make_pair(*I, L));   // Must be at this level | 
|  | 208 | } | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 209 |  | 
| Chris Lattner | 7dd46b0 | 2003-08-16 20:57:16 +0000 | [diff] [blame] | 210 | // Now that we have a list of all of the child loops of this loop, check to | 
|  | 211 | // see if any of them should actually be nested inside of each other.  We can | 
|  | 212 | // accidentally pull loops our of their parents, so we must make sure to | 
|  | 213 | // organize the loop nests correctly now. | 
|  | 214 | { | 
|  | 215 | std::map<BasicBlock*, Loop*> ContainingLoops; | 
|  | 216 | for (unsigned i = 0; i != L->SubLoops.size(); ++i) { | 
|  | 217 | Loop *Child = L->SubLoops[i]; | 
|  | 218 | assert(Child->getParentLoop() == L && "Not proper child loop?"); | 
|  | 219 |  | 
|  | 220 | if (Loop *ContainingLoop = ContainingLoops[Child->getHeader()]) { | 
|  | 221 | // If there is already a loop which contains this loop, move this loop | 
|  | 222 | // into the containing loop. | 
|  | 223 | MoveSiblingLoopInto(Child, ContainingLoop); | 
|  | 224 | --i;  // The loop got removed from the SubLoops list. | 
|  | 225 | } else { | 
|  | 226 | // This is currently considered to be a top-level loop.  Check to see if | 
|  | 227 | // any of the contained blocks are loop headers for subloops we have | 
|  | 228 | // already processed. | 
|  | 229 | for (unsigned b = 0, e = Child->Blocks.size(); b != e; ++b) { | 
|  | 230 | Loop *&BlockLoop = ContainingLoops[Child->Blocks[b]]; | 
|  | 231 | if (BlockLoop == 0) {   // Child block not processed yet... | 
|  | 232 | BlockLoop = Child; | 
|  | 233 | } else if (BlockLoop != Child) { | 
| Chris Lattner | 169db9d | 2003-08-17 21:47:33 +0000 | [diff] [blame] | 234 | Loop *SubLoop = BlockLoop; | 
|  | 235 | // Reparent all of the blocks which used to belong to BlockLoops | 
|  | 236 | for (unsigned j = 0, e = SubLoop->Blocks.size(); j != e; ++j) | 
|  | 237 | ContainingLoops[SubLoop->Blocks[j]] = Child; | 
|  | 238 |  | 
| Chris Lattner | 7dd46b0 | 2003-08-16 20:57:16 +0000 | [diff] [blame] | 239 | // There is already a loop which contains this block, that means | 
|  | 240 | // that we should reparent the loop which the block is currently | 
|  | 241 | // considered to belong to to be a child of this loop. | 
| Chris Lattner | 169db9d | 2003-08-17 21:47:33 +0000 | [diff] [blame] | 242 | MoveSiblingLoopInto(SubLoop, Child); | 
| Chris Lattner | 7dd46b0 | 2003-08-16 20:57:16 +0000 | [diff] [blame] | 243 | --i;  // We just shrunk the SubLoops list. | 
|  | 244 | } | 
|  | 245 | } | 
|  | 246 | } | 
|  | 247 | } | 
|  | 248 | } | 
|  | 249 |  | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 250 | // Now that we know all of the blocks that make up this loop, see if there are | 
|  | 251 | // any branches to outside of the loop... building the ExitBlocks list. | 
|  | 252 | for (std::vector<BasicBlock*>::iterator BI = L->Blocks.begin(), | 
|  | 253 | BE = L->Blocks.end(); BI != BE; ++BI) | 
|  | 254 | for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I) | 
|  | 255 | if (!L->contains(*I))               // Not in current loop? | 
|  | 256 | L->ExitBlocks.push_back(*I);      // It must be an exit block... | 
|  | 257 |  | 
| Chris Lattner | 0bbe58f | 2001-11-26 18:41:20 +0000 | [diff] [blame] | 258 | return L; | 
|  | 259 | } | 
| Chris Lattner | 699b305 | 2002-09-26 05:32:50 +0000 | [diff] [blame] | 260 |  | 
| Chris Lattner | 7dd46b0 | 2003-08-16 20:57:16 +0000 | [diff] [blame] | 261 | /// MoveSiblingLoopInto - This method moves the NewChild loop to live inside of | 
|  | 262 | /// the NewParent Loop, instead of being a sibling of it. | 
|  | 263 | void LoopInfo::MoveSiblingLoopInto(Loop *NewChild, Loop *NewParent) { | 
|  | 264 | Loop *OldParent = NewChild->getParentLoop(); | 
|  | 265 | assert(OldParent && OldParent == NewParent->getParentLoop() && | 
|  | 266 | NewChild != NewParent && "Not sibling loops!"); | 
|  | 267 |  | 
|  | 268 | // Remove NewChild from being a child of OldParent | 
|  | 269 | std::vector<Loop*>::iterator I = | 
|  | 270 | std::find(OldParent->SubLoops.begin(), OldParent->SubLoops.end(), NewChild); | 
|  | 271 | assert(I != OldParent->SubLoops.end() && "Parent fields incorrect??"); | 
|  | 272 | OldParent->SubLoops.erase(I);   // Remove from parent's subloops list | 
|  | 273 | NewChild->ParentLoop = 0; | 
|  | 274 |  | 
|  | 275 | InsertLoopInto(NewChild, NewParent); | 
|  | 276 | } | 
|  | 277 |  | 
|  | 278 | /// InsertLoopInto - This inserts loop L into the specified parent loop.  If the | 
|  | 279 | /// parent loop contains a loop which should contain L, the loop gets inserted | 
|  | 280 | /// into L instead. | 
|  | 281 | void LoopInfo::InsertLoopInto(Loop *L, Loop *Parent) { | 
|  | 282 | BasicBlock *LHeader = L->getHeader(); | 
|  | 283 | assert(Parent->contains(LHeader) && "This loop should not be inserted here!"); | 
|  | 284 |  | 
|  | 285 | // Check to see if it belongs in a child loop... | 
|  | 286 | for (unsigned i = 0, e = Parent->SubLoops.size(); i != e; ++i) | 
|  | 287 | if (Parent->SubLoops[i]->contains(LHeader)) { | 
|  | 288 | InsertLoopInto(L, Parent->SubLoops[i]); | 
|  | 289 | return; | 
|  | 290 | } | 
|  | 291 |  | 
|  | 292 | // If not, insert it here! | 
|  | 293 | Parent->SubLoops.push_back(L); | 
|  | 294 | L->ParentLoop = Parent; | 
|  | 295 | } | 
|  | 296 |  | 
|  | 297 |  | 
|  | 298 |  | 
| Chris Lattner | 699b305 | 2002-09-26 05:32:50 +0000 | [diff] [blame] | 299 | /// getLoopPreheader - If there is a preheader for this loop, return it.  A | 
|  | 300 | /// loop has a preheader if there is only one edge to the header of the loop | 
|  | 301 | /// from outside of the loop.  If this is the case, the block branching to the | 
|  | 302 | /// header of the loop is the preheader node.  The "preheaders" pass can be | 
|  | 303 | /// "Required" to ensure that there is always a preheader node for every loop. | 
|  | 304 | /// | 
|  | 305 | /// This method returns null if there is no preheader for the loop (either | 
|  | 306 | /// because the loop is dead or because multiple blocks branch to the header | 
|  | 307 | /// node of this loop). | 
|  | 308 | /// | 
|  | 309 | BasicBlock *Loop::getLoopPreheader() const { | 
|  | 310 | // Keep track of nodes outside the loop branching to the header... | 
|  | 311 | BasicBlock *Out = 0; | 
|  | 312 |  | 
|  | 313 | // Loop over the predecessors of the header node... | 
|  | 314 | BasicBlock *Header = getHeader(); | 
|  | 315 | for (pred_iterator PI = pred_begin(Header), PE = pred_end(Header); | 
|  | 316 | PI != PE; ++PI) | 
| Chris Lattner | c8f25d9 | 2002-09-29 22:59:29 +0000 | [diff] [blame] | 317 | if (!contains(*PI)) {     // If the block is not in the loop... | 
|  | 318 | if (Out && Out != *PI) | 
|  | 319 | return 0;             // Multiple predecessors outside the loop | 
| Chris Lattner | 699b305 | 2002-09-26 05:32:50 +0000 | [diff] [blame] | 320 | Out = *PI; | 
|  | 321 | } | 
| Chris Lattner | 5a8a291 | 2003-02-27 21:51:38 +0000 | [diff] [blame] | 322 |  | 
|  | 323 | // Make sure there is only one exit out of the preheader... | 
|  | 324 | succ_iterator SI = succ_begin(Out); | 
|  | 325 | ++SI; | 
|  | 326 | if (SI != succ_end(Out)) | 
|  | 327 | return 0;  // Multiple exits from the block, must not be a preheader. | 
|  | 328 |  | 
| Chris Lattner | 699b305 | 2002-09-26 05:32:50 +0000 | [diff] [blame] | 329 |  | 
|  | 330 | // If there is exactly one preheader, return it.  If there was zero, then Out | 
|  | 331 | // is still null. | 
|  | 332 | return Out; | 
|  | 333 | } | 
|  | 334 |  | 
|  | 335 | /// addBasicBlockToLoop - This function is used by other analyses to update loop | 
|  | 336 | /// information.  NewBB is set to be a new member of the current loop.  Because | 
|  | 337 | /// of this, it is added as a member of all parent loops, and is added to the | 
|  | 338 | /// specified LoopInfo object as being in the current basic block.  It is not | 
|  | 339 | /// valid to replace the loop header with this method. | 
|  | 340 | /// | 
|  | 341 | void Loop::addBasicBlockToLoop(BasicBlock *NewBB, LoopInfo &LI) { | 
|  | 342 | assert(LI[getHeader()] == this && "Incorrect LI specified for this loop!"); | 
|  | 343 | assert(NewBB && "Cannot add a null basic block to the loop!"); | 
|  | 344 | assert(LI[NewBB] == 0 && "BasicBlock already in the loop!"); | 
|  | 345 |  | 
|  | 346 | // Add the loop mapping to the LoopInfo object... | 
|  | 347 | LI.BBMap[NewBB] = this; | 
|  | 348 |  | 
|  | 349 | // Add the basic block to this loop and all parent loops... | 
|  | 350 | Loop *L = this; | 
|  | 351 | while (L) { | 
|  | 352 | L->Blocks.push_back(NewBB); | 
|  | 353 | L = L->getParentLoop(); | 
|  | 354 | } | 
|  | 355 | } | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 356 |  | 
| Chris Lattner | f2e2925 | 2003-02-27 22:37:44 +0000 | [diff] [blame] | 357 | /// changeExitBlock - This method is used to update loop information.  All | 
|  | 358 | /// instances of the specified Old basic block are removed from the exit list | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 359 | /// and replaced with New. | 
|  | 360 | /// | 
|  | 361 | void Loop::changeExitBlock(BasicBlock *Old, BasicBlock *New) { | 
|  | 362 | assert(Old != New && "Cannot changeExitBlock to the same thing!"); | 
|  | 363 | assert(Old && New && "Cannot changeExitBlock to or from a null node!"); | 
| Chris Lattner | a94837a | 2003-02-27 22:48:08 +0000 | [diff] [blame] | 364 | assert(hasExitBlock(Old) && "Old exit block not found!"); | 
|  | 365 | std::vector<BasicBlock*>::iterator | 
|  | 366 | I = std::find(ExitBlocks.begin(), ExitBlocks.end(), Old); | 
| Chris Lattner | f2e2925 | 2003-02-27 22:37:44 +0000 | [diff] [blame] | 367 | while (I != ExitBlocks.end()) { | 
|  | 368 | *I = New; | 
|  | 369 | I = std::find(I+1, ExitBlocks.end(), Old); | 
|  | 370 | } | 
| Chris Lattner | 5f82b8a | 2003-02-27 00:38:34 +0000 | [diff] [blame] | 371 | } | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 372 |  | 
|  | 373 | } // End llvm namespace |