//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Devang Patel and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
DominatorTree *DT = NULL;
DominanceFrontier *DF = NULL;
if (P) {
- DT = P->getAnalysisToUpdate<DominatorTree>();
- DF = P->getAnalysisToUpdate<DominanceFrontier>();
+ DT = P->getAnalysisIfAvailable<DominatorTree>();
+ DF = P->getAnalysisIfAvailable<DominanceFrontier>();
}
SmallVector<BasicBlock *, 16> NewBlocks;
- SmallVector<std::pair<Loop *, Loop::iterator>, 8> LoopNest;
- LoopNest.push_back(std::make_pair(OrigL, OrigL->begin()));
-
- Loop *NewLoop = NULL;
+
+ // Populate loop nest.
+ SmallVector<Loop *, 8> LoopNest;
+ LoopNest.push_back(OrigL);
+
+
+ Loop *NewParentLoop = NULL;
while (!LoopNest.empty()) {
- Loop *L = LoopNest.back().first;
- Loop::iterator SubLoop = LoopNest.back().second;
-
- // Handle sub loops.
- if (SubLoop != L->end()) {
- Loop *SL = *SubLoop;
- LoopNest.push_back(std::make_pair(SL, SL->begin()));
- }
-
- LoopNest.pop_back();
- NewLoop = new Loop();
+ Loop *L = LoopNest.pop_back_val();
+ Loop *NewLoop = new Loop();
+
+ if (!NewParentLoop)
+ NewParentLoop = NewLoop;
+
LPM->insertLoop(NewLoop, L->getParentLoop());
// Clone Basic Blocks.
ValueMap[BB] = NewBB;
if (P)
LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
- NewLoop->addBasicBlockToLoop(NewBB, *LI);
+ NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
NewBlocks.push_back(NewBB);
}
CloneDominatorInfo(BB, ValueMap, DT, DF);
}
+ // Process sub loops
+ for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
+ LoopNest.push_back(*I);
}
// Remap instructions to reference operands from ValueMap.
BasicBlock *Latch = OrigL->getLoopLatch();
Function *F = Latch->getParent();
- F->getBasicBlockList().insert(Latch, NewBlocks.begin(), NewBlocks.end());
+ F->getBasicBlockList().insert(OrigL->getHeader(),
+ NewBlocks.begin(), NewBlocks.end());
+
- return NewLoop;
+ return NewParentLoop;
}