Author: resistor Date: Mon Nov 26 21:43:35 2007 New Revision: 44348 URL: http://llvm.org/viewvc/llvm-project?rev=44348&view=rev Log: Make LoopInfoBase more generic, in preparation for having MachineLoopInfo. This involves a small interface change.
Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h llvm/trunk/lib/Analysis/LoopInfo.cpp llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original) +++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Mon Nov 26 21:43:35 2007 @@ -65,7 +65,7 @@ template<class BlockT> class LoopBase { LoopBase<BlockT> *ParentLoop; - std::vector<LoopBase<BlockT>*> SubLoops; // Loops contained entirely within this one + std::vector<LoopBase<BlockT>*> SubLoops; // Loops contained entirely within this one std::vector<BlockT*> Blocks; // First entry is the header node LoopBase(const LoopBase<BlockT> &); // DO NOT IMPLEMENT @@ -113,8 +113,10 @@ /// that is outside of the current loop. /// bool isLoopExit(const BlockT *BB) const { - for (succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB); - SI != SE; ++SI) { + typedef GraphTraits<BlockT*> BlockTraits; + for (typename BlockTraits::ChildIteratorType SI = + BlockTraits::child_begin(const_cast<BlockT*>(BB)), + SE = BlockTraits::child_end(const_cast<BlockT*>(BB)); SI != SE; ++SI) { if (!contains(*SI)) return true; } @@ -127,7 +129,10 @@ unsigned NumBackEdges = 0; BlockT *H = getHeader(); - for (pred_iterator I = pred_begin(H), E = pred_end(H); I != E; ++I) + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + for (typename InvBlockTraits::ChildIteratorType I = + InvBlockTraits::child_begin(const_cast<BlockT*>(H)), + E = InvBlockTraits::child_end(const_cast<BlockT*>(H)); I != E; ++I) if (contains(*I)) ++NumBackEdges; @@ -160,9 +165,12 @@ SmallVector<BlockT*, 128> LoopBBs(block_begin(), block_end()); std::sort(LoopBBs.begin(), LoopBBs.end()); + typedef GraphTraits<BlockT*> BlockTraits; for (typename std::vector<BlockT*>::const_iterator BI = Blocks.begin(), BE = Blocks.end(); BI != BE; ++BI) - for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I) + for (typename BlockTraits::ChildIteratorType I = + BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI); + I != E; ++I) if (!std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I)) { // Not in current loop? It must be an exit block. ExitingBlocks.push_back(*BI); @@ -179,9 +187,12 @@ SmallVector<BlockT*, 128> LoopBBs(block_begin(), block_end()); std::sort(LoopBBs.begin(), LoopBBs.end()); + typedef GraphTraits<BlockT*> BlockTraits; for (typename std::vector<BlockT*>::const_iterator BI = Blocks.begin(), BE = Blocks.end(); BI != BE; ++BI) - for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I) + for (typename BlockTraits::ChildIteratorType I = + BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI); + I != E; ++I) if (!std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I)) // Not in current loop? It must be an exit block. ExitBlocks.push_back(*I); @@ -205,12 +216,17 @@ BlockT *current = *BI; switchExitBlocks.clear(); - for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I) { + typedef GraphTraits<BlockT*> BlockTraits; + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + for (typename BlockTraits::ChildIteratorType I = + BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI); + I != E; ++I) { if (std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I)) // If block is inside the loop then it is not a exit block. continue; - - pred_iterator PI = pred_begin(*I); + + typename InvBlockTraits::ChildIteratorType PI = + InvBlockTraits::child_begin(*I); BlockT *firstPred = *PI; // If current basic block is this exit block's first predecessor @@ -223,7 +239,8 @@ // If a terminator has more then two successors, for example SwitchInst, // then it is possible that there are multiple edges from current block // to one exit block. - if (current->getTerminator()->getNumSuccessors() <= 2) { + if (std::distance(BlockTraits::child_begin(current), + BlockTraits::child_end(current)) <= 2) { ExitBlocks.push_back(*I); continue; } @@ -253,8 +270,11 @@ // Loop over the predecessors of the header node... BlockT *Header = getHeader(); - for (pred_iterator PI = pred_begin(Header), PE = pred_end(Header); - PI != PE; ++PI) + typedef GraphTraits<BlockT*> BlockTraits; + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + for (typename InvBlockTraits::ChildIteratorType PI = + InvBlockTraits::child_begin(Header), + PE = InvBlockTraits::child_end(Header); PI != PE; ++PI) if (!contains(*PI)) { // If the block is not in the loop... if (Out && Out != *PI) return 0; // Multiple predecessors outside the loop @@ -263,9 +283,9 @@ // Make sure there is only one exit out of the preheader. assert(Out && "Header of loop has no predecessors from outside loop?"); - succ_iterator SI = succ_begin(Out); + typename BlockTraits::ChildIteratorType SI = BlockTraits::child_begin(Out); ++SI; - if (SI != succ_end(Out)) + if (SI != BlockTraits::child_end(Out)) return 0; // Multiple exits from the block, must not be a preheader. // If there is exactly one preheader, return it. If there was zero, then Out @@ -279,7 +299,11 @@ /// block. BlockT *getLoopLatch() const { BlockT *Header = getHeader(); - pred_iterator PI = pred_begin(Header), PE = pred_end(Header); + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + typename InvBlockTraits::ChildIteratorType PI = + InvBlockTraits::child_begin(Header); + typename InvBlockTraits::ChildIteratorType PE = + InvBlockTraits::child_end(Header); if (PI == PE) return 0; // no preds? BlockT *Latch = 0; @@ -307,12 +331,15 @@ BlockT *H = getHeader(); BlockT *Incoming = 0, *Backedge = 0; - pred_iterator PI = pred_begin(H); - assert(PI != pred_end(H) && "Loop must have at least one backedge!"); + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + typename InvBlockTraits::ChildIteratorType PI = + InvBlockTraits::child_begin(H); + assert(PI != InvBlockTraits::child_end(H) && + "Loop must have at least one backedge!"); Backedge = *PI++; - if (PI == pred_end(H)) return 0; // dead loop + if (PI == InvBlockTraits::child_end(H)) return 0; // dead loop Incoming = *PI++; - if (PI != pred_end(H)) return 0; // multiple backedges? + if (PI != InvBlockTraits::child_end(H)) return 0; // multiple backedges? if (contains(Incoming)) { if (contains(Backedge)) @@ -414,7 +441,7 @@ /// to the specified LoopInfo object as being in the current basic block. It /// is not valid to replace the loop header with this method. /// - void addBasicBlockToLoop(BlockT *NewBB, LoopInfo &LI); + void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase<BlockT> &LI); /// replaceChildLoopWith - This is used when splitting loops up. It replaces /// the OldChild entry in our children list with NewChild, and updates the @@ -533,7 +560,7 @@ template<class BlockT> class LoopInfoBase { // BBMap - Mapping of basic blocks to the inner most loop they occur in - std::map<BlockT*, Loop*> BBMap; + std::map<BlockT*, LoopBase<BlockT>*> BBMap; std::vector<LoopBase<BlockT>*> TopLevelLoops; friend class LoopBase<BlockT>; @@ -562,7 +589,7 @@ /// LoopBase<BlockT> *getLoopFor(const BlockT *BB) const { typename std::map<BlockT *, LoopBase<BlockT>*>::const_iterator I= - BBMap.find(const_cast<BasicBlock*>(BB)); + BBMap.find(const_cast<BlockT*>(BB)); return I != BBMap.end() ? I->second : 0; } @@ -575,13 +602,13 @@ /// getLoopDepth - Return the loop nesting level of the specified block... /// unsigned getLoopDepth(const BlockT *BB) const { - const Loop *L = getLoopFor(BB); + const LoopBase<BlockT> *L = getLoopFor(BB); return L ? L->getLoopDepth() : 0; } // isLoopHeader - True if the block is a loop header node bool isLoopHeader(BlockT *BB) const { - const Loop *L = getLoopFor(BB); + const LoopBase<BlockT> *L = getLoopFor(BB); return L && L->getHeader() == BB; } @@ -630,7 +657,7 @@ void removeBlock(BlockT *BB) { typename std::map<BlockT *, LoopBase<BlockT>*>::iterator I = BBMap.find(BB); if (I != BBMap.end()) { - for (Loop *L = I->second; L; L = L->getParentLoop()) + for (LoopBase<BlockT> *L = I->second; L; L = L->getParentLoop()) L->removeBlockFromLoop(BB); BBMap.erase(I); @@ -639,13 +666,14 @@ // Internals - static bool isNotAlreadyContainedIn(Loop *SubLoop, Loop *ParentLoop) { + static bool isNotAlreadyContainedIn(LoopBase<BlockT> *SubLoop, + LoopBase<BlockT> *ParentLoop) { if (SubLoop == 0) return true; if (SubLoop == ParentLoop) return false; return isNotAlreadyContainedIn(SubLoop->getParentLoop(), ParentLoop); } - void Calculate(DominatorTree &DT) { + void Calculate(DominatorTreeBase<BlockT> &DT) { BlockT *RootNode = DT.getRootNode()->getBlock(); for (df_iterator<BlockT*> NI = df_begin(RootNode), @@ -654,14 +682,17 @@ TopLevelLoops.push_back(L); } - LoopBase<BlockT> *ConsiderForLoop(BlockT *BB, DominatorTree &DT) { + LoopBase<BlockT> *ConsiderForLoop(BlockT *BB, DominatorTreeBase<BlockT> &DT) { if (BBMap.find(BB) != BBMap.end()) return 0;// Haven't processed this node? std::vector<BlockT *> TodoStack; // Scan the predecessors of BB, checking to see if BB dominates any of // them. This identifies backedges which target this node... - for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + for (typename InvBlockTraits::ChildIteratorType I = + InvBlockTraits::child_begin(BB), E = InvBlockTraits::child_end(BB); + I != E; ++I) if (DT.dominates(BB, *I)) // If BB dominates it's predecessor... TodoStack.push_back(*I); @@ -702,9 +733,12 @@ // Normal case, add the block to our loop... L->Blocks.push_back(X); - + + typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits; + // Add all of the predecessors of X to the end of the work stack... - TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X)); + TodoStack.insert(TodoStack.end(), InvBlockTraits::child_begin(X), + InvBlockTraits::child_end(X)); } } @@ -826,7 +860,6 @@ LoopInfoBase<BasicBlock>* LI; friend class LoopBase<BasicBlock>; - LoopInfoBase<BasicBlock>& getBase() { return *LI; } public: static char ID; // Pass identification, replacement for typeid @@ -836,6 +869,8 @@ ~LoopInfo() { delete LI; } + LoopInfoBase<BasicBlock>& getBase() { return *LI; } + /// iterator/begin/end - The interface to the top-level loops in the current /// function. /// @@ -941,13 +976,11 @@ template<class BlockT> void LoopBase<BlockT>::addBasicBlockToLoop(BlockT *NewBB, - LoopInfo &LI) { - assert((Blocks.empty() || LI[getHeader()] == this) && + LoopInfoBase<BlockT> &LIB) { + assert((Blocks.empty() || LIB[getHeader()] == this) && "Incorrect LI specified for this loop!"); assert(NewBB && "Cannot add a null basic block to the loop!"); - assert(LI[NewBB] == 0 && "BasicBlock already in the loop!"); - - LoopInfoBase<BasicBlock>& LIB = LI.getBase(); + assert(LIB[NewBB] == 0 && "BasicBlock already in the loop!"); // Add the loop mapping to the LoopInfo object... LIB.BBMap[NewBB] = this; Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/LoopInfo.cpp (original) +++ llvm/trunk/lib/Analysis/LoopInfo.cpp Mon Nov 26 21:43:35 2007 @@ -43,7 +43,7 @@ // bool LoopInfo::runOnFunction(Function &) { releaseMemory(); - LI->Calculate(getAnalysis<DominatorTree>()); // Update + LI->Calculate(getAnalysis<DominatorTree>().getBase()); // Update return false; } Modified: llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp Mon Nov 26 21:43:35 2007 @@ -451,7 +451,7 @@ NewHeader); LoopInfo &LI = LPM.getAnalysis<LoopInfo>(); if (Loop *PL = LI.getLoopFor(OrigPreHeader)) - PL->addBasicBlockToLoop(NewPreHeader, LI); + PL->addBasicBlockToLoop(NewPreHeader, LI.getBase()); new BranchInst(NewHeader, NewPreHeader); BranchInst *OrigPH_BI = cast<BranchInst>(OrigPreHeader->getTerminator()); Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp Mon Nov 26 21:43:35 2007 @@ -358,7 +358,7 @@ VI != VE; ++VI) LastValueMap[VI->first] = VI->second; - L->addBasicBlockToLoop(New, *LI); + L->addBasicBlockToLoop(New, LI->getBase()); // Add phi entries for newly created values to all exit blocks except // the successor of the latch block. The successor of the exit block will Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Nov 26 21:43:35 2007 @@ -542,7 +542,7 @@ for (Loop::block_iterator I = L->block_begin(), E = L->block_end(); I != E; ++I) if (LI->getLoopFor(*I) == L) - New->addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), *LI); + New->addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), LI->getBase()); // Add all of the subloops to the new loop. for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) @@ -793,14 +793,14 @@ if (ParentLoop) { // Make sure to add the cloned preheader and exit blocks to the parent loop // as well. - ParentLoop->addBasicBlockToLoop(NewBlocks[0], *LI); + ParentLoop->addBasicBlockToLoop(NewBlocks[0], LI->getBase()); } for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) { BasicBlock *NewExit = cast<BasicBlock>(ValueMap[ExitBlocks[i]]); // The new exit block should be in the same loop as the old one. if (Loop *ExitBBLoop = LI->getLoopFor(ExitBlocks[i])) - ExitBBLoop->addBasicBlockToLoop(NewExit, *LI); + ExitBBLoop->addBasicBlockToLoop(NewExit, LI->getBase()); assert(NewExit->getTerminator()->getNumSuccessors() == 1 && "Exit block should have been split to have one successor!"); Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Mon Nov 26 21:43:35 2007 @@ -163,7 +163,7 @@ // The new block lives in whichever loop the old one did. if (Loop *L = LI.getLoopFor(Old)) - L->addBasicBlockToLoop(New, LI); + L->addBasicBlockToLoop(New, LI.getBase()); if (DominatorTree *DT = P->getAnalysisToUpdate<DominatorTree>()) { Modified: llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp Mon Nov 26 21:43:35 2007 @@ -250,13 +250,13 @@ if (Loop *DestLoop = LI->getLoopFor(DestBB)) { if (TIL == DestLoop) { // Both in the same loop, the NewBB joins loop. - DestLoop->addBasicBlockToLoop(NewBB, *LI); + DestLoop->addBasicBlockToLoop(NewBB, LI->getBase()); } else if (TIL->contains(DestLoop->getHeader())) { // Edge from an outer loop to an inner loop. Add to the outer loop. - TIL->addBasicBlockToLoop(NewBB, *LI); + TIL->addBasicBlockToLoop(NewBB, LI->getBase()); } else if (DestLoop->contains(TIL->getHeader())) { // Edge from an inner loop to an outer loop. Add to the outer loop. - DestLoop->addBasicBlockToLoop(NewBB, *LI); + DestLoop->addBasicBlockToLoop(NewBB, LI->getBase()); } else { // Edge from two loops with no containment relation. Because these // are natural loops, we know that the destination block must be the @@ -265,7 +265,7 @@ assert(DestLoop->getHeader() == DestBB && "Should not create irreducible loops!"); if (Loop *P = DestLoop->getParentLoop()) - P->addBasicBlockToLoop(NewBB, *LI); + P->addBasicBlockToLoop(NewBB, LI->getBase()); } } } Modified: llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp Mon Nov 26 21:43:35 2007 @@ -109,7 +109,7 @@ ValueMap[BB] = NewBB; if (P) LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L); - NewLoop->addBasicBlockToLoop(NewBB, *LI); + NewLoop->addBasicBlockToLoop(NewBB, LI->getBase()); NewBlocks.push_back(NewBB); } Modified: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp?rev=44348&r1=44347&r2=44348&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Mon Nov 26 21:43:35 2007 @@ -380,7 +380,7 @@ // We know that we have loop information to update... update it now. if (Loop *Parent = L->getParentLoop()) - Parent->addBasicBlockToLoop(NewBB, *LI); + Parent->addBasicBlockToLoop(NewBB, LI->getBase()); DT->splitBlock(NewBB); if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) @@ -412,7 +412,7 @@ while (SuccLoop && !SuccLoop->contains(L->getHeader())) SuccLoop = SuccLoop->getParentLoop(); if (SuccLoop) - SuccLoop->addBasicBlockToLoop(NewBB, *LI); + SuccLoop->addBasicBlockToLoop(NewBB, LI->getBase()); // Update Dominator Information DT->splitBlock(NewBB); @@ -558,7 +558,7 @@ // This block is going to be our new header block: add it to this loop and all // parent loops. - NewOuter->addBasicBlockToLoop(NewBB, *LI); + NewOuter->addBasicBlockToLoop(NewBB, LI->getBase()); // L is now a subloop of our outer loop. NewOuter->addChildLoop(L); @@ -693,7 +693,7 @@ // Update Loop Information - we know that this block is now in the current // loop and all parent loops. - L->addBasicBlockToLoop(BEBlock, *LI); + L->addBasicBlockToLoop(BEBlock, LI->getBase()); // Update dominator information DT->splitBlock(BEBlock); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits