Recent change to deleteDeadBlocksFromLoop was not enough to fix all the problems related to dead blocks after nontrivial unswitching of switches. We need to delete all the dead blocks that were created during unswitching, otherwise we will keep having problems with phi's or dead blocks. This change removes all the dead blocks that are reachable from the loop, not trying to track whether these blocks are newly created by unswitching or not. While not completely correct, we are unlikely to get loose but reachable dead blocks that do not belong to our loop nest. It does fix all the failures currently known, in particular PR38778. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D51519 llvm-svn: 341398
102 lines
2.1 KiB
LLVM
102 lines
2.1 KiB
LLVM
; RUN: opt < %s -simple-loop-unswitch -enable-nontrivial-unswitch -S 2>&1 | FileCheck %s
|
|
; RUN: opt < %s -passes=unswitch -enable-nontrivial-unswitch -S 2>&1 | FileCheck %s
|
|
;
|
|
; Checking that (dead) blocks from inner loop are deleted after unswitch.
|
|
;
|
|
declare void @foo()
|
|
|
|
; CHECK-LABEL: @Test
|
|
define void @Test(i32) {
|
|
entry:
|
|
br label %outer
|
|
outer:
|
|
%oi = phi i32 [ 0, %entry ], [ %oinc, %outer_continue]
|
|
br label %inner
|
|
inner:
|
|
%ii = phi i32 [ 0, %outer ], [ %iinc, %continue]
|
|
call void @foo()
|
|
switch i32 %0, label %get_out2 [
|
|
i32 0, label %continue
|
|
i32 1, label %case1
|
|
i32 2, label %get_out
|
|
]
|
|
;
|
|
; since we unswitch on the above switch, %case1 and %continue blocks
|
|
; become dead in the original loop
|
|
;
|
|
; CHECK-NOT: case1:
|
|
case1:
|
|
br label %continue
|
|
; CHECK-NOT: {{^}}continue:
|
|
continue:
|
|
%iinc = add i32 %ii, 1
|
|
%icmp = icmp eq i32 %ii, 100
|
|
br i1 %icmp, label %inner, label %outer_continue
|
|
|
|
outer_continue:
|
|
%oinc = add i32 %oi, 1
|
|
%ocmp = icmp eq i32 %oi, 100
|
|
br i1 %ocmp, label %outer, label %get_out
|
|
|
|
get_out:
|
|
ret void
|
|
get_out2:
|
|
unreachable
|
|
}
|
|
|
|
;
|
|
; This comes from PR38778
|
|
; CHECK-LABEL: @Test2
|
|
define void @Test2(i32) {
|
|
header:
|
|
br label %loop
|
|
loop:
|
|
switch i32 %0, label %continue [
|
|
i32 -2147483648, label %check
|
|
i32 98, label %guarded1
|
|
i32 99, label %guarded2
|
|
]
|
|
; CHECK-NOT: {{^}}guarded1:
|
|
guarded1:
|
|
br i1 undef, label %continue, label %leave
|
|
guarded2:
|
|
br label %continue
|
|
check:
|
|
%val = add i32 0, 1
|
|
br i1 undef, label %continue, label %leave
|
|
continue:
|
|
br label %loop
|
|
leave:
|
|
%local = phi i32 [ 0, %guarded1 ], [ %val, %check ]
|
|
ret void
|
|
}
|
|
|
|
;
|
|
; Yet another test from PR38778
|
|
;
|
|
; CHECK-LABEL: @Test3
|
|
define void @Test3(i32) {
|
|
header:
|
|
br label %outer
|
|
outer:
|
|
%bad_input.i = icmp eq i32 %0, -2147483648
|
|
br label %inner
|
|
inner:
|
|
br i1 %bad_input.i, label %overflow, label %switchme
|
|
overflow:
|
|
br label %continue
|
|
switchme:
|
|
switch i32 %0, label %continue [
|
|
i32 88, label %go_out
|
|
i32 99, label %case2
|
|
]
|
|
; CHECK-NOT: {{^}}case2:
|
|
case2:
|
|
br label %continue
|
|
continue:
|
|
%local_11_92 = phi i32 [ 0, %switchme ], [ 18, %case2 ], [ 0, %overflow ]
|
|
br i1 undef, label %outer, label %inner
|
|
go_out:
|
|
unreachable
|
|
}
|