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
4
5declare i32 @llvm.amdgcn.workitem.id.x() #0
6
7; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i32:
8; GCN: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
9define 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
14
15  %icmp0 = icmp ugt i32 %a, 12
16  %i0 = select i1 %icmp0, i32 %a, i32 12
17
18  %icmp1 = icmp ult i32 %i0, 17
19  %i1 = select i1 %icmp1, i32 %i0, i32 17
20
21  store i32 %i1, i32 addrspace(1)* %outgep
22  ret void
23}
24
25; GCN-LABEL: {{^}}v_test_umed3_multi_use_r_i_i_i32:
26; GCN: v_max_u32
27; GCN: v_min_u32
28define 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
33
34  %icmp0 = icmp ugt i32 %a, 12
35  %i0 = select i1 %icmp0, i32 %a, i32 12
36
37  %icmp1 = icmp ult i32 %i0, 17
38  %i1 = select i1 %icmp1, i32 %i0, i32 17
39
40  store volatile i32 %i0, i32 addrspace(1)* %outgep
41  store volatile i32 %i1, i32 addrspace(1)* %outgep
42  ret void
43}
44
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]+}}
48define 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
53
54  %icmp0 = icmp ugt i32 %a, 17
55  %i0 = select i1 %icmp0, i32 %a, i32 17
56
57  %icmp1 = icmp ult i32 %i0, 12
58  %i1 = select i1 %icmp1, i32 %i0, i32 12
59
60  store i32 %i1, i32 addrspace(1)* %outgep
61  ret void
62}
63
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]+}}
67define 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
72
73  %icmp0 = icmp sgt i32 %a, 12
74  %i0 = select i1 %icmp0, i32 %a, i32 12
75
76  %icmp1 = icmp ult i32 %i0, 17
77  %i1 = select i1 %icmp1, i32 %i0, i32 17
78
79  store i32 %i1, i32 addrspace(1)* %outgep
80  ret void
81}
82
83; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i64:
84; GCN: v_cmp_lt_u64
85; GCN: v_cmp_gt_u64
86define 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
91
92  %icmp0 = icmp ugt i64 %a, 12
93  %i0 = select i1 %icmp0, i64 %a, i64 12
94
95  %icmp1 = icmp ult i64 %i0, 17
96  %i1 = select i1 %icmp1, i64 %i0, i64 17
97
98  store i64 %i1, i64 addrspace(1)* %outgep
99  ret void
100}
101
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
105define 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
110
111  %icmp0 = icmp ugt i16 %a, 12
112  %i0 = select i1 %icmp0, i16 %a, i16 12
113
114  %icmp1 = icmp ult i16 %i0, 17
115  %i1 = select i1 %icmp1, i16 %i0, i16 17
116
117  store i16 %i1, i16 addrspace(1)* %outgep
118  ret void
119}
120
121define internal i32 @umin(i32 %x, i32 %y) #2 {
122  %cmp = icmp ult i32 %x, %y
123  %sel = select i1 %cmp, i32 %x, i32 %y
124  ret i32 %sel
125}
126
127define internal i32 @umax(i32 %x, i32 %y) #2 {
128  %cmp = icmp ugt i32 %x, %y
129  %sel = select i1 %cmp, i32 %x, i32 %y
130  ret i32 %sel
131}
132
133define internal i16 @umin16(i16 %x, i16 %y) #2 {
134  %cmp = icmp ult i16 %x, %y
135  %sel = select i1 %cmp, i16 %x, i16 %y
136  ret i16 %sel
137}
138
139define internal i16 @umax16(i16 %x, i16 %y) #2 {
140  %cmp = icmp ugt i16 %x, %y
141  %sel = select i1 %cmp, i16 %x, i16 %y
142  ret i16 %sel
143}
144
145define internal i8 @umin8(i8 %x, i8 %y) #2 {
146  %cmp = icmp ult i8 %x, %y
147  %sel = select i1 %cmp, i8 %x, i8 %y
148  ret i8 %sel
149}
150
151define internal i8 @umax8(i8 %x, i8 %y) #2 {
152  %cmp = icmp ugt i8 %x, %y
153  %sel = select i1 %cmp, i8 %x, i8 %y
154  ret i8 %sel
155}
156
157; 16 combinations
158
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)))
167;
168; + commute outermost max
169
170
171; FIXME: In these cases we probably should have used scalar operations
172; instead.
173
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]+}}
176define amdgpu_kernel void @s_test_umed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
177bb:
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
183  ret void
184}
185
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]+}}
188define amdgpu_kernel void @s_test_umed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
189bb:
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
195  ret void
196}
197
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]+}}
200define amdgpu_kernel void @s_test_umed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
201bb:
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
207  ret void
208}
209
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]+}}
212define amdgpu_kernel void @s_test_umed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
213bb:
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
219  ret void
220}
221
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]+}}
224define amdgpu_kernel void @s_test_umed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
225bb:
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
231  ret void
232}
233
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]+}}
236define amdgpu_kernel void @s_test_umed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
237bb:
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
243  ret void
244}
245
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]+}}
248define amdgpu_kernel void @s_test_umed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
249bb:
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
255  ret void
256}
257
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]+}}
260define amdgpu_kernel void @s_test_umed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
261bb:
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
267  ret void
268}
269
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]+}}
272define amdgpu_kernel void @s_test_umed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
273bb:
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
279  ret void
280}
281
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]+}}
284define amdgpu_kernel void @s_test_umed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
285bb:
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
291  ret void
292}
293
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]+}}
296define amdgpu_kernel void @s_test_umed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
297bb:
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
303  ret void
304}
305
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]+}}
308define amdgpu_kernel void @s_test_umed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
309bb:
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
315  ret void
316}
317
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]+}}
320define amdgpu_kernel void @s_test_umed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
321bb:
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
327  ret void
328}
329
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]+}}
332define amdgpu_kernel void @s_test_umed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
333bb:
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
339  ret void
340}
341
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]+}}
344define amdgpu_kernel void @s_test_umed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
345bb:
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
351  ret void
352}
353
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]+}}
356define amdgpu_kernel void @s_test_umed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
357bb:
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
363  ret void
364}
365
366; 16 combinations
367
368; 16: min(max(x, y), max(min(x, y), z))
369; 17: min(max(x, y), max(min(y, x), z))
370; 18: min(max(x, y), max(z, min(x, y)))
371; 19: min(max(x, y), max(z, min(y, x)))
372; 20: min(max(y, x), max(min(x, y), z))
373; 21: min(max(y, x), max(min(y, x), z))
374; 22: min(max(y, x), max(z, min(x, y)))
375; 23: min(max(y, x), max(z, min(y, x)))
376;
377; + commute outermost min
378
379
380; GCN-LABEL: {{^}}s_test_umed3_i32_pat_16:
381; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
382define amdgpu_kernel void @s_test_umed3_i32_pat_16(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
383bb:
384  %tmp0 = call i32 @umin(i32 %x, i32 %y)
385  %tmp1 = call i32 @umax(i32 %x, i32 %y)
386  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
387  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
388  store i32 %tmp3, i32 addrspace(1)* %arg
389  ret void
390}
391
392; GCN-LABEL: {{^}}s_test_umed3_i32_pat_17:
393; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
394define amdgpu_kernel void @s_test_umed3_i32_pat_17(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
395bb:
396  %tmp0 = call i32 @umin(i32 %y, i32 %x)
397  %tmp1 = call i32 @umax(i32 %x, i32 %y)
398  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
399  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
400  store i32 %tmp3, i32 addrspace(1)* %arg
401  ret void
402}
403
404; GCN-LABEL: {{^}}s_test_umed3_i32_pat_18:
405; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
406define amdgpu_kernel void @s_test_umed3_i32_pat_18(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
407bb:
408  %tmp0 = call i32 @umin(i32 %x, i32 %y)
409  %tmp1 = call i32 @umax(i32 %x, i32 %y)
410  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
411  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
412  store i32 %tmp3, i32 addrspace(1)* %arg
413  ret void
414}
415
416; GCN-LABEL: {{^}}s_test_umed3_i32_pat_19:
417; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
418define amdgpu_kernel void @s_test_umed3_i32_pat_19(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
419bb:
420  %tmp0 = call i32 @umin(i32 %y, i32 %x)
421  %tmp1 = call i32 @umax(i32 %x, i32 %y)
422  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
423  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
424  store i32 %tmp3, i32 addrspace(1)* %arg
425  ret void
426}
427
428; GCN-LABEL: {{^}}s_test_umed3_i32_pat_20:
429; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
430define amdgpu_kernel void @s_test_umed3_i32_pat_20(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
431bb:
432  %tmp0 = call i32 @umin(i32 %x, i32 %y)
433  %tmp1 = call i32 @umax(i32 %y, i32 %x)
434  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
435  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
436  store i32 %tmp3, i32 addrspace(1)* %arg
437  ret void
438}
439
440; GCN-LABEL: {{^}}s_test_umed3_i32_pat_21:
441; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
442define amdgpu_kernel void @s_test_umed3_i32_pat_21(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
443bb:
444  %tmp0 = call i32 @umin(i32 %y, i32 %x)
445  %tmp1 = call i32 @umax(i32 %y, i32 %x)
446  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
447  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
448  store i32 %tmp3, i32 addrspace(1)* %arg
449  ret void
450}
451
452; GCN-LABEL: {{^}}s_test_umed3_i32_pat_22:
453; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
454define amdgpu_kernel void @s_test_umed3_i32_pat_22(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
455bb:
456  %tmp0 = call i32 @umin(i32 %x, i32 %y)
457  %tmp1 = call i32 @umax(i32 %y, i32 %x)
458  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
459  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
460  store i32 %tmp3, i32 addrspace(1)* %arg
461  ret void
462}
463
464; GCN-LABEL: {{^}}s_test_umed3_i32_pat_23:
465; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
466define amdgpu_kernel void @s_test_umed3_i32_pat_23(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
467bb:
468  %tmp0 = call i32 @umin(i32 %y, i32 %x)
469  %tmp1 = call i32 @umax(i32 %y, i32 %x)
470  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
471  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
472  store i32 %tmp3, i32 addrspace(1)* %arg
473  ret void
474}
475
476; GCN-LABEL: {{^}}s_test_umed3_i32_pat_24:
477; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
478define amdgpu_kernel void @s_test_umed3_i32_pat_24(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
479bb:
480  %tmp0 = call i32 @umin(i32 %x, i32 %y)
481  %tmp1 = call i32 @umax(i32 %x, i32 %y)
482  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
483  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
484  store i32 %tmp3, i32 addrspace(1)* %arg
485  ret void
486}
487
488; GCN-LABEL: {{^}}s_test_umed3_i32_pat_25:
489; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
490define amdgpu_kernel void @s_test_umed3_i32_pat_25(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
491bb:
492  %tmp0 = call i32 @umin(i32 %y, i32 %x)
493  %tmp1 = call i32 @umax(i32 %x, i32 %y)
494  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
495  %tmp3 = call i32 @umin(i32 %tmp1, i32 %tmp2)
496  store i32 %tmp3, i32 addrspace(1)* %arg
497  ret void
498}
499
500; GCN-LABEL: {{^}}s_test_umed3_i32_pat_26:
501; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
502define amdgpu_kernel void @s_test_umed3_i32_pat_26(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
503bb:
504  %tmp0 = call i32 @umin(i32 %x, i32 %y)
505  %tmp1 = call i32 @umax(i32 %x, i32 %y)
506  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
507  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
508  store i32 %tmp3, i32 addrspace(1)* %arg
509  ret void
510}
511
512; GCN-LABEL: {{^}}s_test_umed3_i32_pat_27:
513; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
514define amdgpu_kernel void @s_test_umed3_i32_pat_27(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
515bb:
516  %tmp0 = call i32 @umin(i32 %y, i32 %x)
517  %tmp1 = call i32 @umax(i32 %x, i32 %y)
518  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
519  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
520  store i32 %tmp3, i32 addrspace(1)* %arg
521  ret void
522}
523
524; GCN-LABEL: {{^}}s_test_umed3_i32_pat_28:
525; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
526define amdgpu_kernel void @s_test_umed3_i32_pat_28(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
527bb:
528  %tmp0 = call i32 @umin(i32 %x, i32 %y)
529  %tmp1 = call i32 @umax(i32 %y, i32 %x)
530  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
531  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
532  store i32 %tmp3, i32 addrspace(1)* %arg
533  ret void
534}
535
536; GCN-LABEL: {{^}}s_test_umed3_i32_pat_29:
537; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
538define amdgpu_kernel void @s_test_umed3_i32_pat_29(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
539bb:
540  %tmp0 = call i32 @umin(i32 %y, i32 %x)
541  %tmp1 = call i32 @umax(i32 %y, i32 %x)
542  %tmp2 = call i32 @umax(i32 %tmp0, i32 %z)
543  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
544  store i32 %tmp3, i32 addrspace(1)* %arg
545  ret void
546}
547
548; GCN-LABEL: {{^}}s_test_umed3_i32_pat_30:
549; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
550define amdgpu_kernel void @s_test_umed3_i32_pat_30(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
551bb:
552  %tmp0 = call i32 @umin(i32 %x, i32 %y)
553  %tmp1 = call i32 @umax(i32 %y, i32 %x)
554  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
555  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
556  store i32 %tmp3, i32 addrspace(1)* %arg
557  ret void
558}
559
560; GCN-LABEL: {{^}}s_test_umed3_i32_pat_31:
561; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
562define amdgpu_kernel void @s_test_umed3_i32_pat_31(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
563bb:
564  %tmp0 = call i32 @umin(i32 %y, i32 %x)
565  %tmp1 = call i32 @umax(i32 %y, i32 %x)
566  %tmp2 = call i32 @umax(i32 %z, i32 %tmp0)
567  %tmp3 = call i32 @umin(i32 %tmp2, i32 %tmp1)
568  store i32 %tmp3, i32 addrspace(1)* %arg
569  ret void
570}
571
572; GCN-LABEL: {{^}}s_test_umed3_i16_pat_0:
573; GCN: s_and_b32
574; GCN: s_and_b32
575; GCN: s_and_b32
576; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
577define 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 {
578bb:
579  %tmp0 = call i16 @umin16(i16 %x, i16 %y)
580  %tmp1 = call i16 @umax16(i16 %x, i16 %y)
581  %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
582  %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
583  store i16 %tmp3, i16 addrspace(1)* %arg
584  ret void
585}
586
587; GCN-LABEL: {{^}}s_test_umed3_i8_pat_0:
588; GCN: s_and_b32
589; GCN: s_and_b32
590; GCN: s_and_b32
591; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
592define 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 {
593bb:
594  %tmp0 = call i8 @umin8(i8 %x, i8 %y)
595  %tmp1 = call i8 @umax8(i8 %x, i8 %y)
596  %tmp2 = call i8 @umin8(i8 %tmp1, i8 %z)
597  %tmp3 = call i8 @umax8(i8 %tmp0, i8 %tmp2)
598  store i8 %tmp3, i8 addrspace(1)* %arg
599  ret void
600}
601
602; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_0:
603; GCN-NOT: v_med3_u32
604define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
605bb:
606  %tmp0 = call i32 @umin(i32 %x, i32 %y)
607  %tmp1 = call i32 @umax(i32 %x, i32 %y)
608  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
609  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
610  store volatile i32 %tmp0, i32 addrspace(1)* %arg
611  store volatile i32 %tmp3, i32 addrspace(1)* %arg
612  ret void
613}
614
615; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_1:
616; GCN-NOT: v_med3_u32
617define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
618bb:
619  %tmp0 = call i32 @umin(i32 %x, i32 %y)
620  %tmp1 = call i32 @umax(i32 %x, i32 %y)
621  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
622  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
623  store volatile i32 %tmp1, i32 addrspace(1)* %arg
624  store volatile i32 %tmp3, i32 addrspace(1)* %arg
625  ret void
626}
627
628; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_2:
629; GCN-NOT: v_med3_u32
630define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
631bb:
632  %tmp0 = call i32 @umin(i32 %x, i32 %y)
633  %tmp1 = call i32 @umax(i32 %x, i32 %y)
634  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
635  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
636  store volatile i32 %tmp2, i32 addrspace(1)* %arg
637  store volatile i32 %tmp3, i32 addrspace(1)* %arg
638  ret void
639}
640
641; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_result:
642; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
643define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
644bb:
645  %tmp0 = call i32 @umin(i32 %x, i32 %y)
646  %tmp1 = call i32 @umax(i32 %x, i32 %y)
647  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
648  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
649  store volatile i32 %tmp3, i32 addrspace(1)* %arg
650  store volatile i32 %tmp3, i32 addrspace(1)* %arg
651  ret void
652}
653
654; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src0:
655; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 1, v{{[0-9]+}}
656define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
657bb:
658  %tmp0 = call i32 @umin(i32 1, i32 %y)
659  %tmp1 = call i32 @umax(i32 1, i32 %y)
660  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
661  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
662  store i32 %tmp3, i32 addrspace(1)* %arg
663  ret void
664}
665
666; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src1:
667; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, 2, v{{[0-9]+}}
668define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
669bb:
670  %tmp0 = call i32 @umin(i32 %x, i32 2)
671  %tmp1 = call i32 @umax(i32 %x, i32 2)
672  %tmp2 = call i32 @umin(i32 %tmp1, i32 %z)
673  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
674  store i32 %tmp3, i32 addrspace(1)* %arg
675  ret void
676}
677
678; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_imm_src2:
679; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, 9
680define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
681bb:
682  %tmp0 = call i32 @umin(i32 %x, i32 %y)
683  %tmp1 = call i32 @umax(i32 %x, i32 %y)
684  %tmp2 = call i32 @umin(i32 %tmp1, i32 9)
685  %tmp3 = call i32 @umax(i32 %tmp0, i32 %tmp2)
686  store i32 %tmp3, i32 addrspace(1)* %arg
687  ret void
688}
689
690; GCN-LABEL: {{^}}v_test_umed3_i16_pat_0:
691; SI: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
692
693; FIXME: VI not matching med3
694; VI: v_min_u16
695; VI: v_max_u16
696; VI: v_min_u16
697; VI: v_max_u16
698
699; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
700define amdgpu_kernel void @v_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
701bb:
702  %tid = call i32 @llvm.amdgcn.workitem.id.x()
703  %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
704  %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
705  %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
706  %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
707  %x = load i16, i16 addrspace(1)* %gep0
708  %y = load i16, i16 addrspace(1)* %gep1
709  %z = load i16, i16 addrspace(1)* %gep2
710
711  %tmp0 = call i16 @umin16(i16 %x, i16 %y)
712  %tmp1 = call i16 @umax16(i16 %x, i16 %y)
713  %tmp2 = call i16 @umin16(i16 %tmp1, i16 %z)
714  %tmp3 = call i16 @umax16(i16 %tmp0, i16 %tmp2)
715  store i16 %tmp3, i16 addrspace(1)* %out.gep
716  ret void
717}
718
719; GCN-LABEL: {{^}}v_test_umed3_i16_pat_1:
720; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
721define amdgpu_kernel void @v_test_umed3_i16_pat_1(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
722bb:
723  %tid = call i32 @llvm.amdgcn.workitem.id.x()
724  %gep0 = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i32 %tid
725  %gep1 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 3
726  %gep2 = getelementptr inbounds i16, i16 addrspace(1)* %gep0, i32 8
727  %out.gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
728  %x = load i16, i16 addrspace(1)* %gep0
729  %y = load i16, i16 addrspace(1)* %gep1
730  %z = load i16, i16 addrspace(1)* %gep2
731
732  %tmp0 = call i16 @umin16(i16 %x, i16 %y)
733  %tmp1 = call i16 @umax16(i16 %x, i16 %y)
734  %tmp2 = call i16 @umax16(i16 %tmp0, i16 %z)
735  %tmp3 = call i16 @umin16(i16 %tmp1, i16 %tmp2)
736  store i16 %tmp3, i16 addrspace(1)* %out.gep
737  ret void
738}
739
740attributes #0 = { nounwind readnone }
741attributes #1 = { nounwind }
742attributes #2 = { nounwind readnone alwaysinline }
743