[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / Transforms / SimpleLoopUnswitch / AMDGPU / nontrivial-unswitch-divergent-target.ll
blob8d3386031e75dd3413129039aa3d10edb80d51de
1 ; RUN: opt -mtriple=amdgcn-- -passes='loop(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck %s
2 ; RUN: opt -mtriple=amdgcn-- -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck %s
3 ; RUN: opt -mtriple=amdgcn-- -passes='simple-loop-unswitch<nontrivial>' -verify-memoryssa -S < %s | FileCheck %s
5 declare i32 @a()
6 declare i32 @b()
7 declare i32 @c()
9 ; Non-trivial loop unswitching where there are two distinct trivial
10 ; conditions to unswitch within the loop. The conditions are divergent
11 ; and should not unswitch.
12 define void @test1(ptr %ptr, i1 %cond1, i1 %cond2) {
13 ; CHECK-LABEL: @test1(
14 entry:
15   br label %loop_begin
16 ; CHECK-NEXT:  entry:
17 ; CHECK-NEXT:    br label %loop_begin
19 loop_begin:
20   br i1 %cond1, label %loop_a, label %loop_b
21 ; CHECK: loop_begin:
22 ; CHECK-NEXT: br i1 %cond1, label %loop_a, label %loop_b
24 loop_a:
25   %unused.a = call i32 @a()
26   br label %latch
27 ; CHECK: loop_a:
28 ; CHECK-NEXT: %unused.a = call i32 @a()
29 ; CHECK-NEXT: br label %latch
31 loop_b:
32   br i1 %cond2, label %loop_b_a, label %loop_b_b
33 ; CHECK: loop_b:
34 ; CHECK-NEXT: br i1 %cond2, label %loop_b_a, label %loop_b_b
36 loop_b_a:
37   %unused.b = call i32 @b()
38   br label %latch
39 ; CHECK: loop_b_a:
40 ; CHECK-NEXT: %unused.b = call i32 @b()
41 ; CHECK-NEXT: br label %latch
43 loop_b_b:
44   %unused.c = call i32 @c()
45   br label %latch
46 ; CHECK: loop_b_b:
47 ; CHECK-NEXT: %unused.c = call i32 @c()
48 ; CHECK-NEXT: br label %latch
50 latch:
51   %v = load i1, ptr %ptr
52   br i1 %v, label %loop_begin, label %loop_exit
53 ; CHECK: latch:
54 ; CHECK-NEXT: %v = load i1, ptr %ptr
55 ; CHECK-NEXT: br i1 %v, label %loop_begin, label %loop_exit
57 loop_exit:
58   ret void
59 ; CHECK: loop_exit:
60 ; CHECK-NEXT: ret void
63 ; Non-trivial loop unswitching where there are two distinct trivial
64 ; conditions to unswitch within the loop. The conditions are known to
65 ; be uniform, so it should be unswitchable. However, unswitch
66 ; currently does not make use of UniformityAnalysis.
67 define amdgpu_kernel void @test1_uniform(ptr %ptr, i1 %cond1, i1 %cond2) {
68 ; CHECK-LABEL: @test1_uniform(
69 entry:
70   br label %loop_begin
71 ; CHECK-NEXT:  entry:
72 ; CHECK-NEXT:    br label %loop_begin
74 loop_begin:
75   br i1 %cond1, label %loop_a, label %loop_b
76 ; CHECK: loop_begin:
77 ; CHECK-NEXT: br i1 %cond1, label %loop_a, label %loop_b
79 loop_a:
80   %unused.a = call i32 @a()
81   br label %latch
82 ; CHECK: loop_a:
83 ; CHECK-NEXT: %unused.a = call i32 @a()
84 ; CHECK-NEXT: br label %latch
86 loop_b:
87   br i1 %cond2, label %loop_b_a, label %loop_b_b
88 ; CHECK: loop_b:
89 ; CHECK-NEXT: br i1 %cond2, label %loop_b_a, label %loop_b_b
91 loop_b_a:
92   %unused.b = call i32 @b()
93   br label %latch
94 ; CHECK: loop_b_a:
95 ; CHECK-NEXT: %unused.b = call i32 @b()
96 ; CHECK-NEXT: br label %latch
98 loop_b_b:
99   %unused.c = call i32 @c()
100   br label %latch
101 ; CHECK: loop_b_b:
102 ; CHECK-NEXT: %unused.c = call i32 @c()
103 ; CHECK-NEXT: br label %latch
105 latch:
106   %v = load i1, ptr %ptr
107   br i1 %v, label %loop_begin, label %loop_exit
108 ; CHECK: latch:
109 ; CHECK-NEXT: %v = load i1, ptr %ptr
110 ; CHECK-NEXT: br i1 %v, label %loop_begin, label %loop_exit
112 loop_exit:
113   ret void
114 ; CHECK: loop_exit:
115 ; CHECK-NEXT: ret void
118 ; Non-trivial loop unswitching where there are two distinct trivial
119 ; conditions to unswitch within the loop. There is no divergence
120 ; because it's assumed it can only execute with a workgroup of size 1.
121 define void @test1_single_lane_execution(ptr %ptr, i1 %cond1, i1 %cond2) #0 {
122 ; CHECK-LABEL: @test1_single_lane_execution(
123 entry:
124   br label %loop_begin
125 ; CHECK-NEXT:  entry:
126 ; CHECK-NEXT:    br i1 %cond1, label %entry.split.us, label %entry.split
128 loop_begin:
129   br i1 %cond1, label %loop_a, label %loop_b
131 loop_a:
132   call i32 @a()
133   br label %latch
134 ; The 'loop_a' unswitched loop.
136 ; CHECK:       entry.split.us:
137 ; CHECK-NEXT:    br label %loop_begin.us
139 ; CHECK:       loop_begin.us:
140 ; CHECK-NEXT:    br label %loop_a.us
142 ; CHECK:       loop_a.us:
143 ; CHECK-NEXT:    call i32 @a()
144 ; CHECK-NEXT:    br label %latch.us
146 ; CHECK:       latch.us:
147 ; CHECK-NEXT:    %[[V:.*]] = load i1, ptr %ptr
148 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
150 ; CHECK:       loop_exit.split.us:
151 ; CHECK-NEXT:    br label %loop_exit
153 loop_b:
154   br i1 %cond2, label %loop_b_a, label %loop_b_b
155 ; The second unswitched condition.
157 ; CHECK:       entry.split:
158 ; CHECK-NEXT:    br i1 %cond2, label %entry.split.split.us, label %entry.split.split
160 loop_b_a:
161   call i32 @b()
162   br label %latch
163 ; The 'loop_b_a' unswitched loop.
165 ; CHECK:       entry.split.split.us:
166 ; CHECK-NEXT:    br label %loop_begin.us1
168 ; CHECK:       loop_begin.us1:
169 ; CHECK-NEXT:    br label %loop_b.us
171 ; CHECK:       loop_b.us:
172 ; CHECK-NEXT:    br label %loop_b_a.us
174 ; CHECK:       loop_b_a.us:
175 ; CHECK-NEXT:    call i32 @b()
176 ; CHECK-NEXT:    br label %latch.us2
178 ; CHECK:       latch.us2:
179 ; CHECK-NEXT:    %[[V:.*]] = load i1, ptr %ptr
180 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us1, label %loop_exit.split.split.us
182 ; CHECK:       loop_exit.split.split.us:
183 ; CHECK-NEXT:    br label %loop_exit.split
185 loop_b_b:
186   call i32 @c()
187   br label %latch
188 ; The 'loop_b_b' unswitched loop.
190 ; CHECK:       entry.split.split:
191 ; CHECK-NEXT:    br label %loop_begin
193 ; CHECK:       loop_begin:
194 ; CHECK-NEXT:    br label %loop_b
196 ; CHECK:       loop_b:
197 ; CHECK-NEXT:    br label %loop_b_b
199 ; CHECK:       loop_b_b:
200 ; CHECK-NEXT:    call i32 @c()
201 ; CHECK-NEXT:    br label %latch
203 ; CHECK:       latch:
204 ; CHECK-NEXT:    %[[V:.*]] = load i1, ptr %ptr
205 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split.split
207 ; CHECK:       loop_exit.split.split:
208 ; CHECK-NEXT:    br label %loop_exit.split
210 latch:
211   %v = load i1, ptr %ptr
212   br i1 %v, label %loop_begin, label %loop_exit
214 loop_exit:
215   ret void
216 ; CHECK:       loop_exit.split:
217 ; CHECK-NEXT:    br label %loop_exit
219 ; CHECK:       loop_exit:
220 ; CHECK-NEXT:    ret
223 attributes #0 = { "amdgpu-flat-work-group-size"="1,1" }