diff options
| author | Max Kazantsev <max.kazantsev@azul.com> | 2019-01-17 12:25:40 +0000 |
|---|---|---|
| committer | Max Kazantsev <max.kazantsev@azul.com> | 2019-01-17 12:25:40 +0000 |
| commit | 8b134169f5dfb0e4d281eb522ced6b2879b76617 (patch) | |
| tree | 2b089fe556f621f0a239d0a08dea1bbc157c476b | |
| parent | 799b5dcbda8ab7c02de5143370f179daa09629f5 (diff) | |
| download | bcm5719-llvm-8b134169f5dfb0e4d281eb522ced6b2879b76617.tar.gz bcm5719-llvm-8b134169f5dfb0e4d281eb522ced6b2879b76617.zip | |
[LoopSimplifyCFG] Fix order of deletion of complex dead subloops
Function `DeleteDeadBlock` requires that all predecessors of a block
being deleted have already been deleted, with the exception of a
single-block loop. When we use it for removal of dead subloops that
contain more than one block, we may not fulfull this requirement and
fail an assertion.
This patch replaces invocation of `DeleteDeadBlock` with a generalized
version `DeleteDeadBlocks` that is able to deal with multiple dead blocks,
even if they contain some cycles.
Differential Revision: https://reviews.llvm.org/D56121
Reviewed By: fedor.sergeev
llvm-svn: 351433
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll | 21 |
2 files changed, 21 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 2e5927f9a06..d51e6005d68 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -402,9 +402,10 @@ private: LI.erase(LI.getLoopFor(BB)); } LI.removeBlock(BB); - DeleteDeadBlock(BB, &DTU); - ++NumLoopBlocksDeleted; } + + DeleteDeadBlocks(DeadLoopBlocks, &DTU); + NumLoopBlocksDeleted += DeadLoopBlocks.size(); } /// Constant-fold terminators of blocks acculumated in FoldCandidates into the diff --git a/llvm/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll b/llvm/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll index db5f0f1f3f2..25d6f2bbdb2 100644 --- a/llvm/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll +++ b/llvm/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll @@ -1,7 +1,4 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; XFAIL: * -; Tests complex_dead_subloop_branch and complex_dead_subloop_switch fail an -; assertion, therefore the CFG simplification is temporarily disabled. ; REQUIRES: asserts ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(simplify-cfg)' -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s @@ -2512,6 +2509,15 @@ exit: } define i32 @complex_dead_subloop_branch(i1 %cond1, i1 %cond2, i1 %cond3) { +; CHECK-LABEL: @complex_dead_subloop_branch( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: br i1 [[COND3:%.*]], label [[LOOP]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT: [[RESULT_LCSSA:%.*]] = phi i32 [ 0, [[LOOP]] ] +; CHECK-NEXT: ret i32 [[RESULT_LCSSA]] +; entry: br label %loop @@ -2540,6 +2546,15 @@ exit: } define i32 @complex_dead_subloop_switch(i1 %cond1, i1 %cond2, i1 %cond3) { +; CHECK-LABEL: @complex_dead_subloop_switch( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: br i1 [[COND3:%.*]], label [[LOOP]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT: [[RESULT_LCSSA:%.*]] = phi i32 [ 0, [[LOOP]] ] +; CHECK-NEXT: ret i32 [[RESULT_LCSSA]] +; entry: br label %loop |

