blob: 0c052ae0a5ddaef9e9c87cb6f56d47ba44d6ce18 [file] [log] [blame]
Matt Arsenault657f8712016-07-12 19:01:23 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s
2
3; CHECK-LABEL: {{^}}test_kill_depth_0_imm_pos:
4; CHECK-NEXT: ; BB#0:
5; CHECK-NEXT: s_endpgm
6define amdgpu_ps void @test_kill_depth_0_imm_pos() #0 {
7 call void @llvm.AMDGPU.kill(float 0.0)
8 ret void
9}
10
11; CHECK-LABEL: {{^}}test_kill_depth_0_imm_neg:
12; CHECK-NEXT: ; BB#0:
13; CHECK-NEXT: s_mov_b64 exec, 0
Matt Arsenault786724a2016-07-12 21:41:32 +000014; CHECK-NEXT: ; BB#1:
Matt Arsenault657f8712016-07-12 19:01:23 +000015; CHECK-NEXT: s_endpgm
16define amdgpu_ps void @test_kill_depth_0_imm_neg() #0 {
17 call void @llvm.AMDGPU.kill(float -0.0)
18 ret void
19}
20
Matt Arsenault786724a2016-07-12 21:41:32 +000021; FIXME: Ideally only one would be emitted
22; CHECK-LABEL: {{^}}test_kill_depth_0_imm_neg_x2:
23; CHECK-NEXT: ; BB#0:
24; CHECK-NEXT: s_mov_b64 exec, 0
25; CHECK-NEXT: ; BB#1:
26; CHECK-NEXT: s_mov_b64 exec, 0
27; CHECK-NEXT: ; BB#2:
28; CHECK-NEXT: s_endpgm
29define amdgpu_ps void @test_kill_depth_0_imm_neg_x2() #0 {
30 call void @llvm.AMDGPU.kill(float -0.0)
31 call void @llvm.AMDGPU.kill(float -1.0)
32 ret void
33}
34
Matt Arsenault657f8712016-07-12 19:01:23 +000035; CHECK-LABEL: {{^}}test_kill_depth_var:
36; CHECK-NEXT: ; BB#0:
37; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0
Matt Arsenault786724a2016-07-12 21:41:32 +000038; CHECK-NEXT: ; BB#1:
Matt Arsenault657f8712016-07-12 19:01:23 +000039; CHECK-NEXT: s_endpgm
40define amdgpu_ps void @test_kill_depth_var(float %x) #0 {
41 call void @llvm.AMDGPU.kill(float %x)
42 ret void
43}
44
Matt Arsenault786724a2016-07-12 21:41:32 +000045; FIXME: Ideally only one would be emitted
46; CHECK-LABEL: {{^}}test_kill_depth_var_x2_same:
47; CHECK-NEXT: ; BB#0:
48; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0
49; CHECK-NEXT: ; BB#1:
50; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0
51; CHECK-NEXT: ; BB#2:
52; CHECK-NEXT: s_endpgm
53define amdgpu_ps void @test_kill_depth_var_x2_same(float %x) #0 {
54 call void @llvm.AMDGPU.kill(float %x)
55 call void @llvm.AMDGPU.kill(float %x)
56 ret void
57}
58
59; CHECK-LABEL: {{^}}test_kill_depth_var_x2:
60; CHECK-NEXT: ; BB#0:
61; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0
62; CHECK-NEXT: ; BB#1:
63; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v1
64; CHECK-NEXT: ; BB#2:
65; CHECK-NEXT: s_endpgm
66define amdgpu_ps void @test_kill_depth_var_x2(float %x, float %y) #0 {
67 call void @llvm.AMDGPU.kill(float %x)
68 call void @llvm.AMDGPU.kill(float %y)
69 ret void
70}
71
72; CHECK-LABEL: {{^}}test_kill_depth_var_x2_instructions:
73; CHECK-NEXT: ; BB#0:
74; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0
75; CHECK-NEXT: ; BB#1:
76; CHECK: v_mov_b32_e64 v7, -1
77; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7
78; CHECK-NEXT: ; BB#2:
79; CHECK-NEXT: s_endpgm
80define amdgpu_ps void @test_kill_depth_var_x2_instructions(float %x) #0 {
81 call void @llvm.AMDGPU.kill(float %x)
Matt Arsenault3c7581b2017-06-08 19:03:20 +000082 %y = call float asm sideeffect "v_mov_b32_e64 v7, -1", "={v7}"()
Matt Arsenault786724a2016-07-12 21:41:32 +000083 call void @llvm.AMDGPU.kill(float %y)
84 ret void
85}
86
Matt Arsenault657f8712016-07-12 19:01:23 +000087; FIXME: why does the skip depend on the asm length in the same block?
88
89; CHECK-LABEL: {{^}}test_kill_control_flow:
Matt Arsenault5d8eb252016-09-30 01:50:20 +000090; CHECK: s_cmp_lg_u32 s{{[0-9]+}}, 0
Matt Arsenault657f8712016-07-12 19:01:23 +000091; CHECK: s_cbranch_scc1 [[RETURN_BB:BB[0-9]+_[0-9]+]]
92
Matt Arsenault786724a2016-07-12 21:41:32 +000093; CHECK-NEXT: ; BB#1:
94; CHECK: v_mov_b32_e64 v7, -1
Matt Arsenault657f8712016-07-12 19:01:23 +000095; CHECK: v_nop_e64
96; CHECK: v_nop_e64
97; CHECK: v_nop_e64
98; CHECK: v_nop_e64
99; CHECK: v_nop_e64
100; CHECK: v_nop_e64
101; CHECK: v_nop_e64
102; CHECK: v_nop_e64
103; CHECK: v_nop_e64
104; CHECK: v_nop_e64
105
Matt Arsenault786724a2016-07-12 21:41:32 +0000106; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7
107; CHECK-NEXT: s_cbranch_execnz [[SPLIT_BB:BB[0-9]+_[0-9]+]]
Matt Arsenault6bc43d82016-10-06 16:20:41 +0000108; CHECK-NEXT: ; BB#2:
Matt Arsenault8a63cb92016-12-05 20:31:49 +0000109; CHECK-NEXT: exp null off, off, off, off done vm
Matt Arsenault657f8712016-07-12 19:01:23 +0000110; CHECK-NEXT: s_endpgm
111
112; CHECK-NEXT: {{^}}[[SPLIT_BB]]:
Matt Arsenault657f8712016-07-12 19:01:23 +0000113; CHECK-NEXT: s_endpgm
114define amdgpu_ps void @test_kill_control_flow(i32 inreg %arg) #0 {
115entry:
116 %cmp = icmp eq i32 %arg, 0
117 br i1 %cmp, label %bb, label %exit
118
119bb:
120 %var = call float asm sideeffect "
121 v_mov_b32_e64 v7, -1
122 v_nop_e64
123 v_nop_e64
124 v_nop_e64
125 v_nop_e64
126 v_nop_e64
127 v_nop_e64
128 v_nop_e64
129 v_nop_e64
130 v_nop_e64
Matt Arsenault3c7581b2017-06-08 19:03:20 +0000131 v_nop_e64", "={v7}"()
Matt Arsenault657f8712016-07-12 19:01:23 +0000132 call void @llvm.AMDGPU.kill(float %var)
133 br label %exit
134
135exit:
136 ret void
137}
138
139; CHECK-LABEL: {{^}}test_kill_control_flow_remainder:
Matt Arsenault5d8eb252016-09-30 01:50:20 +0000140; CHECK: s_cmp_lg_u32 s{{[0-9]+}}, 0
Matthias Braun325cd2c2016-11-11 01:34:21 +0000141; CHECK-NEXT: v_mov_b32_e32 v{{[0-9]+}}, 0
Matt Arsenault657f8712016-07-12 19:01:23 +0000142; CHECK-NEXT: s_cbranch_scc1 [[RETURN_BB:BB[0-9]+_[0-9]+]]
143
144; CHECK-NEXT: ; BB#1: ; %bb
145; CHECK: v_mov_b32_e64 v7, -1
146; CHECK: v_nop_e64
147; CHECK: v_nop_e64
148; CHECK: v_nop_e64
149; CHECK: v_nop_e64
150; CHECK: v_nop_e64
151; CHECK: v_nop_e64
152; CHECK: v_nop_e64
153; CHECK: v_nop_e64
154; CHECK: ;;#ASMEND
155; CHECK: v_mov_b32_e64 v8, -1
156; CHECK: ;;#ASMEND
Matt Arsenault786724a2016-07-12 21:41:32 +0000157; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7
Matt Arsenault657f8712016-07-12 19:01:23 +0000158; CHECK-NEXT: s_cbranch_execnz [[SPLIT_BB:BB[0-9]+_[0-9]+]]
159
Matt Arsenault6bc43d82016-10-06 16:20:41 +0000160; CHECK-NEXT: ; BB#2:
Matt Arsenault8a63cb92016-12-05 20:31:49 +0000161; CHECK-NEXT: exp null off, off, off, off done vm
Matt Arsenault657f8712016-07-12 19:01:23 +0000162; CHECK-NEXT: s_endpgm
163
164; CHECK-NEXT: {{^}}[[SPLIT_BB]]:
Matt Arsenault657f8712016-07-12 19:01:23 +0000165; CHECK: buffer_store_dword v8
166; CHECK: v_mov_b32_e64 v9, -2
167
168; CHECK: {{^}}BB{{[0-9]+_[0-9]+}}:
169; CHECK: buffer_store_dword v9
170; CHECK-NEXT: s_endpgm
171define amdgpu_ps void @test_kill_control_flow_remainder(i32 inreg %arg) #0 {
172entry:
173 %cmp = icmp eq i32 %arg, 0
174 br i1 %cmp, label %bb, label %exit
175
176bb:
177 %var = call float asm sideeffect "
178 v_mov_b32_e64 v7, -1
179 v_nop_e64
180 v_nop_e64
181 v_nop_e64
182 v_nop_e64
183 v_nop_e64
184 v_nop_e64
185 v_nop_e64
186 v_nop_e64
187 v_nop_e64
188 v_nop_e64
Matt Arsenault3c7581b2017-06-08 19:03:20 +0000189 v_nop_e64", "={v7}"()
190 %live.across = call float asm sideeffect "v_mov_b32_e64 v8, -1", "={v8}"()
Matt Arsenault657f8712016-07-12 19:01:23 +0000191 call void @llvm.AMDGPU.kill(float %var)
192 store volatile float %live.across, float addrspace(1)* undef
Matt Arsenault3c7581b2017-06-08 19:03:20 +0000193 %live.out = call float asm sideeffect "v_mov_b32_e64 v9, -2", "={v9}"()
Matt Arsenault657f8712016-07-12 19:01:23 +0000194 br label %exit
195
196exit:
197 %phi = phi float [ 0.0, %entry ], [ %live.out, %bb ]
198 store float %phi, float addrspace(1)* undef
199 ret void
200}
201
Matt Arsenault786724a2016-07-12 21:41:32 +0000202; CHECK-LABEL: {{^}}test_kill_divergent_loop:
Matt Arsenault5d8eb252016-09-30 01:50:20 +0000203; CHECK: v_cmp_eq_u32_e32 vcc, 0, v0
Matt Arsenault786724a2016-07-12 21:41:32 +0000204; CHECK-NEXT: s_and_saveexec_b64 [[SAVEEXEC:s\[[0-9]+:[0-9]+\]]], vcc
Matt Arsenault57431c92016-08-10 19:11:42 +0000205; CHECK-NEXT: ; mask branch [[EXIT:BB[0-9]+_[0-9]+]]
206; CHECK-NEXT: s_cbranch_execz [[EXIT]]
207
208; CHECK: {{BB[0-9]+_[0-9]+}}: ; %bb.preheader
209; CHECK: s_mov_b32
Matt Arsenault786724a2016-07-12 21:41:32 +0000210
211; CHECK: [[LOOP_BB:BB[0-9]+_[0-9]+]]:
212
213; CHECK: v_mov_b32_e64 v7, -1
214; CHECK: v_nop_e64
215; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7
216
217; CHECK-NEXT: ; BB#3:
218; CHECK: buffer_load_dword [[LOAD:v[0-9]+]]
Matt Arsenault5d8eb252016-09-30 01:50:20 +0000219; CHECK: v_cmp_eq_u32_e32 vcc, 0, [[LOAD]]
Matt Arsenault786724a2016-07-12 21:41:32 +0000220; CHECK-NEXT: s_and_b64 vcc, exec, vcc
221; CHECK-NEXT: s_cbranch_vccnz [[LOOP_BB]]
222
223; CHECK-NEXT: {{^}}[[EXIT]]:
224; CHECK: s_or_b64 exec, exec, [[SAVEEXEC]]
225; CHECK: buffer_store_dword
226; CHECK: s_endpgm
227define amdgpu_ps void @test_kill_divergent_loop(i32 %arg) #0 {
228entry:
229 %cmp = icmp eq i32 %arg, 0
230 br i1 %cmp, label %bb, label %exit
231
232bb:
233 %var = call float asm sideeffect "
234 v_mov_b32_e64 v7, -1
235 v_nop_e64
236 v_nop_e64
237 v_nop_e64
238 v_nop_e64
239 v_nop_e64
240 v_nop_e64
241 v_nop_e64
242 v_nop_e64
243 v_nop_e64
Matt Arsenault3c7581b2017-06-08 19:03:20 +0000244 v_nop_e64", "={v7}"()
Matt Arsenault786724a2016-07-12 21:41:32 +0000245 call void @llvm.AMDGPU.kill(float %var)
246 %vgpr = load volatile i32, i32 addrspace(1)* undef
247 %loop.cond = icmp eq i32 %vgpr, 0
248 br i1 %loop.cond, label %bb, label %exit
249
250exit:
251 store volatile i32 8, i32 addrspace(1)* undef
252 ret void
253}
254
Matt Arsenault83ab0492016-07-15 00:58:09 +0000255; bug 28550
256; CHECK-LABEL: {{^}}phi_use_def_before_kill:
257; CHECK: v_cndmask_b32_e64 [[PHIREG:v[0-9]+]], 0, -1.0,
258; CHECK: v_cmpx_le_f32_e32 vcc, 0,
259; CHECK-NEXT: s_cbranch_execnz [[BB4:BB[0-9]+_[0-9]+]]
260
261; CHECK: exp
262; CHECK-NEXT: s_endpgm
263
264; CHECK: [[KILLBB:BB[0-9]+_[0-9]+]]:
Kyle Buttefe56fe2017-01-11 19:55:19 +0000265; CHECK-NEXT: s_cbranch_scc0 [[PHIBB:BB[0-9]+_[0-9]+]]
Matt Arsenault83ab0492016-07-15 00:58:09 +0000266
Kyle Buttefe56fe2017-01-11 19:55:19 +0000267; CHECK: [[PHIBB]]:
Matt Arsenault83ab0492016-07-15 00:58:09 +0000268; CHECK: v_cmp_eq_f32_e32 vcc, 0, [[PHIREG]]
Kyle Buttefe56fe2017-01-11 19:55:19 +0000269; CHECK-NEXT: s_cbranch_vccz [[ENDBB:BB[0-9]+_[0-9]+]]
Matt Arsenault83ab0492016-07-15 00:58:09 +0000270
Kyle Buttefe56fe2017-01-11 19:55:19 +0000271; CHECK: ; %bb10
Matt Arsenault83ab0492016-07-15 00:58:09 +0000272; CHECK: v_mov_b32_e32 v{{[0-9]+}}, 9
273; CHECK: buffer_store_dword
274
Kyle Buttefe56fe2017-01-11 19:55:19 +0000275; CHECK: [[ENDBB]]:
Matt Arsenault83ab0492016-07-15 00:58:09 +0000276; CHECK-NEXT: s_endpgm
277define amdgpu_ps void @phi_use_def_before_kill() #0 {
278bb:
279 %tmp = fadd float undef, 1.000000e+00
280 %tmp1 = fcmp olt float 0.000000e+00, %tmp
281 %tmp2 = select i1 %tmp1, float -1.000000e+00, float 0.000000e+00
282 call void @llvm.AMDGPU.kill(float %tmp2)
283 br i1 undef, label %phibb, label %bb8
284
285phibb:
286 %tmp5 = phi float [ %tmp2, %bb ], [ 4.0, %bb8 ]
287 %tmp6 = fcmp oeq float %tmp5, 0.000000e+00
288 br i1 %tmp6, label %bb10, label %end
289
290bb8:
291 store volatile i32 8, i32 addrspace(1)* undef
292 br label %phibb
293
294bb10:
295 store volatile i32 9, i32 addrspace(1)* undef
296 br label %end
297
298end:
299 ret void
300}
Matt Arsenault786724a2016-07-12 21:41:32 +0000301
Matt Arsenaultfa5a86a2016-07-15 00:58:13 +0000302; CHECK-LABEL: {{^}}no_skip_no_successors:
Matt Arsenaultbbb47da2016-09-08 17:19:29 +0000303; CHECK: v_cmp_nge_f32
Matt Arsenaultf530e8b2016-11-07 19:09:33 +0000304; CHECK-NEXT: s_cbranch_vccz [[SKIPKILL:BB[0-9]+_[0-9]+]]
Matt Arsenaultfa5a86a2016-07-15 00:58:13 +0000305
Matt Arsenault6bc43d82016-10-06 16:20:41 +0000306; CHECK: ; %bb6
Matt Arsenaultfa5a86a2016-07-15 00:58:13 +0000307; CHECK: s_mov_b64 exec, 0
308
309; CHECK: [[SKIPKILL]]:
Matt Arsenaultad55ee52016-12-06 01:02:51 +0000310; CHECK: v_cmp_nge_f32_e32 vcc
311; CHECK-NEXT: BB#3: ; %bb5
Matt Arsenaultfa5a86a2016-07-15 00:58:13 +0000312; CHECK-NEXT: .Lfunc_end{{[0-9]+}}
313define amdgpu_ps void @no_skip_no_successors(float inreg %arg, float inreg %arg1) #0 {
314bb:
315 %tmp = fcmp ult float %arg1, 0.000000e+00
316 %tmp2 = fcmp ult float %arg, 0x3FCF5C2900000000
317 br i1 %tmp, label %bb6, label %bb3
318
319bb3: ; preds = %bb
320 br i1 %tmp2, label %bb5, label %bb4
321
322bb4: ; preds = %bb3
323 br i1 true, label %bb5, label %bb7
324
325bb5: ; preds = %bb4, %bb3
326 unreachable
327
328bb6: ; preds = %bb
329 call void @llvm.AMDGPU.kill(float -1.000000e+00)
330 unreachable
331
332bb7: ; preds = %bb4
333 ret void
334}
335
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000336; CHECK-LABEL: {{^}}if_after_kill_block:
337; CHECK: ; BB#0:
338; CHECK: s_and_saveexec_b64
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000339; CHECK-NEXT: mask branch [[BB4:BB[0-9]+_[0-9]+]]
340
341; CHECK: v_cmpx_le_f32_e32 vcc, 0,
342; CHECK: [[BB4]]:
343; CHECK: s_or_b64 exec, exec
344; CHECK: image_sample_c
345
346; CHECK: v_cmp_neq_f32_e32 vcc, 0,
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000347; CHECK: s_and_saveexec_b64 s{{\[[0-9]+:[0-9]+\]}}, vcc
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000348; CHECK: mask branch [[END:BB[0-9]+_[0-9]+]]
349; CHECK-NOT: branch
350
Matt Arsenault57431c92016-08-10 19:11:42 +0000351; CHECK: BB{{[0-9]+_[0-9]+}}: ; %bb8
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000352; CHECK: buffer_store_dword
353
354; CHECK: [[END]]:
355; CHECK: s_or_b64 exec, exec
356; CHECK: s_endpgm
Matt Arsenault964a8482017-03-21 16:24:12 +0000357define amdgpu_ps void @if_after_kill_block(float %arg, float %arg1, <4 x float> %arg2) #0 {
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000358bb:
359 %tmp = fcmp ult float %arg1, 0.000000e+00
360 br i1 %tmp, label %bb3, label %bb4
361
362bb3: ; preds = %bb
363 call void @llvm.AMDGPU.kill(float %arg)
364 br label %bb4
365
366bb4: ; preds = %bb3, %bb
Matt Arsenault964a8482017-03-21 16:24:12 +0000367 %tmp5 = call <4 x float> @llvm.amdgcn.image.sample.c.v4f32.v4f32.v8i32(<4 x float> %arg2, <8 x i32> undef, <4 x i32> undef, i32 15, i1 false, i1 false, i1 false, i1 false, i1 false)
Matt Arsenaultb91805e2016-07-15 00:58:15 +0000368 %tmp6 = extractelement <4 x float> %tmp5, i32 0
369 %tmp7 = fcmp une float %tmp6, 0.000000e+00
370 br i1 %tmp7, label %bb8, label %bb9
371
372bb8: ; preds = %bb9, %bb4
373 store volatile i32 9, i32 addrspace(1)* undef
374 ret void
375
376bb9: ; preds = %bb4
377 ret void
378}
379
Matt Arsenault964a8482017-03-21 16:24:12 +0000380declare <4 x float> @llvm.amdgcn.image.sample.c.v4f32.v4f32.v8i32(<4 x float>, <8 x i32>, <4 x i32>, i32, i1, i1, i1, i1, i1) #1
Matt Arsenault657f8712016-07-12 19:01:23 +0000381declare void @llvm.AMDGPU.kill(float) #0
382
383attributes #0 = { nounwind }
Matt Arsenault964a8482017-03-21 16:24:12 +0000384attributes #1 = { nounwind readonly }