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=gfx901 -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_umed3_r_i_i_i32:
8 ; GCN: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
9 define amdgpu_kernel void @v_test_umed3_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 ugt i32 %a, 12
16 %i0 = select i1 %icmp0, i32 %a, i32 12
18 %icmp1 = icmp ult 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_umed3_multi_use_r_i_i_i32:
28 define amdgpu_kernel void @v_test_umed3_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 ugt i32 %a, 12
35 %i0 = select i1 %icmp0, i32 %a, i32 12
37 %icmp1 = icmp ult 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_umed3_r_i_i_constant_order_i32:
46 ; GCN: v_max_u32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}}
47 ; GCN: v_min_u32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}}
48 define amdgpu_kernel void @v_test_umed3_r_i_i_constant_order_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, 17
55 %i0 = select i1 %icmp0, i32 %a, i32 17
57 %icmp1 = icmp ult i32 %i0, 12
58 %i1 = select i1 %icmp1, i32 %i0, i32 12
60 store i32 %i1, i32 addrspace(1)* %outgep
64 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_sign_mismatch_i32:
65 ; GCN: v_max_i32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}}
66 ; GCN: v_min_u32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}}
67 define amdgpu_kernel void @v_test_umed3_r_i_i_sign_mismatch_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 {
68 %tid = call i32 @llvm.amdgcn.workitem.id.x()
69 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
70 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
71 %a = load i32, i32 addrspace(1)* %gep0
73 %icmp0 = icmp sgt i32 %a, 12
74 %i0 = select i1 %icmp0, i32 %a, i32 12
76 %icmp1 = icmp ult i32 %i0, 17
77 %i1 = select i1 %icmp1, i32 %i0, i32 17
79 store i32 %i1, i32 addrspace(1)* %outgep
83 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i64:
86 define amdgpu_kernel void @v_test_umed3_r_i_i_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) #1 {
87 %tid = call i32 @llvm.amdgcn.workitem.id.x()
88 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
89 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
90 %a = load i64, i64 addrspace(1)* %gep0
92 %icmp0 = icmp ugt i64 %a, 12
93 %i0 = select i1 %icmp0, i64 %a, i64 12
95 %icmp1 = icmp ult i64 %i0, 17
96 %i1 = select i1 %icmp1, i64 %i0, i64 17
98 store i64 %i1, i64 addrspace(1)* %outgep
102 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i16:
103 ; SICIVI: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
104 ; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
105 define amdgpu_kernel void @v_test_umed3_r_i_i_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr) #1 {
106 %tid = call i32 @llvm.amdgcn.workitem.id.x()
107 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
108 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
109 %a = load i16, i16 addrspace(1)* %gep0
111 %icmp0 = icmp ugt i16 %a, 12
112 %i0 = select i1 %icmp0, i16 %a, i16 12
114 %icmp1 = icmp ult i16 %i0, 17
115 %i1 = select i1 %icmp1, i16 %i0, i16 17
117 store i16 %i1, i16 addrspace(1)* %outgep
121 define internal i32 @umin(i32 %x, i32 %y) #2 {
122 %cmp = icmp ult i32 %x, %y
123 %sel = select i1 %cmp, i32 %x, i32 %y
127 define internal i32 @umax(i32 %x, i32 %y) #2 {
128 %cmp = icmp ugt i32 %x, %y
129 %sel = select i1 %cmp, i32 %x, i32 %y
133 define internal i16 @umin16(i16 %x, i16 %y) #2 {
134 %cmp = icmp ult i16 %x, %y
135 %sel = select i1 %cmp, i16 %x, i16 %y
139 define internal i16 @umax16(i16 %x, i16 %y) #2 {
140 %cmp = icmp ugt i16 %x, %y
141 %sel = select i1 %cmp, i16 %x, i16 %y
145 define internal i8 @umin8(i8 %x, i8 %y) #2 {
146 %cmp = icmp ult i8 %x, %y
147 %sel = select i1 %cmp, i8 %x, i8 %y
151 define internal i8 @umax8(i8 %x, i8 %y) #2 {
152 %cmp = icmp ugt i8 %x, %y
153 %sel = select i1 %cmp, i8 %x, i8 %y
159 ; 0: max(min(x, y), min(max(x, y), z))
160 ; 1: max(min(x, y), min(max(y, x), z))
161 ; 2: max(min(x, y), min(z, max(x, y)))
162 ; 3: max(min(x, y), min(z, max(y, x)))
163 ; 4: max(min(y, x), min(max(x, y), z))
164 ; 5: max(min(y, x), min(max(y, x), z))
165 ; 6: max(min(y, x), min(z, max(x, y)))
166 ; 7: max(min(y, x), min(z, max(y, x)))
168 ; + commute outermost max
171 ; FIXME: In these cases we probably should have used scalar operations
174 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0:
175 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
176 define amdgpu_kernel void @s_test_umed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
178 %tmp0 = call i32 @umin(i32 %x, i32 %y)
179 %tmp1 = call i32 @umax(i32 %x, i32 %y)
180 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
181 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
182 store i32 %tmp3, i32 addrspace(1)* %arg
186 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_1:
187 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
188 define amdgpu_kernel void @s_test_umed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
190 %tmp0 = call i32 @umin(i32 %x, i32 %y)
191 %tmp1 = call i32 @umax(i32 %y, i32 %x)
192 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
193 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
194 store i32 %tmp3, i32 addrspace(1)* %arg
198 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_2:
199 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
200 define amdgpu_kernel void @s_test_umed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
202 %tmp0 = call i32 @umin(i32 %x, i32 %y)
203 %tmp1 = call i32 @umax(i32 %x, i32 %y)
204 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
205 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
206 store i32 %tmp3, i32 addrspace(1)* %arg
210 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_3:
211 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
212 define amdgpu_kernel void @s_test_umed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
214 %tmp0 = call i32 @umin(i32 %x, i32 %y)
215 %tmp1 = call i32 @umax(i32 %y, i32 %x)
216 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
217 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
218 store i32 %tmp3, i32 addrspace(1)* %arg
222 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_4:
223 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
224 define amdgpu_kernel void @s_test_umed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
226 %tmp0 = call i32 @umin(i32 %y, i32 %x)
227 %tmp1 = call i32 @umax(i32 %x, i32 %y)
228 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
229 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
230 store i32 %tmp3, i32 addrspace(1)* %arg
234 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_5:
235 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
236 define amdgpu_kernel void @s_test_umed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
238 %tmp0 = call i32 @umin(i32 %y, i32 %x)
239 %tmp1 = call i32 @umax(i32 %y, i32 %x)
240 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
241 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
242 store i32 %tmp3, i32 addrspace(1)* %arg
246 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_6:
247 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
248 define amdgpu_kernel void @s_test_umed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
250 %tmp0 = call i32 @umin(i32 %y, i32 %x)
251 %tmp1 = call i32 @umax(i32 %x, i32 %y)
252 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
253 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
254 store i32 %tmp3, i32 addrspace(1)* %arg
258 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_7:
259 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
260 define amdgpu_kernel void @s_test_umed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
262 %tmp0 = call i32 @umin(i32 %y, i32 %x)
263 %tmp1 = call i32 @umax(i32 %y, i32 %x)
264 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
265 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
266 store i32 %tmp3, i32 addrspace(1)* %arg
270 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_8:
271 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
272 define amdgpu_kernel void @s_test_umed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
274 %tmp0 = call i32 @umin(i32 %x, i32 %y)
275 %tmp1 = call i32 @umax(i32 %x, i32 %y)
276 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
277 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
278 store i32 %tmp3, i32 addrspace(1)* %arg
282 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_9:
283 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
284 define amdgpu_kernel void @s_test_umed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
286 %tmp0 = call i32 @umin(i32 %x, i32 %y)
287 %tmp1 = call i32 @umax(i32 %y, i32 %x)
288 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
289 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
290 store i32 %tmp3, i32 addrspace(1)* %arg
294 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_10:
295 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
296 define amdgpu_kernel void @s_test_umed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
298 %tmp0 = call i32 @umin(i32 %x, i32 %y)
299 %tmp1 = call i32 @umax(i32 %x, i32 %y)
300 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
301 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
302 store i32 %tmp3, i32 addrspace(1)* %arg
306 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_11:
307 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
308 define amdgpu_kernel void @s_test_umed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
310 %tmp0 = call i32 @umin(i32 %x, i32 %y)
311 %tmp1 = call i32 @umax(i32 %y, i32 %x)
312 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
313 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
314 store i32 %tmp3, i32 addrspace(1)* %arg
318 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_12:
319 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
320 define amdgpu_kernel void @s_test_umed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
322 %tmp0 = call i32 @umin(i32 %y, i32 %x)
323 %tmp1 = call i32 @umax(i32 %x, i32 %y)
324 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
325 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
326 store i32 %tmp3, i32 addrspace(1)* %arg
330 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_13:
331 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
332 define amdgpu_kernel void @s_test_umed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
334 %tmp0 = call i32 @umin(i32 %y, i32 %x)
335 %tmp1 = call i32 @umax(i32 %y, i32 %x)
336 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
337 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
338 store i32 %tmp3, i32 addrspace(1)* %arg
342 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_14:
343 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
344 define amdgpu_kernel void @s_test_umed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
346 %tmp0 = call i32 @umin(i32 %y, i32 %x)
347 %tmp1 = call i32 @umax(i32 %x, i32 %y)
348 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
349 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
350 store i32 %tmp3, i32 addrspace(1)* %arg
354 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_15:
355 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
356 define amdgpu_kernel void @s_test_umed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
358 %tmp0 = call i32 @umin(i32 %y, i32 %x)
359 %tmp1 = call i32 @umax(i32 %y, i32 %x)
360 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
361 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
362 store i32 %tmp3, i32 addrspace(1)* %arg
366 ; GCN-LABEL: {{^}}s_test_umed3_i16_pat_0:
370 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
371 define amdgpu_kernel void @s_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, i16 %x, i16 %y, i16 %z) #1 {
373 %tmp0 = call i16 @umin16(i16 %x, i16 %y)
374 %tmp1 = call i16 @umax16(i16 %x, i16 %y)
375 %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
376 %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
377 store i16 %tmp3, i16 addrspace(1)* %arg
381 ; GCN-LABEL: {{^}}s_test_umed3_i8_pat_0:
385 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
386 define amdgpu_kernel void @s_test_umed3_i8_pat_0(i8 addrspace(1)* %arg, i8 %x, i8 %y, i8 %z) #1 {
388 %tmp0 = call i8 @umin8(i8 %x, i8 %y)
389 %tmp1 = call i8 @umax8(i8 %x, i8 %y)
390 %tmp2 = call i8 @umin8(i8 %tmp1, i8 %z)
391 %tmp3 = call i8 @umax8(i8 %tmp0, i8 %tmp2)
392 store i8 %tmp3, i8 addrspace(1)* %arg
396 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_0:
397 ; GCN-NOT: v_med3_u32
398 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
400 %tmp0 = call i32 @umin(i32 %x, i32 %y)
401 %tmp1 = call i32 @umax(i32 %x, i32 %y)
402 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
403 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
404 store volatile i32 %tmp0, i32 addrspace(1)* %arg
405 store volatile i32 %tmp3, i32 addrspace(1)* %arg
409 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_1:
410 ; GCN-NOT: v_med3_u32
411 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
413 %tmp0 = call i32 @umin(i32 %x, i32 %y)
414 %tmp1 = call i32 @umax(i32 %x, i32 %y)
415 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
416 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
417 store volatile i32 %tmp1, i32 addrspace(1)* %arg
418 store volatile i32 %tmp3, i32 addrspace(1)* %arg
422 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_2:
423 ; GCN-NOT: v_med3_u32
424 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
426 %tmp0 = call i32 @umin(i32 %x, i32 %y)
427 %tmp1 = call i32 @umax(i32 %x, i32 %y)
428 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
429 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
430 store volatile i32 %tmp2, i32 addrspace(1)* %arg
431 store volatile i32 %tmp3, i32 addrspace(1)* %arg
435 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_result:
436 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
437 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
439 %tmp0 = call i32 @umin(i32 %x, i32 %y)
440 %tmp1 = call i32 @umax(i32 %x, i32 %y)
441 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
442 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
443 store volatile i32 %tmp3, i32 addrspace(1)* %arg
444 store volatile i32 %tmp3, i32 addrspace(1)* %arg
448 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src0:
449 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 1, v{{[0-9]+}}
450 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
452 %tmp0 = call i32 @umin(i32 1, i32 %y)
453 %tmp1 = call i32 @umax(i32 1, i32 %y)
454 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
455 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
456 store i32 %tmp3, i32 addrspace(1)* %arg
460 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src1:
461 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 2, v{{[0-9]+}}
462 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
464 %tmp0 = call i32 @umin(i32 %x, i32 2)
465 %tmp1 = call i32 @umax(i32 %x, i32 2)
466 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
467 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
468 store i32 %tmp3, i32 addrspace(1)* %arg
472 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src2:
473 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, 9
474 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
476 %tmp0 = call i32 @umin(i32 %x, i32 %y)
477 %tmp1 = call i32 @umax(i32 %x, i32 %y)
478 %tmp2 = call i32 @umin(i32 %tmp1, i32 9)
479 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
480 store i32 %tmp3, i32 addrspace(1)* %arg
484 ; GCN-LABEL: {{^}}v_test_umed3_i16_pat_0:
485 ; SI: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
487 ; FIXME: VI not matching med3
493 ; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
494 define amdgpu_kernel void @v_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
496 %tid = call i32 @llvm.amdgcn.workitem.id.x()
497 %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
498 %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
499 %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
500 %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
501 %x = load i16, i16 addrspace(1)* %gep0
502 %y = load i16, i16 addrspace(1)* %gep1
503 %z = load i16, i16 addrspace(1)* %gep2
505 %tmp0 = call i16 @umin16(i16 %x, i16 %y)
506 %tmp1 = call i16 @umax16(i16 %x, i16 %y)
507 %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
508 %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
509 store i16 %tmp3, i16 addrspace(1)* %out.gep
513 attributes #0 = { nounwind readnone }
514 attributes #1 = { nounwind }
515 attributes #2 = { nounwind readnone alwaysinline }