1; RUN: llc -march=amdgcn < %s | FileCheck -check-prefixes=GCN,SI %s
2; RUN: llc -march=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,VI %s
3; RUN: llc -march=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s
4
5; GCN-LABEL: {{^}}v_test_imin3_slt_i32:
6; GCN: v_min3_i32
7define amdgpu_kernel void @v_test_imin3_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 {
8  %tid = call i32 @llvm.amdgcn.workitem.id.x()
9  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
10  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
11  %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid
12  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
13  %a = load i32, i32 addrspace(1)* %gep0
14  %b = load i32, i32 addrspace(1)* %gep1
15  %c = load i32, i32 addrspace(1)* %gep2
16  %icmp0 = icmp slt i32 %a, %b
17  %i0 = select i1 %icmp0, i32 %a, i32 %b
18  %icmp1 = icmp slt i32 %i0, %c
19  %i1 = select i1 %icmp1, i32 %i0, i32 %c
20  store i32 %i1, i32 addrspace(1)* %outgep
21  ret void
22}
23
24; GCN-LABEL: {{^}}v_test_umin3_ult_i32:
25; GCN: v_min3_u32
26define amdgpu_kernel void @v_test_umin3_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 {
27  %tid = call i32 @llvm.amdgcn.workitem.id.x()
28  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
29  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
30  %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid
31  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
32  %a = load i32, i32 addrspace(1)* %gep0
33  %b = load i32, i32 addrspace(1)* %gep1
34  %c = load i32, i32 addrspace(1)* %gep2
35  %icmp0 = icmp ult i32 %a, %b
36  %i0 = select i1 %icmp0, i32 %a, i32 %b
37  %icmp1 = icmp ult i32 %i0, %c
38  %i1 = select i1 %icmp1, i32 %i0, i32 %c
39  store i32 %i1, i32 addrspace(1)* %outgep
40  ret void
41}
42
43; GCN-LABEL: {{^}}v_test_umin_umin_umin:
44; GCN: v_min_i32
45; GCN: v_min3_i32
46define amdgpu_kernel void @v_test_umin_umin_umin(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 {
47  %tid = call i32 @llvm.amdgcn.workitem.id.x()
48  %tid2 = mul i32 %tid, 2
49  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
50  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
51  %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid
52
53  %gep3 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid2
54  %gep4 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid2
55  %gep5 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid2
56
57  %outgep0 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
58  %outgep1 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid2
59
60  %a = load i32, i32 addrspace(1)* %gep0
61  %b = load i32, i32 addrspace(1)* %gep1
62  %c = load i32, i32 addrspace(1)* %gep2
63  %d = load i32, i32 addrspace(1)* %gep3
64
65  %icmp0 = icmp slt i32 %a, %b
66  %i0 = select i1 %icmp0, i32 %a, i32 %b
67
68  %icmp1 = icmp slt i32 %c, %d
69  %i1 = select i1 %icmp1, i32 %c, i32 %d
70
71  %icmp2 = icmp slt i32 %i0, %i1
72  %i2 = select i1 %icmp2, i32 %i0, i32 %i1
73
74  store i32 %i2, i32 addrspace(1)* %outgep1
75  ret void
76}
77
78; GCN-LABEL: {{^}}v_test_umin3_2_uses:
79; GCN-NOT: v_min3
80define amdgpu_kernel void @v_test_umin3_2_uses(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 {
81  %tid = call i32 @llvm.amdgcn.workitem.id.x()
82  %tid2 = mul i32 %tid, 2
83  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
84  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
85  %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid
86
87  %gep3 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid2
88  %gep4 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid2
89  %gep5 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid2
90
91  %outgep0 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
92  %outgep1 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid2
93
94  %a = load i32, i32 addrspace(1)* %gep0
95  %b = load i32, i32 addrspace(1)* %gep1
96  %c = load i32, i32 addrspace(1)* %gep2
97  %d = load i32, i32 addrspace(1)* %gep3
98
99  %icmp0 = icmp slt i32 %a, %b
100  %i0 = select i1 %icmp0, i32 %a, i32 %b
101
102  %icmp1 = icmp slt i32 %c, %d
103  %i1 = select i1 %icmp1, i32 %c, i32 %d
104
105  %icmp2 = icmp slt i32 %i0, %c
106  %i2 = select i1 %icmp2, i32 %i0, i32 %c
107
108  store i32 %i2, i32 addrspace(1)* %outgep0
109  store i32 %i0, i32 addrspace(1)* %outgep1
110  ret void
111}
112
113; GCN-LABEL: {{^}}v_test_imin3_slt_i16:
114; SI: v_min3_i32
115
116; VI: v_min_i16
117; VI: v_min_i16
118
119; GFX9: v_min3_i16
120define amdgpu_kernel void @v_test_imin3_slt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 {
121  %tid = call i32 @llvm.amdgcn.workitem.id.x()
122  %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
123  %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid
124  %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid
125  %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
126  %a = load i16, i16 addrspace(1)* %gep0
127  %b = load i16, i16 addrspace(1)* %gep1
128  %c = load i16, i16 addrspace(1)* %gep2
129  %icmp0 = icmp slt i16 %a, %b
130  %i0 = select i1 %icmp0, i16 %a, i16 %b
131  %icmp1 = icmp slt i16 %i0, %c
132  %i1 = select i1 %icmp1, i16 %i0, i16 %c
133  store i16 %i1, i16 addrspace(1)* %outgep
134  ret void
135}
136
137; GCN-LABEL: {{^}}v_test_umin3_ult_i16:
138; SI: v_min3_u32
139
140; VI: v_min_u16
141; VI: v_min_u16
142
143; GFX9: v_min3_u16
144define amdgpu_kernel void @v_test_umin3_ult_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 {
145  %tid = call i32 @llvm.amdgcn.workitem.id.x()
146  %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
147  %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid
148  %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid
149  %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
150  %a = load i16, i16 addrspace(1)* %gep0
151  %b = load i16, i16 addrspace(1)* %gep1
152  %c = load i16, i16 addrspace(1)* %gep2
153  %icmp0 = icmp ult i16 %a, %b
154  %i0 = select i1 %icmp0, i16 %a, i16 %b
155  %icmp1 = icmp ult i16 %i0, %c
156  %i1 = select i1 %icmp1, i16 %i0, i16 %c
157  store i16 %i1, i16 addrspace(1)* %outgep
158  ret void
159}
160
161; GCN-LABEL: {{^}}v_test_imin3_slt_i8:
162; SI: v_min3_i32
163
164; VI: v_min_i16
165; VI: v_min_i16
166
167; GFX9: v_min3_i16
168define amdgpu_kernel void @v_test_imin3_slt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 {
169  %tid = call i32 @llvm.amdgcn.workitem.id.x()
170  %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid
171  %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid
172  %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid
173  %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid
174  %a = load i8, i8 addrspace(1)* %gep0
175  %b = load i8, i8 addrspace(1)* %gep1
176  %c = load i8, i8 addrspace(1)* %gep2
177  %icmp0 = icmp slt i8 %a, %b
178  %i0 = select i1 %icmp0, i8 %a, i8 %b
179  %icmp1 = icmp slt i8 %i0, %c
180  %i1 = select i1 %icmp1, i8 %i0, i8 %c
181  store i8 %i1, i8 addrspace(1)* %outgep
182  ret void
183}
184
185; GCN-LABEL: {{^}}v_test_umin3_ult_i8:
186; SI: v_min3_u32
187
188; VI: v_min_u16
189; VI: v_min_u16
190
191; GFX9: v_min3_u16
192define amdgpu_kernel void @v_test_umin3_ult_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 {
193  %tid = call i32 @llvm.amdgcn.workitem.id.x()
194  %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid
195  %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid
196  %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid
197  %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid
198  %a = load i8, i8 addrspace(1)* %gep0
199  %b = load i8, i8 addrspace(1)* %gep1
200  %c = load i8, i8 addrspace(1)* %gep2
201  %icmp0 = icmp ult i8 %a, %b
202  %i0 = select i1 %icmp0, i8 %a, i8 %b
203  %icmp1 = icmp ult i8 %i0, %c
204  %i1 = select i1 %icmp1, i8 %i0, i8 %c
205  store i8 %i1, i8 addrspace(1)* %outgep
206  ret void
207}
208
209; GCN-LABEL: {{^}}v_test_imin3_slt_i7:
210; SI: v_min3_i32
211
212; VI: v_min_i16
213; VI: v_min_i16
214
215; GFX9: v_min3_i16
216define amdgpu_kernel void @v_test_imin3_slt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 {
217  %tid = call i32 @llvm.amdgcn.workitem.id.x()
218  %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid
219  %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid
220  %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid
221  %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid
222  %a = load i7, i7 addrspace(1)* %gep0
223  %b = load i7, i7 addrspace(1)* %gep1
224  %c = load i7, i7 addrspace(1)* %gep2
225  %icmp0 = icmp slt i7 %a, %b
226  %i0 = select i1 %icmp0, i7 %a, i7 %b
227  %icmp1 = icmp slt i7 %i0, %c
228  %i1 = select i1 %icmp1, i7 %i0, i7 %c
229  store i7 %i1, i7 addrspace(1)* %outgep
230  ret void
231}
232
233; GCN-LABEL: {{^}}v_test_umin3_ult_i7:
234; SI: v_min3_u32
235
236; VI: v_min_u16
237; VI: v_min_u16
238
239; GFX9: v_min3_u16
240define amdgpu_kernel void @v_test_umin3_ult_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 {
241  %tid = call i32 @llvm.amdgcn.workitem.id.x()
242  %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid
243  %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid
244  %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid
245  %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid
246  %a = load i7, i7 addrspace(1)* %gep0
247  %b = load i7, i7 addrspace(1)* %gep1
248  %c = load i7, i7 addrspace(1)* %gep2
249  %icmp0 = icmp ult i7 %a, %b
250  %i0 = select i1 %icmp0, i7 %a, i7 %b
251  %icmp1 = icmp ult i7 %i0, %c
252  %i1 = select i1 %icmp1, i7 %i0, i7 %c
253  store i7 %i1, i7 addrspace(1)* %outgep
254  ret void
255}
256
257; GCN-LABEL: {{^}}v_test_imin3_slt_i33:
258; GCN-NOT: v_min3
259define amdgpu_kernel void @v_test_imin3_slt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 {
260  %tid = call i32 @llvm.amdgcn.workitem.id.x()
261  %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid
262  %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid
263  %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid
264  %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid
265  %a = load i33, i33 addrspace(1)* %gep0
266  %b = load i33, i33 addrspace(1)* %gep1
267  %c = load i33, i33 addrspace(1)* %gep2
268  %icmp0 = icmp slt i33 %a, %b
269  %i0 = select i1 %icmp0, i33 %a, i33 %b
270  %icmp1 = icmp slt i33 %i0, %c
271  %i1 = select i1 %icmp1, i33 %i0, i33 %c
272  store i33 %i1, i33 addrspace(1)* %outgep
273  ret void
274}
275
276; GCN-LABEL: {{^}}v_test_umin3_ult_i33:
277; GCN-NOT: v_min3
278define amdgpu_kernel void @v_test_umin3_ult_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 {
279  %tid = call i32 @llvm.amdgcn.workitem.id.x()
280  %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid
281  %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid
282  %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid
283  %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid
284  %a = load i33, i33 addrspace(1)* %gep0
285  %b = load i33, i33 addrspace(1)* %gep1
286  %c = load i33, i33 addrspace(1)* %gep2
287  %icmp0 = icmp ult i33 %a, %b
288  %i0 = select i1 %icmp0, i33 %a, i33 %b
289  %icmp1 = icmp ult i33 %i0, %c
290  %i1 = select i1 %icmp1, i33 %i0, i33 %c
291  store i33 %i1, i33 addrspace(1)* %outgep
292  ret void
293}
294
295; GCN-LABEL: {{^}}v_test_imin3_slt_i64:
296; GCN-NOT: v_min3
297define amdgpu_kernel void @v_test_imin3_slt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 {
298  %tid = call i32 @llvm.amdgcn.workitem.id.x()
299  %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
300  %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid
301  %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid
302  %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
303  %a = load i64, i64 addrspace(1)* %gep0
304  %b = load i64, i64 addrspace(1)* %gep1
305  %c = load i64, i64 addrspace(1)* %gep2
306  %icmp0 = icmp slt i64 %a, %b
307  %i0 = select i1 %icmp0, i64 %a, i64 %b
308  %icmp1 = icmp slt i64 %i0, %c
309  %i1 = select i1 %icmp1, i64 %i0, i64 %c
310  store i64 %i1, i64 addrspace(1)* %outgep
311  ret void
312}
313
314; GCN-LABEL: {{^}}v_test_umin3_ult_i64:
315; GCN-NOT: v_min3
316define amdgpu_kernel void @v_test_umin3_ult_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 {
317  %tid = call i32 @llvm.amdgcn.workitem.id.x()
318  %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
319  %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid
320  %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid
321  %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
322  %a = load i64, i64 addrspace(1)* %gep0
323  %b = load i64, i64 addrspace(1)* %gep1
324  %c = load i64, i64 addrspace(1)* %gep2
325  %icmp0 = icmp ult i64 %a, %b
326  %i0 = select i1 %icmp0, i64 %a, i64 %b
327  %icmp1 = icmp ult i64 %i0, %c
328  %i1 = select i1 %icmp1, i64 %i0, i64 %c
329  store i64 %i1, i64 addrspace(1)* %outgep
330  ret void
331}
332
333declare i32 @llvm.amdgcn.workitem.id.x() #1
334
335attributes #0 = { nounwind }
336attributes #1 = { nounwind readnone speculatable }
337