1 ; RUN: llc -mtriple=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2 ; RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3 ; RUN: llc -mtriple=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(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #1 {
10 %tid = call i32 @llvm.amdgcn.workitem.id.x()
11 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid
12 %outgep = getelementptr i32, ptr addrspace(1) %out, i32 %tid
13 %a = load i32, ptr 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, ptr 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(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #1 {
29 %tid = call i32 @llvm.amdgcn.workitem.id.x()
30 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid
31 %outgep = getelementptr i32, ptr addrspace(1) %out, i32 %tid
32 %a = load i32, ptr 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, ptr addrspace(1) %outgep
41 store volatile i32 %i1, ptr 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(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #1 {
49 %tid = call i32 @llvm.amdgcn.workitem.id.x()
50 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid
51 %outgep = getelementptr i32, ptr addrspace(1) %out, i32 %tid
52 %a = load i32, ptr 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, ptr 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(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #1 {
68 %tid = call i32 @llvm.amdgcn.workitem.id.x()
69 %gep0 = getelementptr i64, ptr addrspace(1) %aptr, i32 %tid
70 %outgep = getelementptr i64, ptr addrspace(1) %out, i32 %tid
71 %a = load i64, ptr 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, ptr 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 ; SI: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
98 ; VI: v_max_i16_e32 [[MAX:v[0-9]]], 12, {{v[0-9]}}
99 ; VI: v_min_i16_e32 {{v[0-9]}}, 17, [[MAX]]
100 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
101 define amdgpu_kernel void @v_test_smed3_r_i_i_i16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #1 {
102 %tid = call i32 @llvm.amdgcn.workitem.id.x()
103 %gep0 = getelementptr i16, ptr addrspace(1) %aptr, i32 %tid
104 %outgep = getelementptr i16, ptr addrspace(1) %out, i32 %tid
105 %a = load i16, ptr addrspace(1) %gep0
107 %icmp0 = icmp sgt i16 %a, 12
108 %i0 = select i1 %icmp0, i16 %a, i16 12
110 %icmp1 = icmp slt i16 %i0, 17
111 %i1 = select i1 %icmp1, i16 %i0, i16 17
113 store i16 %i1, ptr addrspace(1) %outgep
118 define internal i32 @smin(i32 %x, i32 %y) #2 {
119 %cmp = icmp slt i32 %x, %y
120 %sel = select i1 %cmp, i32 %x, i32 %y
124 define internal i32 @smax(i32 %x, i32 %y) #2 {
125 %cmp = icmp sgt i32 %x, %y
126 %sel = select i1 %cmp, i32 %x, i32 %y
130 define internal i16 @smin16(i16 %x, i16 %y) #2 {
131 %cmp = icmp slt i16 %x, %y
132 %sel = select i1 %cmp, i16 %x, i16 %y
136 define internal i16 @smax16(i16 %x, i16 %y) #2 {
137 %cmp = icmp sgt i16 %x, %y
138 %sel = select i1 %cmp, i16 %x, i16 %y
142 define internal i8 @smin8(i8 %x, i8 %y) #2 {
143 %cmp = icmp slt i8 %x, %y
144 %sel = select i1 %cmp, i8 %x, i8 %y
148 define internal i8 @smax8(i8 %x, i8 %y) #2 {
149 %cmp = icmp sgt i8 %x, %y
150 %sel = select i1 %cmp, i8 %x, i8 %y
156 ; 0: max(min(x, y), min(max(x, y), z))
157 ; 1: max(min(x, y), min(max(y, x), z))
158 ; 2: max(min(x, y), min(z, max(x, y)))
159 ; 3: max(min(x, y), min(z, max(y, x)))
160 ; 4: max(min(y, x), min(max(x, y), z))
161 ; 5: max(min(y, x), min(max(y, x), z))
162 ; 6: max(min(y, x), min(z, max(x, y)))
163 ; 7: max(min(y, x), min(z, max(y, x)))
165 ; + commute outermost max
168 ; FIXME: In these cases we probably should have used scalar operations
171 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0:
172 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
173 define amdgpu_kernel void @s_test_smed3_i32_pat_0(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
175 %tmp0 = call i32 @smin(i32 %x, i32 %y)
176 %tmp1 = call i32 @smax(i32 %x, i32 %y)
177 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
178 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
179 store i32 %tmp3, ptr addrspace(1) %arg
183 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_1:
184 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
185 define amdgpu_kernel void @s_test_smed3_i32_pat_1(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
187 %tmp0 = call i32 @smin(i32 %x, i32 %y)
188 %tmp1 = call i32 @smax(i32 %y, i32 %x)
189 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
190 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
191 store i32 %tmp3, ptr addrspace(1) %arg
195 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_2:
196 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
197 define amdgpu_kernel void @s_test_smed3_i32_pat_2(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
199 %tmp0 = call i32 @smin(i32 %x, i32 %y)
200 %tmp1 = call i32 @smax(i32 %x, i32 %y)
201 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
202 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
203 store i32 %tmp3, ptr addrspace(1) %arg
207 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_3:
208 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
209 define amdgpu_kernel void @s_test_smed3_i32_pat_3(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
211 %tmp0 = call i32 @smin(i32 %x, i32 %y)
212 %tmp1 = call i32 @smax(i32 %y, i32 %x)
213 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
214 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
215 store i32 %tmp3, ptr addrspace(1) %arg
219 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_4:
220 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
221 define amdgpu_kernel void @s_test_smed3_i32_pat_4(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
223 %tmp0 = call i32 @smin(i32 %y, i32 %x)
224 %tmp1 = call i32 @smax(i32 %x, i32 %y)
225 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
226 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
227 store i32 %tmp3, ptr addrspace(1) %arg
231 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_5:
232 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
233 define amdgpu_kernel void @s_test_smed3_i32_pat_5(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
235 %tmp0 = call i32 @smin(i32 %y, i32 %x)
236 %tmp1 = call i32 @smax(i32 %y, i32 %x)
237 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
238 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
239 store i32 %tmp3, ptr addrspace(1) %arg
243 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_6:
244 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
245 define amdgpu_kernel void @s_test_smed3_i32_pat_6(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
247 %tmp0 = call i32 @smin(i32 %y, i32 %x)
248 %tmp1 = call i32 @smax(i32 %x, i32 %y)
249 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
250 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
251 store i32 %tmp3, ptr addrspace(1) %arg
255 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_7:
256 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
257 define amdgpu_kernel void @s_test_smed3_i32_pat_7(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
259 %tmp0 = call i32 @smin(i32 %y, i32 %x)
260 %tmp1 = call i32 @smax(i32 %y, i32 %x)
261 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
262 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
263 store i32 %tmp3, ptr addrspace(1) %arg
267 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_8:
268 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
269 define amdgpu_kernel void @s_test_smed3_i32_pat_8(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
271 %tmp0 = call i32 @smin(i32 %x, i32 %y)
272 %tmp1 = call i32 @smax(i32 %x, i32 %y)
273 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
274 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
275 store i32 %tmp3, ptr addrspace(1) %arg
279 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_9:
280 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
281 define amdgpu_kernel void @s_test_smed3_i32_pat_9(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
283 %tmp0 = call i32 @smin(i32 %x, i32 %y)
284 %tmp1 = call i32 @smax(i32 %y, i32 %x)
285 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
286 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
287 store i32 %tmp3, ptr addrspace(1) %arg
291 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_10:
292 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
293 define amdgpu_kernel void @s_test_smed3_i32_pat_10(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
295 %tmp0 = call i32 @smin(i32 %x, i32 %y)
296 %tmp1 = call i32 @smax(i32 %x, i32 %y)
297 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
298 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
299 store i32 %tmp3, ptr addrspace(1) %arg
303 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_11:
304 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
305 define amdgpu_kernel void @s_test_smed3_i32_pat_11(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
307 %tmp0 = call i32 @smin(i32 %x, i32 %y)
308 %tmp1 = call i32 @smax(i32 %y, i32 %x)
309 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
310 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
311 store i32 %tmp3, ptr addrspace(1) %arg
315 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_12:
316 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
317 define amdgpu_kernel void @s_test_smed3_i32_pat_12(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
319 %tmp0 = call i32 @smin(i32 %y, i32 %x)
320 %tmp1 = call i32 @smax(i32 %x, i32 %y)
321 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
322 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
323 store i32 %tmp3, ptr addrspace(1) %arg
327 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_13:
328 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
329 define amdgpu_kernel void @s_test_smed3_i32_pat_13(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
331 %tmp0 = call i32 @smin(i32 %y, i32 %x)
332 %tmp1 = call i32 @smax(i32 %y, i32 %x)
333 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
334 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
335 store i32 %tmp3, ptr addrspace(1) %arg
339 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_14:
340 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
341 define amdgpu_kernel void @s_test_smed3_i32_pat_14(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
343 %tmp0 = call i32 @smin(i32 %y, i32 %x)
344 %tmp1 = call i32 @smax(i32 %x, i32 %y)
345 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
346 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
347 store i32 %tmp3, ptr addrspace(1) %arg
351 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_15:
352 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
353 define amdgpu_kernel void @s_test_smed3_i32_pat_15(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
355 %tmp0 = call i32 @smin(i32 %y, i32 %x)
356 %tmp1 = call i32 @smax(i32 %y, i32 %x)
357 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1)
358 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0)
359 store i32 %tmp3, ptr addrspace(1) %arg
365 ; 16: min(max(x, y), max(min(x, y), z))
366 ; 17: min(max(x, y), max(min(y, x), z))
367 ; 18: min(max(x, y), max(z, min(x, y)))
368 ; 19: min(max(x, y), max(z, min(y, x)))
369 ; 20: min(max(y, x), max(min(x, y), z))
370 ; 21: min(max(y, x), max(min(y, x), z))
371 ; 22: min(max(y, x), max(z, min(x, y)))
372 ; 23: min(max(y, x), max(z, min(y, x)))
374 ; + commute outermost min
376 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_16:
377 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
378 define amdgpu_kernel void @s_test_smed3_i32_pat_16(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
380 %tmp0 = call i32 @smin(i32 %x, i32 %y)
381 %tmp1 = call i32 @smax(i32 %x, i32 %y)
382 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
383 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
384 store i32 %tmp3, ptr addrspace(1) %arg
388 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_17:
389 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
390 define amdgpu_kernel void @s_test_smed3_i32_pat_17(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
392 %tmp0 = call i32 @smin(i32 %y, i32 %x)
393 %tmp1 = call i32 @smax(i32 %x, i32 %y)
394 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
395 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
396 store i32 %tmp3, ptr addrspace(1) %arg
400 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_18:
401 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
402 define amdgpu_kernel void @s_test_smed3_i32_pat_18(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
404 %tmp0 = call i32 @smin(i32 %x, i32 %y)
405 %tmp1 = call i32 @smax(i32 %x, i32 %y)
406 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
407 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
408 store i32 %tmp3, ptr addrspace(1) %arg
412 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_19:
413 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
414 define amdgpu_kernel void @s_test_smed3_i32_pat_19(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
416 %tmp0 = call i32 @smin(i32 %y, i32 %x)
417 %tmp1 = call i32 @smax(i32 %x, i32 %y)
418 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
419 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
420 store i32 %tmp3, ptr addrspace(1) %arg
424 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_20:
425 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
426 define amdgpu_kernel void @s_test_smed3_i32_pat_20(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
428 %tmp0 = call i32 @smin(i32 %x, i32 %y)
429 %tmp1 = call i32 @smax(i32 %y, i32 %x)
430 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
431 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
432 store i32 %tmp3, ptr addrspace(1) %arg
436 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_21:
437 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
438 define amdgpu_kernel void @s_test_smed3_i32_pat_21(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
440 %tmp0 = call i32 @smin(i32 %y, i32 %x)
441 %tmp1 = call i32 @smax(i32 %y, i32 %x)
442 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
443 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
444 store i32 %tmp3, ptr addrspace(1) %arg
448 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_22:
449 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
450 define amdgpu_kernel void @s_test_smed3_i32_pat_22(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
452 %tmp0 = call i32 @smin(i32 %x, i32 %y)
453 %tmp1 = call i32 @smax(i32 %y, i32 %x)
454 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
455 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
456 store i32 %tmp3, ptr addrspace(1) %arg
460 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_23:
461 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
462 define amdgpu_kernel void @s_test_smed3_i32_pat_23(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
464 %tmp0 = call i32 @smin(i32 %y, i32 %x)
465 %tmp1 = call i32 @smax(i32 %y, i32 %x)
466 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
467 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
468 store i32 %tmp3, ptr addrspace(1) %arg
472 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_24:
473 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
474 define amdgpu_kernel void @s_test_smed3_i32_pat_24(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
476 %tmp0 = call i32 @smin(i32 %x, i32 %y)
477 %tmp1 = call i32 @smax(i32 %x, i32 %y)
478 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
479 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
480 store i32 %tmp3, ptr addrspace(1) %arg
484 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_25:
485 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
486 define amdgpu_kernel void @s_test_smed3_i32_pat_25(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
488 %tmp0 = call i32 @smin(i32 %y, i32 %x)
489 %tmp1 = call i32 @smax(i32 %x, i32 %y)
490 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
491 %tmp3 = call i32 @smin(i32 %tmp1, i32 %tmp2)
492 store i32 %tmp3, ptr addrspace(1) %arg
496 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_26:
497 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
498 define amdgpu_kernel void @s_test_smed3_i32_pat_26(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
500 %tmp0 = call i32 @smin(i32 %x, i32 %y)
501 %tmp1 = call i32 @smax(i32 %x, i32 %y)
502 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
503 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
504 store i32 %tmp3, ptr addrspace(1) %arg
508 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_27:
509 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
510 define amdgpu_kernel void @s_test_smed3_i32_pat_27(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
512 %tmp0 = call i32 @smin(i32 %y, i32 %x)
513 %tmp1 = call i32 @smax(i32 %x, i32 %y)
514 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
515 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
516 store i32 %tmp3, ptr addrspace(1) %arg
520 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_28:
521 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
522 define amdgpu_kernel void @s_test_smed3_i32_pat_28(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
524 %tmp0 = call i32 @smin(i32 %x, i32 %y)
525 %tmp1 = call i32 @smax(i32 %y, i32 %x)
526 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
527 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
528 store i32 %tmp3, ptr addrspace(1) %arg
532 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_29:
533 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
534 define amdgpu_kernel void @s_test_smed3_i32_pat_29(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
536 %tmp0 = call i32 @smin(i32 %y, i32 %x)
537 %tmp1 = call i32 @smax(i32 %y, i32 %x)
538 %tmp2 = call i32 @smax(i32 %tmp0, i32 %z)
539 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
540 store i32 %tmp3, ptr addrspace(1) %arg
544 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_30:
545 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
546 define amdgpu_kernel void @s_test_smed3_i32_pat_30(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
548 %tmp0 = call i32 @smin(i32 %x, i32 %y)
549 %tmp1 = call i32 @smax(i32 %y, i32 %x)
550 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
551 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
552 store i32 %tmp3, ptr addrspace(1) %arg
556 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_31:
557 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
558 define amdgpu_kernel void @s_test_smed3_i32_pat_31(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
560 %tmp0 = call i32 @smin(i32 %y, i32 %x)
561 %tmp1 = call i32 @smax(i32 %y, i32 %x)
562 %tmp2 = call i32 @smax(i32 %z, i32 %tmp0)
563 %tmp3 = call i32 @smin(i32 %tmp2, i32 %tmp1)
564 store i32 %tmp3, ptr addrspace(1) %arg
568 ; FIXME: Should keep scalar or not promote
569 ; GCN-LABEL: {{^}}s_test_smed3_i16_pat_0:
570 ; GCN: s_sext_i32_i16
571 ; GCN: s_sext_i32_i16
572 ; GCN: s_sext_i32_i16
573 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
574 define amdgpu_kernel void @s_test_smed3_i16_pat_0(ptr addrspace(1) %arg, [8 x i32], i16 %x, [8 x i32], i16 %y, [8 x i32], i16 %z) #1 {
576 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
577 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
578 %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z)
579 %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2)
580 store i16 %tmp3, ptr addrspace(1) %arg
584 ; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0:
588 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
589 define amdgpu_kernel void @s_test_smed3_i8_pat_0(ptr addrspace(1) %arg, [8 x i32], i8 %x, [8 x i32], i8 %y, [8 x i32], i8 %z) #1 {
591 %tmp0 = call i8 @smin8(i8 %x, i8 %y)
592 %tmp1 = call i8 @smax8(i8 %x, i8 %y)
593 %tmp2 = call i8 @smin8(i8 %tmp1, i8 %z)
594 %tmp3 = call i8 @smax8(i8 %tmp0, i8 %tmp2)
595 store i8 %tmp3, ptr addrspace(1) %arg
599 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_0:
601 ; GCN-NOT: {{s_min_i32|s_max_i32}}
603 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_0(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
605 %tmp0 = call i32 @smin(i32 %x, i32 %y)
606 %tmp1 = call i32 @smax(i32 %x, i32 %y)
607 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
608 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
609 store volatile i32 %tmp0, ptr addrspace(1) %arg
610 store volatile i32 %tmp3, ptr addrspace(1) %arg
614 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_1:
616 ; GCN-NOT: {{s_min_i32|s_max_i32}}
618 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_1(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
620 %tmp0 = call i32 @smin(i32 %x, i32 %y)
621 %tmp1 = call i32 @smax(i32 %x, i32 %y)
622 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
623 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
624 store volatile i32 %tmp1, ptr addrspace(1) %arg
625 store volatile i32 %tmp3, ptr addrspace(1) %arg
629 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_2:
632 ; GCN-NOT: {{s_min_i32|s_max_i32}}
634 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_2(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
636 %tmp0 = call i32 @smin(i32 %x, i32 %y)
637 %tmp1 = call i32 @smax(i32 %x, i32 %y)
638 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
639 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
640 store volatile i32 %tmp2, ptr addrspace(1) %arg
641 store volatile i32 %tmp3, ptr addrspace(1) %arg
645 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_result:
646 ; GCN-NOT: {{s_min_i32|s_max_i32}}
647 ; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
648 define amdgpu_kernel void @s_test_smed3_i32_pat_0_multi_use_result(ptr addrspace(1) %arg, i32 %x, i32 %y, i32 %z) #1 {
650 %tmp0 = call i32 @smin(i32 %x, i32 %y)
651 %tmp1 = call i32 @smax(i32 %x, i32 %y)
652 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z)
653 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2)
654 store volatile i32 %tmp3, ptr addrspace(1) %arg
655 store volatile i32 %tmp3, ptr addrspace(1) %arg
659 ; GCN-LABEL: {{^}}s_test_smed3_reuse_bounds
660 ; GCN-NOT: {{s_min_i32|s_max_i32}}
661 ; GCN: v_med3_i32 v{{[0-9]+}}, [[B0:s[0-9]+]], [[B1:v[0-9]+]], v{{[0-9]+}}
662 ; GCN: v_med3_i32 v{{[0-9]+}}, [[B0]], [[B1]], v{{[0-9]+}}
663 define amdgpu_kernel void @s_test_smed3_reuse_bounds(ptr addrspace(1) %arg, i32 %b0, i32 %b1, i32 %x, i32 %y) #1 {
665 %lo = call i32 @smin(i32 %b0, i32 %b1)
666 %hi = call i32 @smax(i32 %b0, i32 %b1)
668 %tmp0 = call i32 @smin(i32 %x, i32 %hi)
669 %z0 = call i32 @smax(i32 %tmp0, i32 %lo)
671 %tmp1 = call i32 @smin(i32 %y, i32 %hi)
672 %z1 = call i32 @smax(i32 %tmp1, i32 %lo)
674 store volatile i32 %z0, ptr addrspace(1) %arg
675 store volatile i32 %z1, ptr addrspace(1) %arg
679 ; GCN-LABEL: {{^}}v_test_smed3_i16_pat_0:
680 ; SI: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
682 ; FIXME: VI not matching med3
688 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
689 define amdgpu_kernel void @v_test_smed3_i16_pat_0(ptr addrspace(1) %arg, ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) #1 {
691 %tid = call i32 @llvm.amdgcn.workitem.id.x()
692 %gep0 = getelementptr inbounds i16, ptr addrspace(1) %a.ptr, i32 %tid
693 %gep1 = getelementptr inbounds i16, ptr addrspace(1) %gep0, i32 3
694 %gep2 = getelementptr inbounds i16, ptr addrspace(1) %gep0, i32 8
695 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i32 %tid
696 %x = load i16, ptr addrspace(1) %gep0
697 %y = load i16, ptr addrspace(1) %gep1
698 %z = load i16, ptr addrspace(1) %gep2
700 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
701 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
702 %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z)
703 %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2)
704 store i16 %tmp3, ptr addrspace(1) %out.gep
708 ; GCN-LABEL: {{^}}v_test_smed3_i16_pat_1:
709 ; GFX9: v_med3_i16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
711 define amdgpu_kernel void @v_test_smed3_i16_pat_1(ptr addrspace(1) %arg, ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) #1 {
713 %tid = call i32 @llvm.amdgcn.workitem.id.x()
714 %gep0 = getelementptr inbounds i16, ptr addrspace(1) %a.ptr, i32 %tid
715 %gep1 = getelementptr inbounds i16, ptr addrspace(1) %gep0, i32 3
716 %gep2 = getelementptr inbounds i16, ptr addrspace(1) %gep0, i32 8
717 %out.gep = getelementptr inbounds i16, ptr addrspace(1) %out, i32 %tid
718 %x = load i16, ptr addrspace(1) %gep0
719 %y = load i16, ptr addrspace(1) %gep1
720 %z = load i16, ptr addrspace(1) %gep2
722 %tmp0 = call i16 @smin16(i16 %x, i16 %y)
723 %tmp1 = call i16 @smax16(i16 %x, i16 %y)
724 %tmp2 = call i16 @smax16(i16 %tmp0, i16 %z)
725 %tmp3 = call i16 @smin16(i16 %tmp1, i16 %tmp2)
726 store i16 %tmp3, ptr addrspace(1) %out.gep
730 attributes #0 = { nounwind readnone }
731 attributes #1 = { nounwind }
732 attributes #2 = { nounwind readnone alwaysinline }