[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / copy-illegal-type.ll
blobee16e7ebc8ed49d409e6b0b6f0d0aed00e07077e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=tahiti < %s | FileCheck -allow-deprecated-dag-overlap -check-prefix=GCN -check-prefix=SI -check-prefix=FUNC %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -amdgpu-sdwa-peephole=0 < %s | FileCheck -allow-deprecated-dag-overlap -check-prefix=GCN -check-prefix=VI -check-prefix=FUNC %s
5 declare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
6 declare i32 @llvm.amdgcn.workitem.id.y() nounwind readnone
8 define amdgpu_kernel void @test_copy_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(1)* %in) nounwind {
9 ; SI-LABEL: test_copy_v4i8:
10 ; SI:       ; %bb.0:
11 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
12 ; SI-NEXT:    s_mov_b32 s7, 0xf000
13 ; SI-NEXT:    s_mov_b32 s10, 0
14 ; SI-NEXT:    s_mov_b32 s11, s7
15 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
16 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
17 ; SI-NEXT:    s_mov_b64 s[8:9], s[2:3]
18 ; SI-NEXT:    v_mov_b32_e32 v1, 0
19 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
20 ; SI-NEXT:    s_mov_b32 s6, -1
21 ; SI-NEXT:    s_mov_b32 s4, s0
22 ; SI-NEXT:    s_mov_b32 s5, s1
23 ; SI-NEXT:    s_waitcnt vmcnt(0)
24 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
25 ; SI-NEXT:    s_endpgm
27 ; VI-LABEL: test_copy_v4i8:
28 ; VI:       ; %bb.0:
29 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
30 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
31 ; VI-NEXT:    s_mov_b32 s7, 0xf000
32 ; VI-NEXT:    s_mov_b32 s6, -1
33 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
34 ; VI-NEXT:    v_mov_b32_e32 v1, s3
35 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
36 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
37 ; VI-NEXT:    flat_load_dword v0, v[0:1]
38 ; VI-NEXT:    s_mov_b32 s4, s0
39 ; VI-NEXT:    s_mov_b32 s5, s1
40 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
41 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
42 ; VI-NEXT:    s_endpgm
43   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
44   %gep = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
45   %val = load <4 x i8>, <4 x i8> addrspace(1)* %gep, align 4
46   store <4 x i8> %val, <4 x i8> addrspace(1)* %out, align 4
47   ret void
50 define amdgpu_kernel void @test_copy_v4i8_x2(<4 x i8> addrspace(1)* %out0, <4 x i8> addrspace(1)* %out1, <4 x i8> addrspace(1)* %in) nounwind {
51 ; SI-LABEL: test_copy_v4i8_x2:
52 ; SI:       ; %bb.0:
53 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
54 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
55 ; SI-NEXT:    s_mov_b32 s11, 0xf000
56 ; SI-NEXT:    s_mov_b32 s2, 0
57 ; SI-NEXT:    s_mov_b32 s3, s11
58 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
59 ; SI-NEXT:    v_mov_b32_e32 v1, 0
60 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
61 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64
62 ; SI-NEXT:    s_mov_b32 s10, -1
63 ; SI-NEXT:    s_mov_b32 s8, s6
64 ; SI-NEXT:    s_mov_b32 s9, s7
65 ; SI-NEXT:    s_mov_b32 s6, s10
66 ; SI-NEXT:    s_mov_b32 s7, s11
67 ; SI-NEXT:    s_waitcnt vmcnt(0)
68 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
69 ; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
70 ; SI-NEXT:    s_endpgm
72 ; VI-LABEL: test_copy_v4i8_x2:
73 ; VI:       ; %bb.0:
74 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
75 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
76 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
77 ; VI-NEXT:    s_mov_b32 s3, 0xf000
78 ; VI-NEXT:    s_mov_b32 s2, -1
79 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
80 ; VI-NEXT:    s_mov_b32 s0, s6
81 ; VI-NEXT:    v_mov_b32_e32 v1, s9
82 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s8, v0
83 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
84 ; VI-NEXT:    flat_load_dword v0, v[0:1]
85 ; VI-NEXT:    s_mov_b32 s1, s7
86 ; VI-NEXT:    s_mov_b32 s6, s2
87 ; VI-NEXT:    s_mov_b32 s7, s3
88 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
89 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
90 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
91 ; VI-NEXT:    s_endpgm
92   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
93   %gep = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
94   %val = load <4 x i8>, <4 x i8> addrspace(1)* %gep, align 4
95   store <4 x i8> %val, <4 x i8> addrspace(1)* %out0, align 4
96   store <4 x i8> %val, <4 x i8> addrspace(1)* %out1, align 4
97   ret void
100 define amdgpu_kernel void @test_copy_v4i8_x3(<4 x i8> addrspace(1)* %out0, <4 x i8> addrspace(1)* %out1, <4 x i8> addrspace(1)* %out2, <4 x i8> addrspace(1)* %in) nounwind {
101 ; SI-LABEL: test_copy_v4i8_x3:
102 ; SI:       ; %bb.0:
103 ; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
104 ; SI-NEXT:    s_mov_b32 s11, 0xf000
105 ; SI-NEXT:    s_mov_b32 s14, 0
106 ; SI-NEXT:    s_mov_b32 s15, s11
107 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
108 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
109 ; SI-NEXT:    s_mov_b64 s[12:13], s[6:7]
110 ; SI-NEXT:    v_mov_b32_e32 v1, 0
111 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[12:15], 0 addr64
112 ; SI-NEXT:    s_mov_b32 s10, -1
113 ; SI-NEXT:    s_mov_b32 s8, s4
114 ; SI-NEXT:    s_mov_b32 s9, s5
115 ; SI-NEXT:    s_mov_b32 s4, s2
116 ; SI-NEXT:    s_mov_b32 s5, s3
117 ; SI-NEXT:    s_mov_b32 s6, s10
118 ; SI-NEXT:    s_mov_b32 s7, s11
119 ; SI-NEXT:    s_mov_b32 s2, s10
120 ; SI-NEXT:    s_mov_b32 s3, s11
121 ; SI-NEXT:    s_waitcnt vmcnt(0)
122 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
123 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
124 ; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
125 ; SI-NEXT:    s_endpgm
127 ; VI-LABEL: test_copy_v4i8_x3:
128 ; VI:       ; %bb.0:
129 ; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
130 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
131 ; VI-NEXT:    s_mov_b32 s11, 0xf000
132 ; VI-NEXT:    s_mov_b32 s10, -1
133 ; VI-NEXT:    s_mov_b32 s14, s10
134 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
135 ; VI-NEXT:    v_mov_b32_e32 v1, s7
136 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s6, v0
137 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
138 ; VI-NEXT:    flat_load_dword v0, v[0:1]
139 ; VI-NEXT:    s_mov_b32 s12, s2
140 ; VI-NEXT:    s_mov_b32 s13, s3
141 ; VI-NEXT:    s_mov_b32 s8, s4
142 ; VI-NEXT:    s_mov_b32 s9, s5
143 ; VI-NEXT:    s_mov_b32 s15, s11
144 ; VI-NEXT:    s_mov_b32 s2, s10
145 ; VI-NEXT:    s_mov_b32 s3, s11
146 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
147 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
148 ; VI-NEXT:    buffer_store_dword v0, off, s[12:15], 0
149 ; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
150 ; VI-NEXT:    s_endpgm
151   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
152   %gep = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
153   %val = load <4 x i8>, <4 x i8> addrspace(1)* %gep, align 4
154   store <4 x i8> %val, <4 x i8> addrspace(1)* %out0, align 4
155   store <4 x i8> %val, <4 x i8> addrspace(1)* %out1, align 4
156   store <4 x i8> %val, <4 x i8> addrspace(1)* %out2, align 4
157   ret void
160 define amdgpu_kernel void @test_copy_v4i8_x4(<4 x i8> addrspace(1)* %out0, <4 x i8> addrspace(1)* %out1, <4 x i8> addrspace(1)* %out2, <4 x i8> addrspace(1)* %out3, <4 x i8> addrspace(1)* %in) nounwind {
161 ; SI-LABEL: test_copy_v4i8_x4:
162 ; SI:       ; %bb.0:
163 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x11
164 ; SI-NEXT:    s_mov_b32 s15, 0xf000
165 ; SI-NEXT:    s_mov_b32 s10, 0
166 ; SI-NEXT:    s_mov_b32 s11, s15
167 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
168 ; SI-NEXT:    v_mov_b32_e32 v1, 0
169 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
170 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
171 ; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
172 ; SI-NEXT:    s_mov_b32 s14, -1
173 ; SI-NEXT:    s_mov_b32 s18, s14
174 ; SI-NEXT:    s_mov_b32 s19, s15
175 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
176 ; SI-NEXT:    s_mov_b32 s12, s6
177 ; SI-NEXT:    s_mov_b32 s13, s7
178 ; SI-NEXT:    s_mov_b32 s16, s2
179 ; SI-NEXT:    s_mov_b32 s17, s3
180 ; SI-NEXT:    s_mov_b32 s6, s14
181 ; SI-NEXT:    s_mov_b32 s7, s15
182 ; SI-NEXT:    s_mov_b32 s2, s14
183 ; SI-NEXT:    s_mov_b32 s3, s15
184 ; SI-NEXT:    s_waitcnt vmcnt(0)
185 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
186 ; SI-NEXT:    buffer_store_dword v0, off, s[16:19], 0
187 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
188 ; SI-NEXT:    buffer_store_dword v0, off, s[12:15], 0
189 ; SI-NEXT:    s_endpgm
191 ; VI-LABEL: test_copy_v4i8_x4:
192 ; VI:       ; %bb.0:
193 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
194 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
195 ; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
196 ; VI-NEXT:    s_mov_b32 s11, 0xf000
197 ; VI-NEXT:    s_mov_b32 s10, -1
198 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
199 ; VI-NEXT:    v_mov_b32_e32 v1, s9
200 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s8, v0
201 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
202 ; VI-NEXT:    flat_load_dword v0, v[0:1]
203 ; VI-NEXT:    s_mov_b32 s8, s6
204 ; VI-NEXT:    s_mov_b32 s9, s7
205 ; VI-NEXT:    s_mov_b32 s12, s2
206 ; VI-NEXT:    s_mov_b32 s13, s3
207 ; VI-NEXT:    s_mov_b32 s6, s10
208 ; VI-NEXT:    s_mov_b32 s7, s11
209 ; VI-NEXT:    s_mov_b32 s14, s10
210 ; VI-NEXT:    s_mov_b32 s15, s11
211 ; VI-NEXT:    s_mov_b32 s2, s10
212 ; VI-NEXT:    s_mov_b32 s3, s11
213 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
214 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
215 ; VI-NEXT:    buffer_store_dword v0, off, s[12:15], 0
216 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
217 ; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
218 ; VI-NEXT:    s_endpgm
219   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
220   %gep = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
221   %val = load <4 x i8>, <4 x i8> addrspace(1)* %gep, align 4
222   store <4 x i8> %val, <4 x i8> addrspace(1)* %out0, align 4
223   store <4 x i8> %val, <4 x i8> addrspace(1)* %out1, align 4
224   store <4 x i8> %val, <4 x i8> addrspace(1)* %out2, align 4
225   store <4 x i8> %val, <4 x i8> addrspace(1)* %out3, align 4
226   ret void
229 define amdgpu_kernel void @test_copy_v4i8_extra_use(<4 x i8> addrspace(1)* %out0, <4 x i8> addrspace(1)* %out1, <4 x i8> addrspace(1)* %in) nounwind {
230 ; SI-LABEL: test_copy_v4i8_extra_use:
231 ; SI:       ; %bb.0:
232 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
233 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
234 ; SI-NEXT:    s_mov_b32 s11, 0xf000
235 ; SI-NEXT:    s_mov_b32 s2, 0
236 ; SI-NEXT:    s_mov_b32 s3, s11
237 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
238 ; SI-NEXT:    v_mov_b32_e32 v1, 0
239 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
240 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64
241 ; SI-NEXT:    s_mov_b32 s10, -1
242 ; SI-NEXT:    s_mov_b32 s0, 0xff00
243 ; SI-NEXT:    s_mov_b32 s8, s6
244 ; SI-NEXT:    s_mov_b32 s9, s7
245 ; SI-NEXT:    s_mov_b32 s6, s10
246 ; SI-NEXT:    s_mov_b32 s7, s11
247 ; SI-NEXT:    s_movk_i32 s1, 0xff
248 ; SI-NEXT:    s_waitcnt vmcnt(0)
249 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
250 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
251 ; SI-NEXT:    v_and_b32_e32 v2, s0, v0
252 ; SI-NEXT:    s_waitcnt expcnt(0)
253 ; SI-NEXT:    v_add_i32_e32 v0, vcc, 9, v0
254 ; SI-NEXT:    v_and_b32_e32 v0, s1, v0
255 ; SI-NEXT:    v_and_b32_e32 v3, s0, v1
256 ; SI-NEXT:    v_add_i32_e32 v1, vcc, 9, v1
257 ; SI-NEXT:    v_or_b32_e32 v0, v2, v0
258 ; SI-NEXT:    v_and_b32_e32 v1, s1, v1
259 ; SI-NEXT:    v_add_i32_e32 v0, vcc, 0x900, v0
260 ; SI-NEXT:    v_or_b32_e32 v1, v3, v1
261 ; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
262 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
263 ; SI-NEXT:    v_or_b32_e32 v0, v1, v0
264 ; SI-NEXT:    v_add_i32_e32 v0, vcc, 0x9000000, v0
265 ; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
266 ; SI-NEXT:    s_endpgm
268 ; VI-LABEL: test_copy_v4i8_extra_use:
269 ; VI:       ; %bb.0:
270 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
271 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
272 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
273 ; VI-NEXT:    s_movk_i32 s8, 0xff00
274 ; VI-NEXT:    s_mov_b32 s3, 0xf000
275 ; VI-NEXT:    s_mov_b32 s2, -1
276 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
277 ; VI-NEXT:    v_mov_b32_e32 v1, s1
278 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
279 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
280 ; VI-NEXT:    flat_load_dword v0, v[0:1]
281 ; VI-NEXT:    s_mov_b32 s0, s6
282 ; VI-NEXT:    s_mov_b32 s1, s7
283 ; VI-NEXT:    s_movk_i32 s9, 0xff
284 ; VI-NEXT:    s_mov_b32 s6, s2
285 ; VI-NEXT:    s_mov_b32 s7, s3
286 ; VI-NEXT:    s_movk_i32 s10, 0x900
287 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
288 ; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
289 ; VI-NEXT:    v_and_b32_e32 v3, s8, v1
290 ; VI-NEXT:    v_add_u16_e32 v1, 9, v1
291 ; VI-NEXT:    v_and_b32_e32 v1, s9, v1
292 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
293 ; VI-NEXT:    v_and_b32_e32 v2, s8, v0
294 ; VI-NEXT:    v_add_u16_e32 v0, 9, v0
295 ; VI-NEXT:    v_and_b32_e32 v0, s9, v0
296 ; VI-NEXT:    v_or_b32_e32 v1, v3, v1
297 ; VI-NEXT:    v_or_b32_e32 v0, v2, v0
298 ; VI-NEXT:    v_add_u16_e32 v1, s10, v1
299 ; VI-NEXT:    v_add_u16_e32 v0, s10, v0
300 ; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
301 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
302 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
303 ; VI-NEXT:    s_endpgm
304   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
305   %gep = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
306   %val = load <4 x i8>, <4 x i8> addrspace(1)* %gep, align 4
307   %add = add <4 x i8> %val, <i8 9, i8 9, i8 9, i8 9>
308   store <4 x i8> %val, <4 x i8> addrspace(1)* %out0, align 4
309   store <4 x i8> %add, <4 x i8> addrspace(1)* %out1, align 4
310   ret void
313 ; FIXME: Need to handle non-uniform case for function below (load without gep).
314 define amdgpu_kernel void @test_copy_v4i8_x2_extra_use(<4 x i8> addrspace(1)* %out0, <4 x i8> addrspace(1)* %out1, <4 x i8> addrspace(1)* %out2, <4 x i8> addrspace(1)* %in) nounwind {
315 ; SI-LABEL: test_copy_v4i8_x2_extra_use:
316 ; SI:       ; %bb.0:
317 ; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
318 ; SI-NEXT:    s_mov_b32 s11, 0xf000
319 ; SI-NEXT:    s_mov_b32 s14, 0
320 ; SI-NEXT:    s_mov_b32 s15, s11
321 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
322 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
323 ; SI-NEXT:    s_mov_b64 s[12:13], s[6:7]
324 ; SI-NEXT:    v_mov_b32_e32 v1, 0
325 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[12:15], 0 addr64
326 ; SI-NEXT:    s_mov_b32 s16, 0xff00
327 ; SI-NEXT:    s_movk_i32 s17, 0xff
328 ; SI-NEXT:    s_mov_b32 s10, -1
329 ; SI-NEXT:    s_mov_b32 s8, s4
330 ; SI-NEXT:    s_mov_b32 s9, s5
331 ; SI-NEXT:    s_mov_b32 s4, s2
332 ; SI-NEXT:    s_mov_b32 s5, s3
333 ; SI-NEXT:    s_mov_b32 s6, s10
334 ; SI-NEXT:    s_mov_b32 s7, s11
335 ; SI-NEXT:    s_mov_b32 s2, s10
336 ; SI-NEXT:    s_mov_b32 s3, s11
337 ; SI-NEXT:    s_waitcnt vmcnt(0)
338 ; SI-NEXT:    v_add_i32_e32 v3, vcc, 9, v0
339 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
340 ; SI-NEXT:    v_and_b32_e32 v4, s16, v1
341 ; SI-NEXT:    v_add_i32_e32 v1, vcc, 9, v1
342 ; SI-NEXT:    v_and_b32_e32 v2, s16, v0
343 ; SI-NEXT:    v_and_b32_e32 v3, s17, v3
344 ; SI-NEXT:    v_or_b32_e32 v2, v2, v3
345 ; SI-NEXT:    v_and_b32_e32 v1, s17, v1
346 ; SI-NEXT:    v_add_i32_e32 v2, vcc, 0x900, v2
347 ; SI-NEXT:    v_or_b32_e32 v1, v4, v1
348 ; SI-NEXT:    v_and_b32_e32 v2, 0xffff, v2
349 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
350 ; SI-NEXT:    v_or_b32_e32 v1, v1, v2
351 ; SI-NEXT:    v_add_i32_e32 v1, vcc, 0x9000000, v1
352 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
353 ; SI-NEXT:    buffer_store_dword v1, off, s[4:7], 0
354 ; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
355 ; SI-NEXT:    s_endpgm
357 ; VI-LABEL: test_copy_v4i8_x2_extra_use:
358 ; VI:       ; %bb.0:
359 ; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
360 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
361 ; VI-NEXT:    s_movk_i32 s12, 0xff00
362 ; VI-NEXT:    s_movk_i32 s13, 0xff
363 ; VI-NEXT:    s_movk_i32 s14, 0x900
364 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
365 ; VI-NEXT:    v_mov_b32_e32 v1, s7
366 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s6, v0
367 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
368 ; VI-NEXT:    flat_load_dword v0, v[0:1]
369 ; VI-NEXT:    s_mov_b32 s7, 0xf000
370 ; VI-NEXT:    s_mov_b32 s6, -1
371 ; VI-NEXT:    s_mov_b32 s8, s2
372 ; VI-NEXT:    s_mov_b32 s9, s3
373 ; VI-NEXT:    s_mov_b32 s10, s6
374 ; VI-NEXT:    s_mov_b32 s11, s7
375 ; VI-NEXT:    s_mov_b32 s2, s6
376 ; VI-NEXT:    s_mov_b32 s3, s7
377 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
378 ; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
379 ; VI-NEXT:    v_and_b32_e32 v4, s12, v1
380 ; VI-NEXT:    v_add_u16_e32 v1, 9, v1
381 ; VI-NEXT:    v_add_u16_e32 v3, 9, v0
382 ; VI-NEXT:    v_and_b32_e32 v1, s13, v1
383 ; VI-NEXT:    v_or_b32_e32 v1, v4, v1
384 ; VI-NEXT:    v_and_b32_e32 v2, s12, v0
385 ; VI-NEXT:    v_and_b32_e32 v3, s13, v3
386 ; VI-NEXT:    v_or_b32_e32 v2, v2, v3
387 ; VI-NEXT:    v_add_u16_e32 v1, s14, v1
388 ; VI-NEXT:    v_add_u16_e32 v2, s14, v2
389 ; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
390 ; VI-NEXT:    v_or_b32_e32 v1, v2, v1
391 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
392 ; VI-NEXT:    buffer_store_dword v1, off, s[8:11], 0
393 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
394 ; VI-NEXT:    s_endpgm
395   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
396   %in.ptr = getelementptr <4 x i8>, <4 x i8> addrspace(1)* %in, i32 %tid.x
397   %val = load <4 x i8>, <4 x i8> addrspace(1)* %in.ptr, align 4
398   %add = add <4 x i8> %val, <i8 9, i8 9, i8 9, i8 9>
399   store <4 x i8> %val, <4 x i8> addrspace(1)* %out0, align 4
400   store <4 x i8> %add, <4 x i8> addrspace(1)* %out1, align 4
401   store <4 x i8> %val, <4 x i8> addrspace(1)* %out2, align 4
402   ret void
405 define amdgpu_kernel void @test_copy_v3i8_align4(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(1)* %in) nounwind {
406 ; SI-LABEL: test_copy_v3i8_align4:
407 ; SI:       ; %bb.0:
408 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
409 ; SI-NEXT:    s_mov_b32 s7, 0xf000
410 ; SI-NEXT:    s_mov_b32 s10, 0
411 ; SI-NEXT:    s_mov_b32 s11, s7
412 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
413 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
414 ; SI-NEXT:    s_mov_b64 s[8:9], s[2:3]
415 ; SI-NEXT:    v_mov_b32_e32 v1, 0
416 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
417 ; SI-NEXT:    s_mov_b32 s6, -1
418 ; SI-NEXT:    s_mov_b32 s4, s0
419 ; SI-NEXT:    s_mov_b32 s5, s1
420 ; SI-NEXT:    s_waitcnt vmcnt(0)
421 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
422 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
423 ; SI-NEXT:    buffer_store_byte v1, off, s[4:7], 0 offset:2
424 ; SI-NEXT:    s_endpgm
426 ; VI-LABEL: test_copy_v3i8_align4:
427 ; VI:       ; %bb.0:
428 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
429 ; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
430 ; VI-NEXT:    s_mov_b32 s7, 0xf000
431 ; VI-NEXT:    s_mov_b32 s6, -1
432 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
433 ; VI-NEXT:    v_mov_b32_e32 v1, s3
434 ; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
435 ; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
436 ; VI-NEXT:    flat_load_dword v0, v[0:1]
437 ; VI-NEXT:    s_mov_b32 s4, s0
438 ; VI-NEXT:    s_mov_b32 s5, s1
439 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
440 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
441 ; VI-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
442 ; VI-NEXT:    buffer_store_byte v0, off, s[4:7], 0 offset:2
443 ; VI-NEXT:    s_endpgm
444   %tid.x = call i32 @llvm.amdgcn.workitem.id.x()
445   %gep = getelementptr <3 x i8>, <3 x i8> addrspace(1)* %in, i32 %tid.x
446   %val = load <3 x i8>, <3 x i8> addrspace(1)* %gep, align 4
447   store <3 x i8> %val, <3 x i8> addrspace(1)* %out, align 4
448   ret void
451 define amdgpu_kernel void @test_copy_v3i8_align2(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(1)* %in) nounwind {
452 ; SI-LABEL: test_copy_v3i8_align2:
453 ; SI:       ; %bb.0:
454 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
455 ; SI-NEXT:    s_mov_b32 s3, 0xf000
456 ; SI-NEXT:    s_mov_b32 s2, -1
457 ; SI-NEXT:    s_mov_b32 s10, s2
458 ; SI-NEXT:    s_mov_b32 s11, s3
459 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
460 ; SI-NEXT:    s_mov_b32 s8, s6
461 ; SI-NEXT:    s_mov_b32 s9, s7
462 ; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
463 ; SI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:2
464 ; SI-NEXT:    s_mov_b32 s0, s4
465 ; SI-NEXT:    s_mov_b32 s1, s5
466 ; SI-NEXT:    s_waitcnt vmcnt(0)
467 ; SI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:2
468 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
469 ; SI-NEXT:    s_endpgm
471 ; VI-LABEL: test_copy_v3i8_align2:
472 ; VI:       ; %bb.0:
473 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
474 ; VI-NEXT:    s_mov_b32 s3, 0xf000
475 ; VI-NEXT:    s_mov_b32 s2, -1
476 ; VI-NEXT:    s_mov_b32 s10, s2
477 ; VI-NEXT:    s_mov_b32 s11, s3
478 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
479 ; VI-NEXT:    s_mov_b32 s8, s6
480 ; VI-NEXT:    s_mov_b32 s9, s7
481 ; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
482 ; VI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:2
483 ; VI-NEXT:    s_mov_b32 s0, s4
484 ; VI-NEXT:    s_mov_b32 s1, s5
485 ; VI-NEXT:    s_waitcnt vmcnt(0)
486 ; VI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:2
487 ; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
488 ; VI-NEXT:    s_endpgm
489   %val = load <3 x i8>, <3 x i8> addrspace(1)* %in, align 2
490   store <3 x i8> %val, <3 x i8> addrspace(1)* %out, align 2
491   ret void
494 define amdgpu_kernel void @test_copy_v3i8_align1(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(1)* %in) nounwind {
495 ; SI-LABEL: test_copy_v3i8_align1:
496 ; SI:       ; %bb.0:
497 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
498 ; SI-NEXT:    s_mov_b32 s3, 0xf000
499 ; SI-NEXT:    s_mov_b32 s2, -1
500 ; SI-NEXT:    s_mov_b32 s10, s2
501 ; SI-NEXT:    s_mov_b32 s11, s3
502 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
503 ; SI-NEXT:    s_mov_b32 s8, s6
504 ; SI-NEXT:    s_mov_b32 s9, s7
505 ; SI-NEXT:    buffer_load_ubyte v0, off, s[8:11], 0
506 ; SI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:1
507 ; SI-NEXT:    buffer_load_ubyte v2, off, s[8:11], 0 offset:2
508 ; SI-NEXT:    s_mov_b32 s0, s4
509 ; SI-NEXT:    s_mov_b32 s1, s5
510 ; SI-NEXT:    s_waitcnt vmcnt(2)
511 ; SI-NEXT:    buffer_store_byte v0, off, s[0:3], 0
512 ; SI-NEXT:    s_waitcnt vmcnt(2)
513 ; SI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:1
514 ; SI-NEXT:    s_waitcnt vmcnt(2)
515 ; SI-NEXT:    buffer_store_byte v2, off, s[0:3], 0 offset:2
516 ; SI-NEXT:    s_endpgm
518 ; VI-LABEL: test_copy_v3i8_align1:
519 ; VI:       ; %bb.0:
520 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
521 ; VI-NEXT:    s_mov_b32 s3, 0xf000
522 ; VI-NEXT:    s_mov_b32 s2, -1
523 ; VI-NEXT:    s_mov_b32 s10, s2
524 ; VI-NEXT:    s_mov_b32 s11, s3
525 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
526 ; VI-NEXT:    s_mov_b32 s8, s6
527 ; VI-NEXT:    s_mov_b32 s9, s7
528 ; VI-NEXT:    buffer_load_ubyte v0, off, s[8:11], 0
529 ; VI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:1
530 ; VI-NEXT:    buffer_load_ubyte v2, off, s[8:11], 0 offset:2
531 ; VI-NEXT:    s_mov_b32 s0, s4
532 ; VI-NEXT:    s_mov_b32 s1, s5
533 ; VI-NEXT:    s_waitcnt vmcnt(2)
534 ; VI-NEXT:    buffer_store_byte v0, off, s[0:3], 0
535 ; VI-NEXT:    s_waitcnt vmcnt(2)
536 ; VI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:1
537 ; VI-NEXT:    s_waitcnt vmcnt(2)
538 ; VI-NEXT:    buffer_store_byte v2, off, s[0:3], 0 offset:2
539 ; VI-NEXT:    s_endpgm
540   %val = load <3 x i8>, <3 x i8> addrspace(1)* %in, align 1
541   store <3 x i8> %val, <3 x i8> addrspace(1)* %out, align 1
542   ret void
545 define amdgpu_kernel void @test_copy_v4i8_volatile_load(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(1)* %in) nounwind {
546 ; SI-LABEL: test_copy_v4i8_volatile_load:
547 ; SI:       ; %bb.0:
548 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
549 ; SI-NEXT:    s_mov_b32 s3, 0xf000
550 ; SI-NEXT:    s_mov_b32 s2, -1
551 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
552 ; SI-NEXT:    s_mov_b32 s0, s4
553 ; SI-NEXT:    s_mov_b32 s1, s5
554 ; SI-NEXT:    s_mov_b32 s4, s6
555 ; SI-NEXT:    s_mov_b32 s5, s7
556 ; SI-NEXT:    s_mov_b32 s6, s2
557 ; SI-NEXT:    s_mov_b32 s7, s3
558 ; SI-NEXT:    buffer_load_dword v0, off, s[4:7], 0
559 ; SI-NEXT:    s_waitcnt vmcnt(0)
560 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
561 ; SI-NEXT:    s_endpgm
563 ; VI-LABEL: test_copy_v4i8_volatile_load:
564 ; VI:       ; %bb.0:
565 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
566 ; VI-NEXT:    s_mov_b32 s3, 0xf000
567 ; VI-NEXT:    s_mov_b32 s2, -1
568 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
569 ; VI-NEXT:    s_mov_b32 s0, s4
570 ; VI-NEXT:    s_mov_b32 s1, s5
571 ; VI-NEXT:    s_mov_b32 s4, s6
572 ; VI-NEXT:    s_mov_b32 s5, s7
573 ; VI-NEXT:    s_mov_b32 s6, s2
574 ; VI-NEXT:    s_mov_b32 s7, s3
575 ; VI-NEXT:    buffer_load_dword v0, off, s[4:7], 0
576 ; VI-NEXT:    s_waitcnt vmcnt(0)
577 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
578 ; VI-NEXT:    s_endpgm
579   %val = load volatile <4 x i8>, <4 x i8> addrspace(1)* %in, align 4
580   store <4 x i8> %val, <4 x i8> addrspace(1)* %out, align 4
581   ret void
584 define amdgpu_kernel void @test_copy_v4i8_volatile_store(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(1)* %in) nounwind {
585 ; SI-LABEL: test_copy_v4i8_volatile_store:
586 ; SI:       ; %bb.0:
587 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
588 ; SI-NEXT:    s_mov_b32 s3, 0xf000
589 ; SI-NEXT:    s_mov_b32 s2, -1
590 ; SI-NEXT:    s_mov_b32 s10, s2
591 ; SI-NEXT:    s_mov_b32 s11, s3
592 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
593 ; SI-NEXT:    s_mov_b32 s8, s6
594 ; SI-NEXT:    s_mov_b32 s9, s7
595 ; SI-NEXT:    buffer_load_ubyte v0, off, s[8:11], 0
596 ; SI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:1
597 ; SI-NEXT:    buffer_load_ubyte v2, off, s[8:11], 0 offset:2
598 ; SI-NEXT:    buffer_load_ubyte v3, off, s[8:11], 0 offset:3
599 ; SI-NEXT:    s_mov_b32 s0, s4
600 ; SI-NEXT:    s_mov_b32 s1, s5
601 ; SI-NEXT:    s_waitcnt vmcnt(0)
602 ; SI-NEXT:    buffer_store_byte v3, off, s[0:3], 0 offset:3
603 ; SI-NEXT:    buffer_store_byte v2, off, s[0:3], 0 offset:2
604 ; SI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:1
605 ; SI-NEXT:    buffer_store_byte v0, off, s[0:3], 0
606 ; SI-NEXT:    s_endpgm
608 ; VI-LABEL: test_copy_v4i8_volatile_store:
609 ; VI:       ; %bb.0:
610 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
611 ; VI-NEXT:    s_mov_b32 s3, 0xf000
612 ; VI-NEXT:    s_mov_b32 s2, -1
613 ; VI-NEXT:    s_mov_b32 s10, s2
614 ; VI-NEXT:    s_mov_b32 s11, s3
615 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
616 ; VI-NEXT:    s_mov_b32 s8, s6
617 ; VI-NEXT:    s_mov_b32 s9, s7
618 ; VI-NEXT:    buffer_load_ubyte v0, off, s[8:11], 0
619 ; VI-NEXT:    buffer_load_ubyte v1, off, s[8:11], 0 offset:1
620 ; VI-NEXT:    buffer_load_ubyte v2, off, s[8:11], 0 offset:2
621 ; VI-NEXT:    buffer_load_ubyte v3, off, s[8:11], 0 offset:3
622 ; VI-NEXT:    s_mov_b32 s0, s4
623 ; VI-NEXT:    s_mov_b32 s1, s5
624 ; VI-NEXT:    s_waitcnt vmcnt(0)
625 ; VI-NEXT:    buffer_store_byte v3, off, s[0:3], 0 offset:3
626 ; VI-NEXT:    buffer_store_byte v2, off, s[0:3], 0 offset:2
627 ; VI-NEXT:    buffer_store_byte v1, off, s[0:3], 0 offset:1
628 ; VI-NEXT:    buffer_store_byte v0, off, s[0:3], 0
629 ; VI-NEXT:    s_endpgm
630   %val = load <4 x i8>, <4 x i8> addrspace(1)* %in, align 4
631   store volatile <4 x i8> %val, <4 x i8> addrspace(1)* %out, align 4
632   ret void