diff --git a/include/llvm/Transforms/Utils/LoopUtils.h b/include/llvm/Transforms/Utils/LoopUtils.h index 5864e22e135..64e18ca1b6d 100644 --- a/include/llvm/Transforms/Utils/LoopUtils.h +++ b/include/llvm/Transforms/Utils/LoopUtils.h @@ -47,6 +47,17 @@ bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, Pass *PP, /// Returns true if any modifications are made to the loop. bool formLCSSA(Loop &L, DominatorTree &DT, ScalarEvolution *SE = 0); +/// \brief Put a loop nest into LCSSA form. +/// +/// This recursively forms LCSSA for a loop nest. +/// +/// LoopInfo and DominatorTree are required and preserved. +/// +/// If ScalarEvolution is passed in, it will be preserved. +/// +/// Returns true if any modifications are made to the loop. +bool formLCSSARecursively(Loop &L, DominatorTree &DT, ScalarEvolution *SE = 0); + } #endif diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 546f4b160a5..5959324da6c 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -226,6 +226,19 @@ bool llvm::formLCSSA(Loop &L, DominatorTree &DT, ScalarEvolution *SE) { return Changed; } +/// Process a loop nest depth first. +bool llvm::formLCSSARecursively(Loop &L, DominatorTree &DT, + ScalarEvolution *SE) { + bool Changed = false; + + // Recurse depth-first through inner loops. + for (Loop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI) + Changed |= formLCSSARecursively(**LI, DT, SE); + + Changed |= formLCSSA(L, DT, SE); + return Changed; +} + namespace { struct LCSSA : public FunctionPass { static char ID; // Pass identification, replacement for typeid @@ -278,23 +291,11 @@ bool LCSSA::runOnFunction(Function &F) { // Simplify each loop nest in the function. for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) - Changed |= processLoop(**I); + Changed |= formLCSSARecursively(**I, *DT, SE); return Changed; } -/// Process a loop nest depth first. -bool LCSSA::processLoop(Loop &L) { - bool Changed = false; - - // Recurse depth-first through inner loops. - for (Loop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI) - Changed |= processLoop(**LI); - - Changed |= formLCSSA(L, *DT, SE); - return Changed; -} - static void verifyLoop(Loop &L, DominatorTree &DT) { // Recurse depth-first through inner loops. for (Loop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI) diff --git a/lib/Transforms/Utils/LoopUnroll.cpp b/lib/Transforms/Utils/LoopUnroll.cpp index 3c43fbbe828..d2dfc20e4d8 100644 --- a/lib/Transforms/Utils/LoopUnroll.cpp +++ b/lib/Transforms/Utils/LoopUnroll.cpp @@ -468,9 +468,11 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, if (PP && DT) { if (!OuterL && !CompletelyUnroll) OuterL = L; - if (OuterL) - simplifyLoop(OuterL, DT, LI, PP, /*AliasAnalysis*/ 0, - PP->getAnalysisIfAvailable()); + if (OuterL) { + ScalarEvolution *SE = PP->getAnalysisIfAvailable(); + simplifyLoop(OuterL, DT, LI, PP, /*AliasAnalysis*/ 0, SE); + formLCSSARecursively(*OuterL, *DT, SE); + } } return true;