diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2019-02-21 05:51:29 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2019-02-21 05:51:29 +0000 |
commit | 10489d76f6355bcfeaef2761a06ad28c72facefb (patch) | |
tree | 0b921596464f9fb1f712b709a3b7b01165fcfcdc | |
parent | 7cfd5b66346249e902ef3ff3fd01276f8b9b3a3e (diff) | |
download | bcm5719-llvm-10489d76f6355bcfeaef2761a06ad28c72facefb.tar.gz bcm5719-llvm-10489d76f6355bcfeaef2761a06ad28c72facefb.zip |
[LoopSimplifyCFG] Add missing MSSA edge deletion
When we create fictive switch in preheader, we should take
care about MSSA and delete edge between old preheader and
header.
llvm-svn: 354547
-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() |