[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / umed3.ll
blob7c2a3414132486360ddf50cd289cc688b21a3560
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
22   ret void
25 ; GCN-LABEL: {{^}}v_test_umed3_multi_use_r_i_i_i32:
26 ; GCN: v_max_u32
27 ; GCN: v_min_u32
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
42   ret void
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
61   ret void
64 ; GCN-LABEL: {{^}}v_test_umed3_r_i_i_i64:
65 ; GCN: v_cmp_lt_u64
66 ; GCN: v_cmp_gt_u64
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
80   ret void
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
99   ret void
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
105   ret i32 %sel
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
111   ret i32 %sel
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
117   ret i16 %sel
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
123   ret i16 %sel
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
129   ret i8 %sel
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
135   ret i8 %sel
138 ; 16 combinations
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
153 ; instead.
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
164   ret void
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
176   ret void
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
188   ret void
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
200   ret void
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
212   ret void
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
224   ret void
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
236   ret void
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
248   ret void
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
260   ret void
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
272   ret void
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
284   ret void
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
296   ret void
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
308   ret void
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
320   ret void
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
332   ret void
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
344   ret void
347 ; 16 combinations
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
370   ret void
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
382   ret void
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
394   ret void
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
406   ret void
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
418   ret void
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
430   ret void
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
442   ret void
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
454   ret void
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
466   ret void
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
478   ret void
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
490   ret void
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
502   ret void
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
514   ret void
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
526   ret void
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
538   ret void
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
550   ret void
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]+}}
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
565   ret void
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]+}}
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
580   ret void
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
593   ret void
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
606   ret void
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
619   ret void
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
632   ret void
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
644   ret void
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
656   ret void
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
668   ret void
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
675 ; VI: v_min_u16
676 ; VI: v_max_u16
677 ; VI: v_min_u16
678 ; VI: v_max_u16
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
697   ret void
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
718   ret void
721 attributes #0 = { nounwind readnone }
722 attributes #1 = { nounwind }
723 attributes #2 = { nounwind readnone alwaysinline }