1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SICIVI -check-prefix=SI %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SICIVI -check-prefix=VI %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GFX9 %s
5 declare i32 @llvm.amdgcn.workitem.id.x() #0
7 ; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i32:
8 ; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
9 define amdgpu_kernel void @v_test_smed3_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 {
10 %tid = call i32 @llvm.amdgcn.workitem.id.x()
11 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
12 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
13 %a = load i32, i32 addrspace(1)* %gep0
15 %icmp0 = icmp sgt i32 %a, 12
16 %i0 = select i1 %icmp0, i32 %a, i32 12
18 %icmp1 = icmp slt i32 %i0, 17
19 %i1 = select i1 %icmp1, i32 %i0, i32 17
21 store i32 %i1, i32 addrspace(1)* %outgep
25 ; GCN-LABEL: {{^}}v_test_smed3_multi_use_r_i_i_i32:
28 define amdgpu_kernel void @v_test_smed3_multi_use_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 {
29 %tid = call i32 @llvm.amdgcn.workitem.id.x()
30 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
31 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
32 %a = load i32, i32 addrspace(1)* %gep0
34 %icmp0 = icmp sgt i32 %a, 12
35 %i0 = select i1 %icmp0, i32 %a, i32 12
37 %icmp1 = icmp slt i32 %i0, 17
38 %i1 = select i1 %icmp1, i32 %i0, i32 17
40 store volatile i32 %i0, i32 addrspace(1)* %outgep
41 store volatile i32 %i1, i32 addrspace(1)* %outgep
45 ; GCN-LABEL: {{^}}v_test_smed3_r_i_i_sign_mismatch_i32:
46 ; GCN: v_max_u32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}}
47 ; GCN: v_min_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}}
48 define amdgpu_kernel void @v_test_smed3_r_i_i_sign_mismatch_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 {
49 %tid = call i32 @llvm.amdgcn.workitem.id.x()
50 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
51 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
52 %a = load i32, i32 addrspace(1)* %gep0
54 %icmp0 = icmp ugt i32 %a, 12
55 %i0 = select i1 %icmp0, i32 %a, i32 12
57 %icmp1 = icmp slt i32 %i0, 17
58 %i1 = select i1 %icmp1, i32 %i0, i32 17
60 store i32 %i1, i32 addrspace(1)* %outgep
64 ; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i64:
67 define amdgpu_kernel void @v_test_smed3_r_i_i_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) #1 {
68 %tid = call i32 @llvm.amdgcn.workitem.id.x()
69 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
70 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
71 %a = load i64, i64 addrspace(1)* %gep0
73 %icmp0 = icmp sgt i64 %a, 12
74 %i0 = select i1 %icmp0, i64 %a, i64 12
76 %icmp1 = icmp slt i64 %i0, 17
77 %i1 = select i1 %icmp1, i64 %i0, i64 17
79 store i64 %i1, i64 addrspace(1)* %outgep
83 ; Regression test for performIntMed3ImmCombine extending arguments to 32 bit
84 ; which failed for 64 bit arguments. Previously asserted / crashed.
85 ; GCN-LABEL: {{^}}test_intMed3ImmCombine_no_32bit_extend:
88 define i64 @test_intMed3ImmCombine_no_32bit_extend(i64 %x) {
89 %smax = call i64 @llvm.smax.i64(i64 %x, i64 -2)
90 %smin = call i64 @llvm.smin.i64(i64 %smax, i64 2)
93 declare i64 @llvm.smax.i64(i64, i64)
94 declare i64 @llvm.smin.i64(i64, i64)
96 ; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i16:
97 ; SICIVI: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
98 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
99 define amdgpu_kernel void @v_test_smed3_r_i_i_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr) #1 {
100 %tid = call i32 @llvm.amdgcn.workitem.id.x()
101 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
102 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
103 %a = load i16, i16 addrspace(1)* %gep0
105 %icmp0 = icmp sgt i16 %a, 12
106 %i0 = select i1 %icmp0, i16 %a, i16 12
108 %icmp1 = icmp slt i16 %i0, 17
109 %i1 = select i1 %icmp1, i16 %i0, i16 17
111 store i16 %i1, i16 addrspace(1)* %outgep
116 define internal i32 @smin(i32 %x, i32 %y) #2 {
117 %cmp = icmp slt i32 %x, %y
118 %sel = select i1 %cmp, i32 %x, i32 %y
122 define internal i32 @smax(i32 %x, i32 %y) #2 {
123 %cmp = icmp sgt i32 %x, %y
124 %sel = select i1 %cmp, i32 %x, i32 %y
128 define internal i16 @smin16(i16 %x, i16 %y) #2 {
129 %cmp = icmp slt i16 %x, %y
130 %sel = select i1 %cmp, i16 %x, i16 %y
134 define internal i16 @smax16(i16 %x, i16 %y) #2 {
135 %cmp = icmp sgt i16 %x, %y
136 %sel = select i1 %cmp, i16 %x, i16 %y
140 define internal i8 @smin8(i8 %x, i8 %y) #2 {
141 %cmp = icmp slt i8 %x, %y
142 %sel = select i1 %cmp, i8 %x, i8 %y
146 define internal i8 @smax8(i8 %x, i8 %y) #2 {
147 %cmp = icmp sgt i8 %x, %y
148 %sel = select i1 %cmp, i8 %x, i8 %y
154 ; 0: max(min(x, y), min(max(x, y), z))
155 ; 1: max(min(x, y), min(max(y, x), z))
156 ; 2: max(min(x, y), min(z, max(x, y)))
157 ; 3: max(min(x, y), min(z, max(y, x)))
158 ; 4: max(min(y, x), min(max(x, y), z))
159 ; 5: max(min(y, x), min(max(y, x), z))
160 ; 6: max(min(y, x), min(z, max(x, y)))
161 ; 7: max(min(y, x), min(z, max(y, x)))
163 ; + commute outermost max
166 ; FIXME: In these cases we probably should have used scalar operations
169 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0:
170 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
171 define amdgpu_kernel void @s_test_smed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
173 %tmp0 = call i32 @smin(i32 %x, i32 %y)
174 %tmp1 = call i32 @smax(i32 %x, i32 %y)
175 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
176 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
177 store i32 %tmp3, i32 addrspace(1)* %arg
181 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_1:
182 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
183 define amdgpu_kernel void @s_test_smed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
185 %tmp0 = call i32 @smin(i32 %x, i32 %y)
186 %tmp1 = call i32 @smax(i32 %y, i32 %x)
187 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
188 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
189 store i32 %tmp3, i32 addrspace(1)* %arg
193 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_2:
194 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
195 define amdgpu_kernel void @s_test_smed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
197 %tmp0 = call i32 @smin(i32 %x, i32 %y)
198 %tmp1 = call i32 @smax(i32 %x, i32 %y)
199 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
200 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
201 store i32 %tmp3, i32 addrspace(1)* %arg
205 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_3:
206 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
207 define amdgpu_kernel void @s_test_smed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
209 %tmp0 = call i32 @smin(i32 %x, i32 %y)
210 %tmp1 = call i32 @smax(i32 %y, i32 %x)
211 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
212 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
213 store i32 %tmp3, i32 addrspace(1)* %arg
217 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_4:
218 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
219 define amdgpu_kernel void @s_test_smed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
221 %tmp0 = call i32 @smin(i32 %y, i32 %x)
222 %tmp1 = call i32 @smax(i32 %x, i32 %y)
223 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
224 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
225 store i32 %tmp3, i32 addrspace(1)* %arg
229 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_5:
230 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
231 define amdgpu_kernel void @s_test_smed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
233 %tmp0 = call i32 @smin(i32 %y, i32 %x)
234 %tmp1 = call i32 @smax(i32 %y, i32 %x)
235 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
236 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
237 store i32 %tmp3, i32 addrspace(1)* %arg
241 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_6:
242 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
243 define amdgpu_kernel void @s_test_smed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
245 %tmp0 = call i32 @smin(i32 %y, i32 %x)
246 %tmp1 = call i32 @smax(i32 %x, i32 %y)
247 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
248 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
249 store i32 %tmp3, i32 addrspace(1)* %arg
253 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_7:
254 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
255 define amdgpu_kernel void @s_test_smed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
257 %tmp0 = call i32 @smin(i32 %y, i32 %x)
258 %tmp1 = call i32 @smax(i32 %y, i32 %x)
259 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
260 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
261 store i32 %tmp3, i32 addrspace(1)* %arg
265 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_8:
266 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
267 define amdgpu_kernel void @s_test_smed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
269 %tmp0 = call i32 @smin(i32 %x, i32 %y)
270 %tmp1 = call i32 @smax(i32 %x, i32 %y)
271 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
272 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
273 store i32 %tmp3, i32 addrspace(1)* %arg
277 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_9:
278 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
279 define amdgpu_kernel void @s_test_smed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
281 %tmp0 = call i32 @smin(i32 %x, i32 %y)
282 %tmp1 = call i32 @smax(i32 %y, i32 %x)
283 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
284 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
285 store i32 %tmp3, i32 addrspace(1)* %arg
289 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_10:
290 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
291 define amdgpu_kernel void @s_test_smed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
293 %tmp0 = call i32 @smin(i32 %x, i32 %y)
294 %tmp1 = call i32 @smax(i32 %x, i32 %y)
295 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
296 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
297 store i32 %tmp3, i32 addrspace(1)* %arg
301 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_11:
302 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
303 define amdgpu_kernel void @s_test_smed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
305 %tmp0 = call i32 @smin(i32 %x, i32 %y)
306 %tmp1 = call i32 @smax(i32 %y, i32 %x)
307 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
308 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
309 store i32 %tmp3, i32 addrspace(1)* %arg
313 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_12:
314 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
315 define amdgpu_kernel void @s_test_smed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
317 %tmp0 = call i32 @smin(i32 %y, i32 %x)
318 %tmp1 = call i32 @smax(i32 %x, i32 %y)
319 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
320 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
321 store i32 %tmp3, i32 addrspace(1)* %arg
325 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_13:
326 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
327 define amdgpu_kernel void @s_test_smed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
329 %tmp0 = call i32 @smin(i32 %y, i32 %x)
330 %tmp1 = call i32 @smax(i32 %y, i32 %x)
331 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
332 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
333 store i32 %tmp3, i32 addrspace(1)* %arg
337 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_14:
338 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
339 define amdgpu_kernel void @s_test_smed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
341 %tmp0 = call i32 @smin(i32 %y, i32 %x)
342 %tmp1 = call i32 @smax(i32 %x, i32 %y)
343 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
344 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
345 store i32 %tmp3, i32 addrspace(1)* %arg
349 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_15:
350 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
351 define amdgpu_kernel void @s_test_smed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
353 %tmp0 = call i32 @smin(i32 %y, i32 %x)
354 %tmp1 = call i32 @smax(i32 %y, i32 %x)
355 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
356 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
357 store i32 %tmp3, i32 addrspace(1)* %arg
363 ; 16: min(max(x, y), max(min(x, y), z))
364 ; 17: min(max(x, y), max(min(y, x), z))
365 ; 18: min(max(x, y), max(z, min(x, y)))
366 ; 19: min(max(x, y), max(z, min(y, x)))
367 ; 20: min(max(y, x), max(min(x, y), z))
368 ; 21: min(max(y, x), max(min(y, x), z))
369 ; 22: min(max(y, x), max(z, min(x, y)))
370 ; 23: min(max(y, x), max(z, min(y, x)))
372 ; + commute outermost min
374 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_16:
375 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
376 define amdgpu_kernel void @s_test_smed3_i32_pat_16(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
378 %tmp0 = call i32 @smin(i32 %x, i32 %y)
379 %tmp1 = call i32 @smax(i32 %x, i32 %y)
380 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
381 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
382 store i32 %tmp3, i32 addrspace(1)* %arg
386 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_17:
387 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
388 define amdgpu_kernel void @s_test_smed3_i32_pat_17(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
390 %tmp0 = call i32 @smin(i32 %y, i32 %x)
391 %tmp1 = call i32 @smax(i32 %x, i32 %y)
392 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
393 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
394 store i32 %tmp3, i32 addrspace(1)* %arg
398 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_18:
399 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
400 define amdgpu_kernel void @s_test_smed3_i32_pat_18(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
402 %tmp0 = call i32 @smin(i32 %x, i32 %y)
403 %tmp1 = call i32 @smax(i32 %x, i32 %y)
404 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
405 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
406 store i32 %tmp3, i32 addrspace(1)* %arg
410 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_19:
411 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
412 define amdgpu_kernel void @s_test_smed3_i32_pat_19(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
414 %tmp0 = call i32 @smin(i32 %y, i32 %x)
415 %tmp1 = call i32 @smax(i32 %x, i32 %y)
416 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
417 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
418 store i32 %tmp3, i32 addrspace(1)* %arg
422 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_20:
423 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
424 define amdgpu_kernel void @s_test_smed3_i32_pat_20(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
426 %tmp0 = call i32 @smin(i32 %x, i32 %y)
427 %tmp1 = call i32 @smax(i32 %y, i32 %x)
428 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
429 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
430 store i32 %tmp3, i32 addrspace(1)* %arg
434 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_21:
435 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
436 define amdgpu_kernel void @s_test_smed3_i32_pat_21(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
438 %tmp0 = call i32 @smin(i32 %y, i32 %x)
439 %tmp1 = call i32 @smax(i32 %y, i32 %x)
440 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
441 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
442 store i32 %tmp3, i32 addrspace(1)* %arg
446 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_22:
447 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
448 define amdgpu_kernel void @s_test_smed3_i32_pat_22(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
450 %tmp0 = call i32 @smin(i32 %x, i32 %y)
451 %tmp1 = call i32 @smax(i32 %y, i32 %x)
452 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
453 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
454 store i32 %tmp3, i32 addrspace(1)* %arg
458 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_23:
459 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
460 define amdgpu_kernel void @s_test_smed3_i32_pat_23(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
462 %tmp0 = call i32 @smin(i32 %y, i32 %x)
463 %tmp1 = call i32 @smax(i32 %y, i32 %x)
464 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
465 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
466 store i32 %tmp3, i32 addrspace(1)* %arg
470 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_24:
471 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
472 define amdgpu_kernel void @s_test_smed3_i32_pat_24(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
474 %tmp0 = call i32 @smin(i32 %x, i32 %y)
475 %tmp1 = call i32 @smax(i32 %x, i32 %y)
476 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
477 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
478 store i32 %tmp3, i32 addrspace(1)* %arg
482 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_25:
483 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
484 define amdgpu_kernel void @s_test_smed3_i32_pat_25(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
486 %tmp0 = call i32 @smin(i32 %y, i32 %x)
487 %tmp1 = call i32 @smax(i32 %x, i32 %y)
488 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
489 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
490 store i32 %tmp3, i32 addrspace(1)* %arg
494 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_26:
495 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
496 define amdgpu_kernel void @s_test_smed3_i32_pat_26(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
498 %tmp0 = call i32 @smin(i32 %x, i32 %y)
499 %tmp1 = call i32 @smax(i32 %x, i32 %y)
500 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
501 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
502 store i32 %tmp3, i32 addrspace(1)* %arg
506 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_27:
507 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
508 define amdgpu_kernel void @s_test_smed3_i32_pat_27(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
510 %tmp0 = call i32 @smin(i32 %y, i32 %x)
511 %tmp1 = call i32 @smax(i32 %x, i32 %y)
512 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
513 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
514 store i32 %tmp3, i32 addrspace(1)* %arg
518 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_28:
519 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
520 define amdgpu_kernel void @s_test_smed3_i32_pat_28(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
522 %tmp0 = call i32 @smin(i32 %x, i32 %y)
523 %tmp1 = call i32 @smax(i32 %y, i32 %x)
524 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
525 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
526 store i32 %tmp3, i32 addrspace(1)* %arg
530 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_29:
531 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
532 define amdgpu_kernel void @s_test_smed3_i32_pat_29(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
534 %tmp0 = call i32 @smin(i32 %y, i32 %x)
535 %tmp1 = call i32 @smax(i32 %y, i32 %x)
536 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
537 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
538 store i32 %tmp3, i32 addrspace(1)* %arg
542 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_30:
543 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
544 define amdgpu_kernel void @s_test_smed3_i32_pat_30(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
546 %tmp0 = call i32 @smin(i32 %x, i32 %y)
547 %tmp1 = call i32 @smax(i32 %y, i32 %x)
548 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
549 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
550 store i32 %tmp3, i32 addrspace(1)* %arg
554 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_31:
555 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
556 define amdgpu_kernel void @s_test_smed3_i32_pat_31(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
558 %tmp0 = call i32 @smin(i32 %y, i32 %x)
559 %tmp1 = call i32 @smax(i32 %y, i32 %x)
560 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
561 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
562 store i32 %tmp3, i32 addrspace(1)* %arg
566 ; FIXME: Should keep scalar or not promote
567 ; GCN-LABEL: {{^}}s_test_smed3_i16_pat_0:
568 ; GCN: s_sext_i32_i16
569 ; GCN: s_sext_i32_i16
570 ; GCN: s_sext_i32_i16
571 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
572 define amdgpu_kernel void @s_test_smed3_i16_pat_0(i16 addrspace(1)* %arg, [8 x i32], i16 %x, [8 x i32], i16 %y, [8 x i32], i16 %z) #1 {
574 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
575 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
576 %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z)
577 %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2)
578 store i16 %tmp3, i16 addrspace(1)* %arg
582 ; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0:
586 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
587 define amdgpu_kernel void @s_test_smed3_i8_pat_0(i8 addrspace(1)* %arg, [8 x i32], i8 %x, [8 x i32], i8 %y, [8 x i32], i8 %z) #1 {
589 %tmp0 = call i8 @smin8(i8 %x, i8 %y)
590 %tmp1 = call i8 @smax8(i8 %x, i8 %y)
591 %tmp2 = call i8 @smin8(i8 %tmp1, i8 %z)
592 %tmp3 = call i8 @smax8(i8 %tmp0, i8 %tmp2)
593 store i8 %tmp3, i8 addrspace(1)* %arg
597 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_0:
598 ; GCN-NOT: v_med3_i32
599 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
601 %tmp0 = call i32 @smin(i32 %x, i32 %y)
602 %tmp1 = call i32 @smax(i32 %x, i32 %y)
603 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
604 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
605 store volatile i32 %tmp0, i32 addrspace(1)* %arg
606 store volatile i32 %tmp3, i32 addrspace(1)* %arg
610 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_1:
611 ; GCN-NOT: v_med3_i32
612 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
614 %tmp0 = call i32 @smin(i32 %x, i32 %y)
615 %tmp1 = call i32 @smax(i32 %x, i32 %y)
616 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
617 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
618 store volatile i32 %tmp1, i32 addrspace(1)* %arg
619 store volatile i32 %tmp3, i32 addrspace(1)* %arg
623 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_2:
624 ; GCN-NOT: v_med3_i32
625 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
627 %tmp0 = call i32 @smin(i32 %x, i32 %y)
628 %tmp1 = call i32 @smax(i32 %x, i32 %y)
629 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
630 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
631 store volatile i32 %tmp2, i32 addrspace(1)* %arg
632 store volatile i32 %tmp3, i32 addrspace(1)* %arg
636 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_result:
637 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
638 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
640 %tmp0 = call i32 @smin(i32 %x, i32 %y)
641 %tmp1 = call i32 @smax(i32 %x, i32 %y)
642 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
643 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
644 store volatile i32 %tmp3, i32 addrspace(1)* %arg
645 store volatile i32 %tmp3, i32 addrspace(1)* %arg
649 ; GCN-LABEL: {{^}}v_test_smed3_i16_pat_0:
650 ; SI: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
652 ; FIXME: VI not matching med3
658 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
659 define amdgpu_kernel void @v_test_smed3_i16_pat_0(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
661 %tid = call i32 @llvm.amdgcn.workitem.id.x()
662 %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
663 %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
664 %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
665 %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
666 %x = load i16, i16 addrspace(1)* %gep0
667 %y = load i16, i16 addrspace(1)* %gep1
668 %z = load i16, i16 addrspace(1)* %gep2
670 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
671 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
672 %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z)
673 %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2)
674 store i16 %tmp3, i16 addrspace(1)* %out.gep
678 ; GCN-LABEL: {{^}}v_test_smed3_i16_pat_1:
679 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
681 define amdgpu_kernel void @v_test_smed3_i16_pat_1(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
683 %tid = call i32 @llvm.amdgcn.workitem.id.x()
684 %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
685 %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
686 %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
687 %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
688 %x = load i16, i16 addrspace(1)* %gep0
689 %y = load i16, i16 addrspace(1)* %gep1
690 %z = load i16, i16 addrspace(1)* %gep2
692 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
693 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
694 %tmp2 = call i16 @smax16(i16 %tmp0, i16 %z)
695 %tmp3 = call i16 @smin16(i16 %tmp1, i16 %tmp2)
696 store i16 %tmp3, i16 addrspace(1)* %out.gep
700 attributes #0 = { nounwind readnone }
701 attributes #1 = { nounwind }
702 attributes #2 = { nounwind readnone alwaysinline }