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_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]+}}
48define 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
53
54  %icmp0 = icmp sgt i32 %a, 12
55  %i0 = select i1 %icmp0, i32 %a, i32 12
56
57  %icmp1 = icmp ult i32 %i0, 17
58  %i1 = select i1 %icmp1, i32 %i0, i32 17
59
60  store i32 %i1, i32 addrspace(1)* %outgep
61  ret void
62}
63
64; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i64:
65; GCN: v_cmp_lt_u64
66; GCN: v_cmp_gt_u64
67define 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
72
73  %icmp0 = icmp ugt i64 %a, 12
74  %i0 = select i1 %icmp0, i64 %a, i64 12
75
76  %icmp1 = icmp ult i64 %i0, 17
77  %i1 = select i1 %icmp1, i64 %i0, i64 17
78
79  store i64 %i1, i64 addrspace(1)* %outgep
80  ret void
81}
82
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
86define 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
91
92  %icmp0 = icmp ugt i16 %a, 12
93  %i0 = select i1 %icmp0, i16 %a, i16 12
94
95  %icmp1 = icmp ult i16 %i0, 17
96  %i1 = select i1 %icmp1, i16 %i0, i16 17
97
98  store i16 %i1, i16 addrspace(1)* %outgep
99  ret void
100}
101
102define internal i32 @umin(i32 %x, i32 %y) #2 {
103  %cmp = icmp ult i32 %x, %y
104  %sel = select i1 %cmp, i32 %x, i32 %y
105  ret i32 %sel
106}
107
108define internal i32 @umax(i32 %x, i32 %y) #2 {
109  %cmp = icmp ugt i32 %x, %y
110  %sel = select i1 %cmp, i32 %x, i32 %y
111  ret i32 %sel
112}
113
114define internal i16 @umin16(i16 %x, i16 %y) #2 {
115  %cmp = icmp ult i16 %x, %y
116  %sel = select i1 %cmp, i16 %x, i16 %y
117  ret i16 %sel
118}
119
120define internal i16 @umax16(i16 %x, i16 %y) #2 {
121  %cmp = icmp ugt i16 %x, %y
122  %sel = select i1 %cmp, i16 %x, i16 %y
123  ret i16 %sel
124}
125
126define internal i8 @umin8(i8 %x, i8 %y) #2 {
127  %cmp = icmp ult i8 %x, %y
128  %sel = select i1 %cmp, i8 %x, i8 %y
129  ret i8 %sel
130}
131
132define internal i8 @umax8(i8 %x, i8 %y) #2 {
133  %cmp = icmp ugt i8 %x, %y
134  %sel = select i1 %cmp, i8 %x, i8 %y
135  ret i8 %sel
136}
137
138; 16 combinations
139
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)))
148;
149; + commute outermost max
150
151
152; FIXME: In these cases we probably should have used scalar operations
153; instead.
154
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]+}}
157define amdgpu_kernel void @s_test_umed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
158bb:
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
164  ret void
165}
166
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]+}}
169define amdgpu_kernel void @s_test_umed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
170bb:
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
176  ret void
177}
178
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]+}}
181define amdgpu_kernel void @s_test_umed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
182bb:
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
188  ret void
189}
190
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]+}}
193define amdgpu_kernel void @s_test_umed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
194bb:
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
200  ret void
201}
202
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]+}}
205define amdgpu_kernel void @s_test_umed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
206bb:
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
212  ret void
213}
214
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]+}}
217define amdgpu_kernel void @s_test_umed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
218bb:
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
224  ret void
225}
226
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]+}}
229define amdgpu_kernel void @s_test_umed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
230bb:
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
236  ret void
237}
238
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]+}}
241define amdgpu_kernel void @s_test_umed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
242bb:
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
248  ret void
249}
250
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]+}}
253define amdgpu_kernel void @s_test_umed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
254bb:
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
260  ret void
261}
262
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]+}}
265define amdgpu_kernel void @s_test_umed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
266bb:
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
272  ret void
273}
274
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]+}}
277define amdgpu_kernel void @s_test_umed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
278bb:
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
284  ret void
285}
286
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]+}}
289define amdgpu_kernel void @s_test_umed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
290bb:
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
296  ret void
297}
298
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]+}}
301define amdgpu_kernel void @s_test_umed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
302bb:
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
308  ret void
309}
310
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]+}}
313define amdgpu_kernel void @s_test_umed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
314bb:
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
320  ret void
321}
322
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]+}}
325define amdgpu_kernel void @s_test_umed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
326bb:
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
332  ret void
333}
334
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]+}}
337define amdgpu_kernel void @s_test_umed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
338bb:
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
344  ret void
345}
346
347; 16 combinations
348
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)))
357;
358; + commute outermost min
359
360
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]+}}
363define amdgpu_kernel void @s_test_umed3_i32_pat_16(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
364bb:
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
370  ret void
371}
372
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]+}}
375define amdgpu_kernel void @s_test_umed3_i32_pat_17(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
376bb:
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
382  ret void
383}
384
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]+}}
387define amdgpu_kernel void @s_test_umed3_i32_pat_18(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
388bb:
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
394  ret void
395}
396
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]+}}
399define amdgpu_kernel void @s_test_umed3_i32_pat_19(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
400bb:
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
406  ret void
407}
408
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]+}}
411define amdgpu_kernel void @s_test_umed3_i32_pat_20(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
412bb:
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
418  ret void
419}
420
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]+}}
423define amdgpu_kernel void @s_test_umed3_i32_pat_21(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
424bb:
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
430  ret void
431}
432
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]+}}
435define amdgpu_kernel void @s_test_umed3_i32_pat_22(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
436bb:
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
442  ret void
443}
444
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]+}}
447define amdgpu_kernel void @s_test_umed3_i32_pat_23(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
448bb:
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
454  ret void
455}
456
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]+}}
459define amdgpu_kernel void @s_test_umed3_i32_pat_24(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
460bb:
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
466  ret void
467}
468
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]+}}
471define amdgpu_kernel void @s_test_umed3_i32_pat_25(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
472bb:
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
478  ret void
479}
480
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]+}}
483define amdgpu_kernel void @s_test_umed3_i32_pat_26(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
484bb:
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
490  ret void
491}
492
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]+}}
495define amdgpu_kernel void @s_test_umed3_i32_pat_27(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
496bb:
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
502  ret void
503}
504
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]+}}
507define amdgpu_kernel void @s_test_umed3_i32_pat_28(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
508bb:
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
514  ret void
515}
516
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]+}}
519define amdgpu_kernel void @s_test_umed3_i32_pat_29(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
520bb:
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
526  ret void
527}
528
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]+}}
531define amdgpu_kernel void @s_test_umed3_i32_pat_30(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
532bb:
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
538  ret void
539}
540
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]+}}
543define amdgpu_kernel void @s_test_umed3_i32_pat_31(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
544bb:
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
550  ret void
551}
552
553; GCN-LABEL: {{^}}s_test_umed3_i16_pat_0:
554; GCN: s_and_b32
555; GCN: s_and_b32
556; GCN: s_and_b32
557; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
558define 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 {
559bb:
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
565  ret void
566}
567
568; GCN-LABEL: {{^}}s_test_umed3_i8_pat_0:
569; GCN: s_and_b32
570; GCN: s_and_b32
571; GCN: s_and_b32
572; GCN: v_med3_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
573define 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 {
574bb:
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
580  ret void
581}
582
583; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_0:
584; GCN-NOT: v_med3_u32
585define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
586bb:
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
593  ret void
594}
595
596; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_1:
597; GCN-NOT: v_med3_u32
598define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
599bb:
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
606  ret void
607}
608
609; GCN-LABEL: {{^}}s_test_umed3_i32_pat_0_multi_use_2:
610; GCN-NOT: v_med3_u32
611define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
612bb:
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
619  ret void
620}
621
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]+}}
624define amdgpu_kernel void @s_test_umed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
625bb:
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
632  ret void
633}
634
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]+}}
637define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
638bb:
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
644  ret void
645}
646
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]+}}
649define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
650bb:
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
656  ret void
657}
658
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
661define amdgpu_kernel void @s_test_umed3_i32_pat_0_imm_src2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
662bb:
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
668  ret void
669}
670
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]+}}
673
674; FIXME: VI not matching med3
675; VI: v_min_u16
676; VI: v_max_u16
677; VI: v_min_u16
678; VI: v_max_u16
679
680; GFX9: v_med3_u16 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
681define amdgpu_kernel void @v_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
682bb:
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
691
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
697  ret void
698}
699
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]+}}
702define amdgpu_kernel void @v_test_umed3_i16_pat_1(i16 addrspace(1)* %arg, i16 addrspace(1)* %out, i16 addrspace(1)* %a.ptr) #1 {
703bb:
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
712
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
718  ret void
719}
720
721attributes #0 = { nounwind readnone }
722attributes #1 = { nounwind }
723attributes #2 = { nounwind readnone alwaysinline }
724