diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index ed37fc8825d..6cac3787311 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -41,8 +41,8 @@ using namespace llvm; #define DEBUG_TYPE "loop-simplifycfg" -static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, - ScalarEvolution &SE, MemorySSAUpdater *MSSAU) { +static bool mergeBlocksIntoPredecessors(Loop &L, DominatorTree &DT, + LoopInfo &LI, MemorySSAUpdater *MSSAU) { bool Changed = false; DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager); // Copy blocks into a temporary array to avoid iterator invalidation issues @@ -63,14 +63,25 @@ static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, // Merge Succ into Pred and delete it. MergeBlockIntoPredecessor(Succ, &DTU, &LI, MSSAU); - SE.forgetTopmostLoop(&L); - Changed = true; } return Changed; } +static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, + ScalarEvolution &SE, MemorySSAUpdater *MSSAU) { + bool Changed = false; + + // Eliminate unconditional branches by merging blocks into their predecessors. + Changed |= mergeBlocksIntoPredecessors(L, DT, LI, MSSAU); + + if (Changed) + SE.forgetTopmostLoop(&L); + + return Changed; +} + PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &) { |