blob: c4e54a737f1d48f4379d2b14952af3163bd8f570 [file] [log] [blame]
Matt Arsenault9c47dd52016-02-11 06:02:01 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s
Tom Stellardeef2ad92013-08-05 22:45:56 +00003
4; Tests for indirect addressing on SI, which is implemented using dynamic
5; indexing of vectors.
6
Tom Stellard8d19f9b2015-03-20 03:12:42 +00007; CHECK-LABEL: {{^}}extract_w_offset:
Matt Arsenault28419272015-10-07 00:42:51 +00008; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0
9; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000
10; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0
11; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0
Tom Stellard326d6ec2014-11-05 14:50:53 +000012; CHECK: s_mov_b32 m0
13; CHECK-NEXT: v_movrels_b32_e32
Tom Stellardeef2ad92013-08-05 22:45:56 +000014define void @extract_w_offset(float addrspace(1)* %out, i32 %in) {
15entry:
Matt Arsenault28419272015-10-07 00:42:51 +000016 %idx = add i32 %in, 1
17 %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %idx
18 store float %elt, float addrspace(1)* %out
19 ret void
20}
21
22; XXX: Could do v_or_b32 directly
23; CHECK-LABEL: {{^}}extract_w_offset_salu_use_vector:
24; CHECK-DAG: s_or_b32
25; CHECK-DAG: s_or_b32
26; CHECK-DAG: s_or_b32
27; CHECK-DAG: s_or_b32
28; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
29; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
30; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
31; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
32; CHECK: s_mov_b32 m0
33; CHECK-NEXT: v_movrels_b32_e32
34define void @extract_w_offset_salu_use_vector(i32 addrspace(1)* %out, i32 %in, <4 x i32> %or.val) {
35entry:
36 %idx = add i32 %in, 1
37 %vec = or <4 x i32> %or.val, <i32 1, i32 2, i32 3, i32 4>
38 %elt = extractelement <4 x i32> %vec, i32 %idx
39 store i32 %elt, i32 addrspace(1)* %out
Tom Stellardeef2ad92013-08-05 22:45:56 +000040 ret void
41}
42
Tom Stellard8d19f9b2015-03-20 03:12:42 +000043; CHECK-LABEL: {{^}}extract_wo_offset:
Matt Arsenault28419272015-10-07 00:42:51 +000044; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0
45; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000
46; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0
47; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0
Tom Stellard326d6ec2014-11-05 14:50:53 +000048; CHECK: s_mov_b32 m0
49; CHECK-NEXT: v_movrels_b32_e32
Tom Stellardeef2ad92013-08-05 22:45:56 +000050define void @extract_wo_offset(float addrspace(1)* %out, i32 %in) {
51entry:
Matt Arsenault28419272015-10-07 00:42:51 +000052 %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %in
53 store float %elt, float addrspace(1)* %out
Tom Stellardeef2ad92013-08-05 22:45:56 +000054 ret void
55}
56
Tom Stellard8b0182a2015-04-23 20:32:01 +000057; CHECK-LABEL: {{^}}extract_neg_offset_sgpr:
58; The offset depends on the register that holds the first element of the vector.
59; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
60; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0
61define void @extract_neg_offset_sgpr(i32 addrspace(1)* %out, i32 %offset) {
62entry:
63 %index = add i32 %offset, -512
64 %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index
65 store i32 %value, i32 addrspace(1)* %out
66 ret void
67}
68
Matt Arsenault28419272015-10-07 00:42:51 +000069; CHECK-LABEL: {{^}}extract_neg_offset_sgpr_loaded:
70; The offset depends on the register that holds the first element of the vector.
71; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
72; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0
73define void @extract_neg_offset_sgpr_loaded(i32 addrspace(1)* %out, <4 x i32> %vec0, <4 x i32> %vec1, i32 %offset) {
74entry:
75 %index = add i32 %offset, -512
76 %or = or <4 x i32> %vec0, %vec1
77 %value = extractelement <4 x i32> %or, i32 %index
78 store i32 %value, i32 addrspace(1)* %out
79 ret void
80}
81
Tom Stellard8b0182a2015-04-23 20:32:01 +000082; CHECK-LABEL: {{^}}extract_neg_offset_vgpr:
83; The offset depends on the register that holds the first element of the vector.
84; CHECK: v_readfirstlane_b32
85; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}}
86; CHECK-NEXT: v_movrels_b32_e32 v{{[0-9]}}, v0
87; CHECK: s_cbranch_execnz
88define void @extract_neg_offset_vgpr(i32 addrspace(1)* %out) {
89entry:
Matt Arsenault9c47dd52016-02-11 06:02:01 +000090 %id = call i32 @llvm.amdgcn.workitem.id.x() #1
Tom Stellard8b0182a2015-04-23 20:32:01 +000091 %index = add i32 %id, -512
92 %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index
93 store i32 %value, i32 addrspace(1)* %out
94 ret void
95}
96
Tom Stellard8d19f9b2015-03-20 03:12:42 +000097; CHECK-LABEL: {{^}}insert_w_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +000098; CHECK: s_mov_b32 m0
99; CHECK-NEXT: v_movreld_b32_e32
Tom Stellardeef2ad92013-08-05 22:45:56 +0000100define void @insert_w_offset(float addrspace(1)* %out, i32 %in) {
101entry:
102 %0 = add i32 %in, 1
103 %1 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %0
104 %2 = extractelement <4 x float> %1, i32 2
105 store float %2, float addrspace(1)* %out
106 ret void
107}
108
Tom Stellard8d19f9b2015-03-20 03:12:42 +0000109; CHECK-LABEL: {{^}}insert_wo_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000110; CHECK: s_mov_b32 m0
111; CHECK-NEXT: v_movreld_b32_e32
Tom Stellardeef2ad92013-08-05 22:45:56 +0000112define void @insert_wo_offset(float addrspace(1)* %out, i32 %in) {
113entry:
114 %0 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %in
115 %1 = extractelement <4 x float> %0, i32 2
116 store float %1, float addrspace(1)* %out
117 ret void
118}
Tom Stellard8b0182a2015-04-23 20:32:01 +0000119
120; CHECK-LABEL: {{^}}insert_neg_offset_sgpr:
121; The offset depends on the register that holds the first element of the vector.
122; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
123; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}}
124define void @insert_neg_offset_sgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, i32 %offset) {
125entry:
126 %index = add i32 %offset, -512
127 %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
128 store <4 x i32> %value, <4 x i32> addrspace(1)* %out
129 ret void
130}
131
Matt Arsenault28419272015-10-07 00:42:51 +0000132; The vector indexed into is originally loaded into an SGPR rather
133; than built with a reg_sequence
134
135; CHECK-LABEL: {{^}}insert_neg_offset_sgpr_loadreg:
136; The offset depends on the register that holds the first element of the vector.
137; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
138; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}}
139define void @insert_neg_offset_sgpr_loadreg(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, <4 x i32> %vec, i32 %offset) {
140entry:
141 %index = add i32 %offset, -512
142 %value = insertelement <4 x i32> %vec, i32 5, i32 %index
143 store <4 x i32> %value, <4 x i32> addrspace(1)* %out
144 ret void
145}
146
Tom Stellard8b0182a2015-04-23 20:32:01 +0000147; CHECK-LABEL: {{^}}insert_neg_offset_vgpr:
148; The offset depends on the register that holds the first element of the vector.
149; CHECK: v_readfirstlane_b32
150; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}}
151; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}}
152; CHECK: s_cbranch_execnz
153define void @insert_neg_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) {
154entry:
Matt Arsenault9c47dd52016-02-11 06:02:01 +0000155 %id = call i32 @llvm.amdgcn.workitem.id.x() #1
Tom Stellard8b0182a2015-04-23 20:32:01 +0000156 %index = add i32 %id, -512
157 %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
158 store <4 x i32> %value, <4 x i32> addrspace(1)* %out
159 ret void
160}
161
162; CHECK-LABEL: {{^}}insert_neg_inline_offset_vgpr:
163; The offset depends on the register that holds the first element of the vector.
164; CHECK: v_readfirstlane_b32
165; CHECK: s_add_i32 m0, m0, -{{[0-9]+}}
166; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}}
167; CHECK: s_cbranch_execnz
168define void @insert_neg_inline_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) {
169entry:
Matt Arsenault9c47dd52016-02-11 06:02:01 +0000170 %id = call i32 @llvm.amdgcn.workitem.id.x() #1
Tom Stellard8b0182a2015-04-23 20:32:01 +0000171 %index = add i32 %id, -16
172 %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
173 store <4 x i32> %value, <4 x i32> addrspace(1)* %out
174 ret void
175}
176
Matt Arsenault9babdf42016-06-22 20:15:28 +0000177; When the block is split to insert the loop, make sure any other
178; places that need to be expanded in the same block are also handled.
179
180; CHECK-LABEL: {{^}}extract_vgpr_offset_multiple_in_block:
181
Matthias Braun6ad3d052016-06-25 00:23:00 +0000182; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]]
Matt Arsenault9babdf42016-06-22 20:15:28 +0000183; CHECK-DAG: s_mov_b32 [[S_ELT0:s[0-9]+]], 7
184; CHECK-DAG: s_mov_b32 [[S_ELT1:s[0-9]+]], 9
185; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], [[S_ELT0]]
186; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT1:v[0-9]+]], [[S_ELT1]]
187; CHECK: s_waitcnt vmcnt(0)
188
189; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec
190
191; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]:
192; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
193; CHECK: s_mov_b32 m0, vcc_lo
194; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
195; CHECK: s_and_saveexec_b64 vcc, vcc
196; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL0:v[0-9]+]], [[VEC_ELT0]]
197; CHECK-NEXT: s_xor_b64 exec, exec, vcc
198; CHECK: s_cbranch_execnz [[LOOP0]]
199
200; FIXME: Redundant copy
201; CHECK: s_mov_b64 exec, [[MASK]]
Matthias Braun6ad3d052016-06-25 00:23:00 +0000202; CHECK: s_mov_b64 [[MASK2:s\[[0-9]+:[0-9]+\]]], exec
Matt Arsenault9babdf42016-06-22 20:15:28 +0000203
204; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]:
205; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
206; CHECK: s_mov_b32 m0, vcc_lo
207; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
208; CHECK: s_and_saveexec_b64 vcc, vcc
209; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL1:v[0-9]+]], [[VEC_ELT1]]
210; CHECK-NEXT: s_xor_b64 exec, exec, vcc
211; CHECK: s_cbranch_execnz [[LOOP1]]
212
213; CHECK: buffer_store_dword [[MOVREL0]]
214; CHECK: buffer_store_dword [[MOVREL1]]
215define void @extract_vgpr_offset_multiple_in_block(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 addrspace(1)* %in) #0 {
216entry:
217 %id = call i32 @llvm.amdgcn.workitem.id.x() #1
218 %id.ext = zext i32 %id to i64
219 %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext
220 %idx0 = load volatile i32, i32 addrspace(1)* %gep
221 %idx1 = add i32 %idx0, 1
222 %val0 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx0
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000223 %live.out.reg = call i32 asm sideeffect "s_mov_b32 $0, 17", "={SGPR4}" ()
Matt Arsenault9babdf42016-06-22 20:15:28 +0000224 %val1 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx1
225 store volatile i32 %val0, i32 addrspace(1)* %out0
226 store volatile i32 %val1, i32 addrspace(1)* %out0
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000227 %cmp = icmp eq i32 %id, 0
228 br i1 %cmp, label %bb1, label %bb2
229
230bb1:
231 store volatile i32 %live.out.reg, i32 addrspace(1)* undef
232 br label %bb2
233
234bb2:
Matt Arsenault9babdf42016-06-22 20:15:28 +0000235 ret void
236}
237
238; CHECK-LABEL: {{^}}insert_vgpr_offset_multiple_in_block:
239; CHECK-DAG: s_load_dwordx4 s{{\[}}[[S_ELT0:[0-9]+]]:[[S_ELT3:[0-9]+]]{{\]}}
240; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]]
241; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], s[[S_ELT0]]
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000242; CHECK-DAG: v_mov_b32 [[INS0:v[0-9]+]], 62
Matt Arsenault9babdf42016-06-22 20:15:28 +0000243; CHECK-DAG: s_waitcnt vmcnt(0)
244
245; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec
246
247; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]:
248; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
249; CHECK: s_mov_b32 m0, vcc_lo
250; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
251; CHECK: s_and_saveexec_b64 vcc, vcc
252; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL0:[0-9]+]], [[INS0]]
253; CHECK-NEXT: s_xor_b64 exec, exec, vcc
254; CHECK: s_cbranch_execnz [[LOOP0]]
255
256; FIXME: Redundant copy
257; CHECK: s_mov_b64 exec, [[MASK]]
258; CHECK: v_mov_b32_e32 [[INS1:v[0-9]+]], 63
259; CHECK: s_mov_b64 [[MASK]], exec
260
261; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]:
262; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
263; CHECK: s_mov_b32 m0, vcc_lo
264; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
265; CHECK: s_and_saveexec_b64 vcc, vcc
266; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL1:[0-9]+]], [[INS1]]
267; CHECK-NEXT: s_xor_b64 exec, exec, vcc
268; CHECK: s_cbranch_execnz [[LOOP1]]
269
270; CHECK: buffer_store_dwordx4 v{{\[}}[[MOVREL0]]:
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000271
272; CHECK: buffer_store_dword [[INS0]]
Matt Arsenault9babdf42016-06-22 20:15:28 +0000273define void @insert_vgpr_offset_multiple_in_block(<4 x i32> addrspace(1)* %out0, <4 x i32> addrspace(1)* %out1, i32 addrspace(1)* %in, <4 x i32> %vec0) #0 {
274entry:
275 %id = call i32 @llvm.amdgcn.workitem.id.x() #1
276 %id.ext = zext i32 %id to i64
277 %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext
278 %idx0 = load volatile i32, i32 addrspace(1)* %gep
279 %idx1 = add i32 %idx0, 1
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000280 %live.out.val = call i32 asm sideeffect "v_mov_b32 $0, 62", "=v"()
281 %vec1 = insertelement <4 x i32> %vec0, i32 %live.out.val, i32 %idx0
Matt Arsenault9babdf42016-06-22 20:15:28 +0000282 %vec2 = insertelement <4 x i32> %vec1, i32 63, i32 %idx1
283 store volatile <4 x i32> %vec2, <4 x i32> addrspace(1)* %out0
Matt Arsenault3cb4dde2016-06-22 23:40:57 +0000284 %cmp = icmp eq i32 %id, 0
285 br i1 %cmp, label %bb1, label %bb2
286
287bb1:
288 store volatile i32 %live.out.val, i32 addrspace(1)* undef
289 br label %bb2
290
291bb2:
Matt Arsenault9babdf42016-06-22 20:15:28 +0000292 ret void
293}
294
295; CHECK-LABEL: {{^}}extract_adjacent_blocks:
296; CHECK: s_load_dword [[ARG:s[0-9]+]]
297; CHECK: s_cmp_lg_i32
298; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]]
299
300; CHECK: buffer_load_dwordx4
301; CHECK: s_mov_b32 m0,
302; CHECK: v_movrels_b32_e32
303; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]]
304
305; CHECK: [[BB4]]:
306; CHECK: buffer_load_dwordx4
307; CHECK: s_mov_b32 m0,
308; CHECK: v_movrels_b32_e32
309
310; CHECK: [[ENDBB]]:
311; CHECK: buffer_store_dword
312; CHECK: s_endpgm
313define void @extract_adjacent_blocks(i32 %arg) #0 {
314bb:
315 %tmp = icmp eq i32 %arg, 0
316 br i1 %tmp, label %bb1, label %bb4
317
318bb1:
319 %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
320 %tmp3 = extractelement <4 x float> %tmp2, i32 undef
321 br label %bb7
322
323bb4:
324 %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
325 %tmp6 = extractelement <4 x float> %tmp5, i32 undef
326 br label %bb7
327
328bb7:
329 %tmp8 = phi float [ %tmp3, %bb1 ], [ %tmp6, %bb4 ]
330 store volatile float %tmp8, float addrspace(1)* undef
331 ret void
332}
333
334; CHECK-LABEL: {{^}}insert_adjacent_blocks:
335; CHECK: s_load_dword [[ARG:s[0-9]+]]
336; CHECK: s_cmp_lg_i32
337; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]]
338
339; CHECK: buffer_load_dwordx4
340; CHECK: s_mov_b32 m0,
341; CHECK: v_movreld_b32_e32
342; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]]
343
344; CHECK: [[BB4]]:
345; CHECK: buffer_load_dwordx4
346; CHECK: s_mov_b32 m0,
347; CHECK: v_movreld_b32_e32
348
349; CHECK: [[ENDBB]]:
350; CHECK: buffer_store_dword
351; CHECK: s_endpgm
352define void @insert_adjacent_blocks(i32 %arg, float %val0) #0 {
353bb:
354 %tmp = icmp eq i32 %arg, 0
355 br i1 %tmp, label %bb1, label %bb4
356
357bb1: ; preds = %bb
358 %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
359 %tmp3 = insertelement <4 x float> %tmp2, float %val0, i32 undef
360 br label %bb7
361
362bb4: ; preds = %bb
363 %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
364 %tmp6 = insertelement <4 x float> %tmp5, float %val0, i32 undef
365 br label %bb7
366
367bb7: ; preds = %bb4, %bb1
368 %tmp8 = phi <4 x float> [ %tmp3, %bb1 ], [ %tmp6, %bb4 ]
369 store volatile <4 x float> %tmp8, <4 x float> addrspace(1)* undef
370 ret void
371}
372
373; FIXME: Should be able to fold zero input to movreld to inline imm?
374
375; CHECK-LABEL: {{^}}multi_same_block:
376; CHECK: s_load_dword [[ARG:s[0-9]+]]
377; CHECK-DAG: v_mov_b32_e32 [[ZERO:v[0-9]+]], 0{{$}}
378; CHECK-DAG: s_add_i32 m0, [[ARG]], -16
379; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, [[ZERO]]
380
381; CHECK: s_add_i32 m0, [[ARG]], -14
382; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}
383
384; CHECK: s_mov_b32 m0, -1
385; CHECK: ds_write_b32
386; CHECK: ds_write_b32
387; CHECK: s_endpgm
388define void @multi_same_block(i32 %arg) #0 {
389bb:
390 %tmp1 = add i32 %arg, -16
391 %tmp2 = insertelement <6 x float> <float 1.700000e+01, float 1.800000e+01, float 1.900000e+01, float 2.000000e+01, float 2.100000e+01, float 2.200000e+01>, float 0.000000e+00, i32 %tmp1
392 %tmp3 = add i32 %arg, -16
393 %tmp4 = insertelement <6 x float> <float 0x40311999A0000000, float 0x40321999A0000000, float 0x40331999A0000000, float 0x40341999A0000000, float 0x40351999A0000000, float 0x40361999A0000000>, float 0x3FB99999A0000000, i32 %tmp3
394 %tmp5 = bitcast <6 x float> %tmp2 to <6 x i32>
395 %tmp6 = extractelement <6 x i32> %tmp5, i32 1
396 %tmp7 = bitcast <6 x float> %tmp4 to <6 x i32>
397 %tmp8 = extractelement <6 x i32> %tmp7, i32 5
398 store volatile i32 %tmp6, i32 addrspace(3)* undef, align 4
399 store volatile i32 %tmp8, i32 addrspace(3)* undef, align 4
400 ret void
401}
402
Matt Arsenault9c47dd52016-02-11 06:02:01 +0000403declare i32 @llvm.amdgcn.workitem.id.x() #1
404
Matt Arsenault9babdf42016-06-22 20:15:28 +0000405attributes #0 = { nounwind }
Tom Stellard8b0182a2015-04-23 20:32:01 +0000406attributes #1 = { nounwind readnone }