[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / smed3.ll
blob494510430ad555116861382267985d89aff60cc9
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
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(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
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(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
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(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
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 ; 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
112   ret void
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
119   ret i32 %sel
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
125   ret i32 %sel
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
131   ret i16 %sel
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
137   ret i16 %sel
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
143   ret i8 %sel
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
149   ret i8 %sel
152 ; 16 combinations
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
167 ; instead.
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
178   ret void
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
190   ret void
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
202   ret void
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
214   ret void
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
226   ret void
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
238   ret void
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
250   ret void
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
262   ret void
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
274   ret void
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
286   ret void
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
298   ret void
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
310   ret void
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
322   ret void
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
334   ret void
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
346   ret void
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
358   ret void
361 ; 16 combinations
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
383   ret void
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
395   ret void
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
407   ret void
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
419   ret void
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
431   ret void
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
443   ret void
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
455   ret void
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
467   ret void
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
479   ret void
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
491   ret void
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
503   ret void
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
515   ret void
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
527   ret void
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
539   ret void
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
551   ret void
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
563   ret void
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
579   ret void
582 ; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0:
583 ; GCN: s_sext_i32_i8
584 ; GCN: s_sext_i32_i8
585 ; GCN: s_sext_i32_i8
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
594   ret void
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
607   ret void
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
620   ret void
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
633   ret void
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
646   ret void
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
653 ; VI: v_min_i16
654 ; VI: v_max_i16
655 ; VI: v_min_i16
656 ; VI: v_max_i16
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
675   ret void
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
697   ret void
700 attributes #0 = { nounwind readnone }
701 attributes #1 = { nounwind }
702 attributes #2 = { nounwind readnone alwaysinline }