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_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_sign_mismatch_i32:
46 ; GCN: v_max_i32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}}
47 ; GCN: v_min_u32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}}
48 define amdgpu_kernel void @v_test_umed3_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 sgt i32 %a, 12
55 %i0 = select i1 %icmp0, i32 %a, i32 12
57 %icmp1 = icmp ult i32 %i0, 17
58 %i1 = select i1 %icmp1, i32 %i0, i32 17
60 store i32 %i1, i32 addrspace(1)* %outgep
64 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i64:
67 define amdgpu_kernel void @v_test_umed3_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 ugt i64 %a, 12
74 %i0 = select i1 %icmp0, i64 %a, i64 12
76 %icmp1 = icmp ult i64 %i0, 17
77 %i1 = select i1 %icmp1, i64 %i0, i64 17
79 store i64 %i1, i64 addrspace(1)* %outgep
83 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i16:
84 ; SICIVI: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
85 ; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
86 define amdgpu_kernel void @v_test_umed3_r_i_i_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr) #1 {
87 %tid = call i32 @llvm.amdgcn.workitem.id.x()
88 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
89 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
90 %a = load i16, i16 addrspace(1)* %gep0
92 %icmp0 = icmp ugt i16 %a, 12
93 %i0 = select i1 %icmp0, i16 %a, i16 12
95 %icmp1 = icmp ult i16 %i0, 17
96 %i1 = select i1 %icmp1, i16 %i0, i16 17
98 store i16 %i1, i16 addrspace(1)* %outgep
102 define internal i32 @umin(i32 %x, i32 %y) #2 {
103 %cmp = icmp ult i32 %x, %y
104 %sel = select i1 %cmp, i32 %x, i32 %y
108 define internal i32 @umax(i32 %x, i32 %y) #2 {
109 %cmp = icmp ugt i32 %x, %y
110 %sel = select i1 %cmp, i32 %x, i32 %y
114 define internal i16 @umin16(i16 %x, i16 %y) #2 {
115 %cmp = icmp ult i16 %x, %y
116 %sel = select i1 %cmp, i16 %x, i16 %y
120 define internal i16 @umax16(i16 %x, i16 %y) #2 {
121 %cmp = icmp ugt i16 %x, %y
122 %sel = select i1 %cmp, i16 %x, i16 %y
126 define internal i8 @umin8(i8 %x, i8 %y) #2 {
127 %cmp = icmp ult i8 %x, %y
128 %sel = select i1 %cmp, i8 %x, i8 %y
132 define internal i8 @umax8(i8 %x, i8 %y) #2 {
133 %cmp = icmp ugt i8 %x, %y
134 %sel = select i1 %cmp, i8 %x, i8 %y
140 ; 0: max(min(x, y), min(max(x, y), z))
141 ; 1: max(min(x, y), min(max(y, x), z))
142 ; 2: max(min(x, y), min(z, max(x, y)))
143 ; 3: max(min(x, y), min(z, max(y, x)))
144 ; 4: max(min(y, x), min(max(x, y), z))
145 ; 5: max(min(y, x), min(max(y, x), z))
146 ; 6: max(min(y, x), min(z, max(x, y)))
147 ; 7: max(min(y, x), min(z, max(y, x)))
149 ; + commute outermost max
152 ; FIXME: In these cases we probably should have used scalar operations
155 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0:
156 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
157 define amdgpu_kernel void @s_test_umed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
159 %tmp0 = call i32 @umin(i32 %x, i32 %y)
160 %tmp1 = call i32 @umax(i32 %x, i32 %y)
161 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
162 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
163 store i32 %tmp3, i32 addrspace(1)* %arg
167 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_1:
168 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
169 define amdgpu_kernel void @s_test_umed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
171 %tmp0 = call i32 @umin(i32 %x, i32 %y)
172 %tmp1 = call i32 @umax(i32 %y, i32 %x)
173 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
174 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
175 store i32 %tmp3, i32 addrspace(1)* %arg
179 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_2:
180 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
181 define amdgpu_kernel void @s_test_umed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
183 %tmp0 = call i32 @umin(i32 %x, i32 %y)
184 %tmp1 = call i32 @umax(i32 %x, i32 %y)
185 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
186 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
187 store i32 %tmp3, i32 addrspace(1)* %arg
191 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_3:
192 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
193 define amdgpu_kernel void @s_test_umed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
195 %tmp0 = call i32 @umin(i32 %x, i32 %y)
196 %tmp1 = call i32 @umax(i32 %y, i32 %x)
197 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
198 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
199 store i32 %tmp3, i32 addrspace(1)* %arg
203 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_4:
204 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
205 define amdgpu_kernel void @s_test_umed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
207 %tmp0 = call i32 @umin(i32 %y, i32 %x)
208 %tmp1 = call i32 @umax(i32 %x, i32 %y)
209 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
210 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
211 store i32 %tmp3, i32 addrspace(1)* %arg
215 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_5:
216 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
217 define amdgpu_kernel void @s_test_umed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
219 %tmp0 = call i32 @umin(i32 %y, i32 %x)
220 %tmp1 = call i32 @umax(i32 %y, i32 %x)
221 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
222 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
223 store i32 %tmp3, i32 addrspace(1)* %arg
227 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_6:
228 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
229 define amdgpu_kernel void @s_test_umed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
231 %tmp0 = call i32 @umin(i32 %y, i32 %x)
232 %tmp1 = call i32 @umax(i32 %x, i32 %y)
233 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
234 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
235 store i32 %tmp3, i32 addrspace(1)* %arg
239 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_7:
240 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
241 define amdgpu_kernel void @s_test_umed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
243 %tmp0 = call i32 @umin(i32 %y, i32 %x)
244 %tmp1 = call i32 @umax(i32 %y, i32 %x)
245 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
246 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
247 store i32 %tmp3, i32 addrspace(1)* %arg
251 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_8:
252 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
253 define amdgpu_kernel void @s_test_umed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
255 %tmp0 = call i32 @umin(i32 %x, i32 %y)
256 %tmp1 = call i32 @umax(i32 %x, i32 %y)
257 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
258 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
259 store i32 %tmp3, i32 addrspace(1)* %arg
263 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_9:
264 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
265 define amdgpu_kernel void @s_test_umed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
267 %tmp0 = call i32 @umin(i32 %x, i32 %y)
268 %tmp1 = call i32 @umax(i32 %y, i32 %x)
269 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
270 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
271 store i32 %tmp3, i32 addrspace(1)* %arg
275 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_10:
276 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
277 define amdgpu_kernel void @s_test_umed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
279 %tmp0 = call i32 @umin(i32 %x, i32 %y)
280 %tmp1 = call i32 @umax(i32 %x, i32 %y)
281 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
282 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
283 store i32 %tmp3, i32 addrspace(1)* %arg
287 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_11:
288 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
289 define amdgpu_kernel void @s_test_umed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
291 %tmp0 = call i32 @umin(i32 %x, i32 %y)
292 %tmp1 = call i32 @umax(i32 %y, i32 %x)
293 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
294 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
295 store i32 %tmp3, i32 addrspace(1)* %arg
299 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_12:
300 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
301 define amdgpu_kernel void @s_test_umed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
303 %tmp0 = call i32 @umin(i32 %y, i32 %x)
304 %tmp1 = call i32 @umax(i32 %x, i32 %y)
305 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
306 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
307 store i32 %tmp3, i32 addrspace(1)* %arg
311 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_13:
312 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
313 define amdgpu_kernel void @s_test_umed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
315 %tmp0 = call i32 @umin(i32 %y, i32 %x)
316 %tmp1 = call i32 @umax(i32 %y, i32 %x)
317 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
318 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
319 store i32 %tmp3, i32 addrspace(1)* %arg
323 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_14:
324 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
325 define amdgpu_kernel void @s_test_umed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
327 %tmp0 = call i32 @umin(i32 %y, i32 %x)
328 %tmp1 = call i32 @umax(i32 %x, i32 %y)
329 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
330 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
331 store i32 %tmp3, i32 addrspace(1)* %arg
335 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_15:
336 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
337 define amdgpu_kernel void @s_test_umed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
339 %tmp0 = call i32 @umin(i32 %y, i32 %x)
340 %tmp1 = call i32 @umax(i32 %y, i32 %x)
341 %tmp2 = call i32 @umin(i32 %z, i32 %tmp1)
342 %tmp3 = call i32 @umax(i32 %tmp2, i32 %tmp0)
343 store i32 %tmp3, i32 addrspace(1)* %arg
349 ; 16: min(max(x, y), max(min(x, y), z))
350 ; 17: min(max(x, y), max(min(y, x), z))
351 ; 18: min(max(x, y), max(z, min(x, y)))
352 ; 19: min(max(x, y), max(z, min(y, x)))
353 ; 20: min(max(y, x), max(min(x, y), z))
354 ; 21: min(max(y, x), max(min(y, x), z))
355 ; 22: min(max(y, x), max(z, min(x, y)))
356 ; 23: min(max(y, x), max(z, min(y, x)))
358 ; + commute outermost min
361 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_16:
362 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
363 define amdgpu_kernel void @s_test_umed3_i32_pat_16(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
365 %tmp0 = call i32 @umin(i32 %x, i32 %y)
366 %tmp1 = call i32 @umax(i32 %x, i32 %y)
367 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
368 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
369 store i32 %tmp3, i32 addrspace(1)* %arg
373 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_17:
374 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
375 define amdgpu_kernel void @s_test_umed3_i32_pat_17(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
377 %tmp0 = call i32 @umin(i32 %y, i32 %x)
378 %tmp1 = call i32 @umax(i32 %x, i32 %y)
379 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
380 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
381 store i32 %tmp3, i32 addrspace(1)* %arg
385 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_18:
386 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
387 define amdgpu_kernel void @s_test_umed3_i32_pat_18(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
389 %tmp0 = call i32 @umin(i32 %x, i32 %y)
390 %tmp1 = call i32 @umax(i32 %x, i32 %y)
391 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
392 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
393 store i32 %tmp3, i32 addrspace(1)* %arg
397 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_19:
398 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
399 define amdgpu_kernel void @s_test_umed3_i32_pat_19(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
401 %tmp0 = call i32 @umin(i32 %y, i32 %x)
402 %tmp1 = call i32 @umax(i32 %x, i32 %y)
403 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
404 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
405 store i32 %tmp3, i32 addrspace(1)* %arg
409 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_20:
410 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
411 define amdgpu_kernel void @s_test_umed3_i32_pat_20(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 %y, i32 %x)
415 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
416 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
417 store i32 %tmp3, i32 addrspace(1)* %arg
421 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_21:
422 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
423 define amdgpu_kernel void @s_test_umed3_i32_pat_21(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
425 %tmp0 = call i32 @umin(i32 %y, i32 %x)
426 %tmp1 = call i32 @umax(i32 %y, i32 %x)
427 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
428 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
429 store i32 %tmp3, i32 addrspace(1)* %arg
433 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_22:
434 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
435 define amdgpu_kernel void @s_test_umed3_i32_pat_22(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
437 %tmp0 = call i32 @umin(i32 %x, i32 %y)
438 %tmp1 = call i32 @umax(i32 %y, i32 %x)
439 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
440 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
441 store i32 %tmp3, i32 addrspace(1)* %arg
445 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_23:
446 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
447 define amdgpu_kernel void @s_test_umed3_i32_pat_23(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
449 %tmp0 = call i32 @umin(i32 %y, i32 %x)
450 %tmp1 = call i32 @umax(i32 %y, i32 %x)
451 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
452 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
453 store i32 %tmp3, i32 addrspace(1)* %arg
457 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_24:
458 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
459 define amdgpu_kernel void @s_test_umed3_i32_pat_24(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
461 %tmp0 = call i32 @umin(i32 %x, i32 %y)
462 %tmp1 = call i32 @umax(i32 %x, i32 %y)
463 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
464 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
465 store i32 %tmp3, i32 addrspace(1)* %arg
469 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_25:
470 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
471 define amdgpu_kernel void @s_test_umed3_i32_pat_25(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
473 %tmp0 = call i32 @umin(i32 %y, i32 %x)
474 %tmp1 = call i32 @umax(i32 %x, i32 %y)
475 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
476 %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
477 store i32 %tmp3, i32 addrspace(1)* %arg
481 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_26:
482 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
483 define amdgpu_kernel void @s_test_umed3_i32_pat_26(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
485 %tmp0 = call i32 @umin(i32 %x, i32 %y)
486 %tmp1 = call i32 @umax(i32 %x, i32 %y)
487 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
488 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
489 store i32 %tmp3, i32 addrspace(1)* %arg
493 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_27:
494 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
495 define amdgpu_kernel void @s_test_umed3_i32_pat_27(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
497 %tmp0 = call i32 @umin(i32 %y, i32 %x)
498 %tmp1 = call i32 @umax(i32 %x, i32 %y)
499 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
500 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
501 store i32 %tmp3, i32 addrspace(1)* %arg
505 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_28:
506 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
507 define amdgpu_kernel void @s_test_umed3_i32_pat_28(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
509 %tmp0 = call i32 @umin(i32 %x, i32 %y)
510 %tmp1 = call i32 @umax(i32 %y, i32 %x)
511 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
512 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
513 store i32 %tmp3, i32 addrspace(1)* %arg
517 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_29:
518 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
519 define amdgpu_kernel void @s_test_umed3_i32_pat_29(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
521 %tmp0 = call i32 @umin(i32 %y, i32 %x)
522 %tmp1 = call i32 @umax(i32 %y, i32 %x)
523 %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
524 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
525 store i32 %tmp3, i32 addrspace(1)* %arg
529 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_30:
530 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
531 define amdgpu_kernel void @s_test_umed3_i32_pat_30(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
533 %tmp0 = call i32 @umin(i32 %x, i32 %y)
534 %tmp1 = call i32 @umax(i32 %y, i32 %x)
535 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
536 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
537 store i32 %tmp3, i32 addrspace(1)* %arg
541 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_31:
542 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
543 define amdgpu_kernel void @s_test_umed3_i32_pat_31(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
545 %tmp0 = call i32 @umin(i32 %y, i32 %x)
546 %tmp1 = call i32 @umax(i32 %y, i32 %x)
547 %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
548 %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
549 store i32 %tmp3, i32 addrspace(1)* %arg
553 ; GCN-LABEL: {{^}}s_test_umed3_i16_pat_0:
557 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
558 define amdgpu_kernel void @s_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, [8 x i32], i16 %x, [8 x i32], i16 %y, [8 x i32], i16 %z) #1 {
560 %tmp0 = call i16 @umin16(i16 %x, i16 %y)
561 %tmp1 = call i16 @umax16(i16 %x, i16 %y)
562 %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
563 %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
564 store i16 %tmp3, i16 addrspace(1)* %arg
568 ; GCN-LABEL: {{^}}s_test_umed3_i8_pat_0:
572 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
573 define amdgpu_kernel void @s_test_umed3_i8_pat_0(i8 addrspace(1)* %arg, [8 x i32], i8 %x, [8 x i32], i8 %y, [8 x i32], i8 %z) #1 {
575 %tmp0 = call i8 @umin8(i8 %x, i8 %y)
576 %tmp1 = call i8 @umax8(i8 %x, i8 %y)
577 %tmp2 = call i8 @umin8(i8 %tmp1, i8 %z)
578 %tmp3 = call i8 @umax8(i8 %tmp0, i8 %tmp2)
579 store i8 %tmp3, i8 addrspace(1)* %arg
583 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_0:
584 ; GCN-NOT: v_med3_u32
585 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
587 %tmp0 = call i32 @umin(i32 %x, i32 %y)
588 %tmp1 = call i32 @umax(i32 %x, i32 %y)
589 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
590 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
591 store volatile i32 %tmp0, i32 addrspace(1)* %arg
592 store volatile i32 %tmp3, i32 addrspace(1)* %arg
596 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_1:
597 ; GCN-NOT: v_med3_u32
598 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
600 %tmp0 = call i32 @umin(i32 %x, i32 %y)
601 %tmp1 = call i32 @umax(i32 %x, i32 %y)
602 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
603 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
604 store volatile i32 %tmp1, i32 addrspace(1)* %arg
605 store volatile i32 %tmp3, i32 addrspace(1)* %arg
609 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_2:
610 ; GCN-NOT: v_med3_u32
611 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
613 %tmp0 = call i32 @umin(i32 %x, i32 %y)
614 %tmp1 = call i32 @umax(i32 %x, i32 %y)
615 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
616 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
617 store volatile i32 %tmp2, i32 addrspace(1)* %arg
618 store volatile i32 %tmp3, i32 addrspace(1)* %arg
622 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_result:
623 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
624 define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
626 %tmp0 = call i32 @umin(i32 %x, i32 %y)
627 %tmp1 = call i32 @umax(i32 %x, i32 %y)
628 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
629 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
630 store volatile i32 %tmp3, i32 addrspace(1)* %arg
631 store volatile i32 %tmp3, i32 addrspace(1)* %arg
635 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src0:
636 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 1, v{{[0-9]+}}
637 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
639 %tmp0 = call i32 @umin(i32 1, i32 %y)
640 %tmp1 = call i32 @umax(i32 1, i32 %y)
641 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
642 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
643 store i32 %tmp3, i32 addrspace(1)* %arg
647 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src1:
648 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 2, v{{[0-9]+}}
649 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
651 %tmp0 = call i32 @umin(i32 %x, i32 2)
652 %tmp1 = call i32 @umax(i32 %x, i32 2)
653 %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
654 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
655 store i32 %tmp3, i32 addrspace(1)* %arg
659 ; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src2:
660 ; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, 9
661 define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
663 %tmp0 = call i32 @umin(i32 %x, i32 %y)
664 %tmp1 = call i32 @umax(i32 %x, i32 %y)
665 %tmp2 = call i32 @umin(i32 %tmp1, i32 9)
666 %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
667 store i32 %tmp3, i32 addrspace(1)* %arg
671 ; GCN-LABEL: {{^}}v_test_umed3_i16_pat_0:
672 ; SI: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
674 ; FIXME: VI not matching med3
680 ; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
681 define amdgpu_kernel void @v_test_umed3_i16_pat_0(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 @umin16(i16 %x, i16 %y)
693 %tmp1 = call i16 @umax16(i16 %x, i16 %y)
694 %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
695 %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
696 store i16 %tmp3, i16 addrspace(1)* %out.gep
700 ; GCN-LABEL: {{^}}v_test_umed3_i16_pat_1:
701 ; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
702 define amdgpu_kernel void @v_test_umed3_i16_pat_1(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
704 %tid = call i32 @llvm.amdgcn.workitem.id.x()
705 %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
706 %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
707 %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
708 %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
709 %x = load i16, i16 addrspace(1)* %gep0
710 %y = load i16, i16 addrspace(1)* %gep1
711 %z = load i16, i16 addrspace(1)* %gep2
713 %tmp0 = call i16 @umin16(i16 %x, i16 %y)
714 %tmp1 = call i16 @umax16(i16 %x, i16 %y)
715 %tmp2 = call i16 @umax16(i16 %tmp0, i16 %z)
716 %tmp3 = call i16 @umin16(i16 %tmp1, i16 %tmp2)
717 store i16 %tmp3, i16 addrspace(1)* %out.gep
721 attributes #0 = { nounwind readnone }
722 attributes #1 = { nounwind }
723 attributes #2 = { nounwind readnone alwaysinline }