Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / smed3.ll
blobe0d0ddce208c4668f97888f952b743566ec12cff
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
22   ret void
25 ; GCN-LABEL: {{^}}v_test_smed3_multi_use_r_i_i_i32:
26 ; GCN: v_max_i32
27 ; GCN: v_min_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
42   ret void
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
61   ret void
64 ; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i64:
65 ; GCN: v_cmp_lt_i64
66 ; GCN: v_cmp_gt_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
80   ret void
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:
86 ; GCN: v_cmp_lt_i64
87 ; GCN: v_cmp_gt_i64
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)
91   ret i64 %smin
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
114   ret void
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
121   ret i32 %sel
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
127   ret i32 %sel
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
133   ret i16 %sel
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
139   ret i16 %sel
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
145   ret i8 %sel
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
151   ret i8 %sel
154 ; 16 combinations
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
169 ; instead.
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
180   ret void
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
192   ret void
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
204   ret void
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
216   ret void
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
228   ret void
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
240   ret void
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
252   ret void
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
264   ret void
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
276   ret void
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
288   ret void
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
300   ret void
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
312   ret void
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
324   ret void
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
336   ret void
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
348   ret void
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
360   ret void
363 ; 16 combinations
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
385   ret void
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
397   ret void
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
409   ret void
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
421   ret void
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
433   ret void
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
445   ret void
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
457   ret void
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
469   ret void
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
481   ret void
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
493   ret void
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
505   ret void
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
517   ret void
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
529   ret void
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
541   ret void
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
553   ret void
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
565   ret void
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
581   ret void
584 ; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0:
585 ; GCN: s_sext_i32_i8
586 ; GCN: s_sext_i32_i8
587 ; GCN: s_sext_i32_i8
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
596   ret void
599 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_0:
600 ; GCN: s_min_i32
601 ; GCN-NOT: {{s_min_i32|s_max_i32}}
602 ; GCN: v_med3_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
611   ret void
614 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_1:
615 ; GCN: s_max_i32
616 ; GCN-NOT: {{s_min_i32|s_max_i32}}
617 ; GCN: v_med3_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
626   ret void
629 ; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_2:
630 ; GCN: s_max_i32
631 ; GCN: s_min_i32
632 ; GCN-NOT: {{s_min_i32|s_max_i32}}
633 ; GCN: v_med3_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
642   ret void
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
656   ret void
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
676   ret void
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
683 ; VI: v_min_i16
684 ; VI: v_max_i16
685 ; VI: v_min_i16
686 ; VI: v_max_i16
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
705   ret void
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
727   ret void
730 attributes #0 = { nounwind readnone }
731 attributes #1 = { nounwind }
732 attributes #2 = { nounwind readnone alwaysinline }