Index: include/llvm/Analysis/LoopPass.h =================================================================== --- include/llvm/Analysis/LoopPass.h +++ include/llvm/Analysis/LoopPass.h @@ -17,6 +17,7 @@ #include "llvm/Analysis/LoopInfo.h" #include "llvm/IR/LegacyPassManagers.h" +#include "llvm/Transforms/Utils/ValueMapper.h" #include "llvm/Pass.h" #include @@ -142,6 +143,10 @@ // utility may send LPPassManager into infinite loops so use caution. void redoLoop(Loop *L); + /// cloneLoop - Recursively clone the specified loop and all of its + /// children, mapping the blocks with the specified map. + Loop *cloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM, LoopInfo *LI); + //===--------------------------------------------------------------------===// /// SimpleAnalysis - Provides simple interface to update analysis info /// maintained by various passes. Note, if required this interface can Index: lib/Analysis/LoopPass.cpp =================================================================== --- lib/Analysis/LoopPass.cpp +++ lib/Analysis/LoopPass.cpp @@ -309,6 +309,26 @@ return Changed; } + +/// cloneLoop - Recursively clone the specified loop and all of its children, +/// mapping the blocks with the specified map. +Loop *LPPassManager::cloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM, + LoopInfo *LI) { + Loop *New = new Loop; + insertLoop(New, PL); + + // Add all of the blocks in L to the new loop. + for (BasicBlock *BB : L->getBlocks()) + if (LI->getLoopFor(BB) == L) + New->addBasicBlockToLoop(cast(VM[BB]), LI->getBase()); + + // Add all of the subloops to the new loop. + for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) + cloneLoop(*I, New, VM, LI); + + return New; +} + /// Print passes managed by this manager void LPPassManager::dumpPassStructure(unsigned Offset) { errs().indent(Offset*2) << "Loop Pass Manager\n"; Index: lib/Transforms/Scalar/LoopUnswitch.cpp =================================================================== --- lib/Transforms/Scalar/LoopUnswitch.cpp +++ lib/Transforms/Scalar/LoopUnswitch.cpp @@ -663,26 +663,6 @@ return true; } -/// CloneLoop - Recursively clone the specified loop and all of its children, -/// mapping the blocks with the specified map. -static Loop *CloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM, - LoopInfo *LI, LPPassManager *LPM) { - Loop *New = new Loop(); - LPM->insertLoop(New, PL); - - // Add all of the blocks in L to the new loop. - for (Loop::block_iterator I = L->block_begin(), E = L->block_end(); - I != E; ++I) - if (LI->getLoopFor(*I) == L) - New->addBasicBlockToLoop(cast(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) - CloneLoop(*I, New, VM, LI, LPM); - - return New; -} - /// EmitPreheaderBranchOnCondition - Emit a conditional branch on two values /// if LIC == Val, branch to TrueDst, otherwise branch to FalseDest. Insert the /// code immediately before InsertPt. @@ -839,7 +819,7 @@ AT->forgetCachedAssumptions(F); // Now we create the new Loop object for the versioned loop. - Loop *NewLoop = CloneLoop(L, L->getParentLoop(), VMap, LI, LPM); + Loop *NewLoop = LPM->cloneLoop(L, L->getParentLoop(), VMap, LI); // Recalculate unswitching quota, inherit simplified switches info for NewBB, // Probably clone more loop-unswitch related loop properties.