[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / SimpleLoopUnswitch / delete-dead-blocks.ll
blobbfbeb7e5562f408f6d5c3699115de45ecb71a587
1 ; RUN: opt < %s -simple-loop-unswitch -enable-nontrivial-unswitch -S 2>&1 | FileCheck %s
2 ; RUN: opt < %s -passes='simple-loop-unswitch<nontrivial>' -S 2>&1 | FileCheck %s
3 ; RUN: opt < %s -passes='loop-mssa(simple-loop-unswitch<nontrivial>)' -S 2>&1 | FileCheck %s
5 ; Checking that (dead) blocks from inner loop are deleted after unswitch.
7 declare void @foo()
9 ; CHECK-LABEL: @Test
10 define void @Test(i32) {
11 entry:
12   br label %outer
13 outer:
14   %oi = phi i32 [ 0, %entry ], [ %oinc, %outer_continue]
15   br label %inner
16 inner:
17   %ii = phi i32 [ 0, %outer ], [ %iinc, %continue]
18   call void @foo() 
19   switch i32 %0, label %get_out2 [
20     i32 0, label %continue
21     i32 1, label %case1
22     i32 2, label %get_out
23   ]
25 ; since we unswitch on the above switch, %case1 and %continue blocks
26 ; become dead in the original loop
28 ; CHECK-NOT: case1:
29 case1:
30   br label %continue
31 ; CHECK-NOT: {{^}}continue:
32 continue:
33   %iinc = add i32 %ii, 1
34   %icmp = icmp eq i32 %ii, 100
35   br i1 %icmp, label %inner, label %outer_continue
37 outer_continue:
38   %oinc = add i32 %oi, 1
39   %ocmp = icmp eq i32 %oi, 100
40   br i1 %ocmp, label %outer, label %get_out
42 get_out:
43   ret void
44 get_out2:
45   unreachable
49 ; This comes from PR38778
50 ; CHECK-LABEL: @Test2
51 define void @Test2(i32) {
52 header:
53   br label %loop
54 loop:
55   switch i32 %0, label %continue [
56     i32 -2147483648, label %check
57     i32 98, label %guarded1
58     i32 99, label %guarded2
59   ]
60 ; CHECK-NOT: {{^}}guarded1:
61 guarded1:
62   br i1 undef, label %continue, label %leave
63 guarded2:
64   br label %continue
65 check:
66   %val = add i32 0, 1
67   br i1 undef, label %continue, label %leave
68 continue:
69   br label %loop
70 leave:
71   %local = phi i32 [ 0, %guarded1 ], [ %val, %check ]
72   ret void
76 ; Yet another test from PR38778
78 ; CHECK-LABEL: @Test3
79 define void @Test3(i32) {
80 header:
81   br label %outer
82 outer:
83   %bad_input.i = icmp eq i32 %0, -2147483648
84   br label %inner
85 inner:
86   br i1 %bad_input.i, label %overflow, label %switchme
87 overflow:
88   br label %continue
89 switchme:
90   switch i32 %0, label %continue [
91     i32 88, label %go_out
92     i32 99, label %case2
93   ]
94 ; CHECK-NOT: {{^}}case2:
95 case2:
96   br label %continue
97 continue:
98   %local_11_92 = phi i32 [ 0, %switchme ], [ 18, %case2 ], [ 0, %overflow ]
99   br i1 undef, label %outer, label %inner
100 go_out:
101   unreachable