diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/LoopSimplifyCFG/lcssa.ll | 38 |
2 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 55cf20a2936..bbf35513416 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -355,6 +355,8 @@ private: BasicBlock *NewPreheader = Preheader->splitBasicBlock( Preheader->getTerminator(), Twine(Preheader->getName()).concat("-split")); + if (MSSAU) + MSSAU->removeEdge(Preheader, L.getHeader()); DTUpdates.push_back({DominatorTree::Delete, Preheader, L.getHeader()}); DTUpdates.push_back({DominatorTree::Insert, NewPreheader, L.getHeader()}); DTUpdates.push_back({DominatorTree::Insert, Preheader, NewPreheader}); diff --git a/llvm/test/Transforms/LoopSimplifyCFG/lcssa.ll b/llvm/test/Transforms/LoopSimplifyCFG/lcssa.ll index 8281f36d978..11ee3ae8b4f 100644 --- a/llvm/test/Transforms/LoopSimplifyCFG/lcssa.ll +++ b/llvm/test/Transforms/LoopSimplifyCFG/lcssa.ll @@ -154,3 +154,41 @@ bb8: ; preds = %bb4, %bb2 bb10: ; preds = %bb2 ret void } + +define void @memlcssa() { +; CHECK-LABEL: @memlcssa( +; CHECK-NEXT: entry: +; CHECK-NEXT: switch i32 0, label [[ENTRY_SPLIT:%.*]] [ +; CHECK-NEXT: i32 1, label [[DEFAULT_BB:%.*]] +; CHECK-NEXT: ] +; CHECK: entry-split: +; CHECK-NEXT: br label [[FOR_BODY:%.*]] +; CHECK: for.body: +; CHECK-NEXT: call void @foo() +; CHECK-NEXT: br label [[FOR_BODY]] +; CHECK: default.bb: +; CHECK-NEXT: unreachable +; +entry: + br label %for.body + +for.body: ; preds = %exit, %entry + br label %switch.bb + +switch.bb: ; preds = %for.body + switch i2 1, label %default.bb [ + i2 1, label %case.bb + ] + +case.bb: ; preds = %switch + br label %exit + +default.bb: ; preds = %switch + unreachable + +exit: ; preds = %case.bb + call void @foo() + br label %for.body +} + +declare void @foo() |