forked from OSchip/llvm-project
[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
This commit is contained in:
parent
799b5dcbda
commit
8b134169f5
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue