[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / max3.ll
blob4dc5d484e167316c4fa101311b2ecfeb579e8783
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
5 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i32:
6 ; GCN: v_max3_i32
7 define amdgpu_kernel void @v_test_imax3_sgt_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 sgt i32 %a, %b
17   %i0 = select i1 %icmp0, i32 %a, i32 %b
18   %icmp1 = icmp sgt i32 %i0, %c
19   %i1 = select i1 %icmp1, i32 %i0, i32 %c
20   store i32 %i1, i32 addrspace(1)* %out
21   ret void
24 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i32:
25 ; GCN: v_max3_u32
26 define amdgpu_kernel void @v_test_umax3_ugt_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 ugt i32 %a, %b
36   %i0 = select i1 %icmp0, i32 %a, i32 %b
37   %icmp1 = icmp ugt i32 %i0, %c
38   %i1 = select i1 %icmp1, i32 %i0, i32 %c
39   store i32 %i1, i32 addrspace(1)* %out
40   ret void
43 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i16:
44 ; SI: v_max3_i32
46 ; VI: v_max_i16
47 ; VI: v_max_i16
49 ; GFX9: v_max3_i16
50 define amdgpu_kernel void @v_test_imax3_sgt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 {
51   %tid = call i32 @llvm.amdgcn.workitem.id.x()
52   %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
53   %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid
54   %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid
55   %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
56   %a = load i16, i16 addrspace(1)* %gep0
57   %b = load i16, i16 addrspace(1)* %gep1
58   %c = load i16, i16 addrspace(1)* %gep2
59   %icmp0 = icmp sgt i16 %a, %b
60   %i0 = select i1 %icmp0, i16 %a, i16 %b
61   %icmp1 = icmp sgt i16 %i0, %c
62   %i1 = select i1 %icmp1, i16 %i0, i16 %c
63   store i16 %i1, i16 addrspace(1)* %out
64   ret void
67 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i16:
68 ; SI: v_max3_u32
70 ; VI: v_max_u16
71 ; VI: v_max_u16
73 ; GFX9: v_max3_u16
74 define amdgpu_kernel void @v_test_umax3_ugt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 {
75   %tid = call i32 @llvm.amdgcn.workitem.id.x()
76   %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid
77   %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid
78   %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid
79   %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid
80   %a = load i16, i16 addrspace(1)* %gep0
81   %b = load i16, i16 addrspace(1)* %gep1
82   %c = load i16, i16 addrspace(1)* %gep2
83   %icmp0 = icmp ugt i16 %a, %b
84   %i0 = select i1 %icmp0, i16 %a, i16 %b
85   %icmp1 = icmp ugt i16 %i0, %c
86   %i1 = select i1 %icmp1, i16 %i0, i16 %c
87   store i16 %i1, i16 addrspace(1)* %out
88   ret void
91 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i8:
92 ; SI: v_max3_i32
94 ; VI: v_max_i16
95 ; VI: v_max_i16
97 ; GFX9: v_max3_i16
98 define amdgpu_kernel void @v_test_imax3_sgt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 {
99   %tid = call i32 @llvm.amdgcn.workitem.id.x()
100   %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid
101   %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid
102   %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid
103   %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid
104   %a = load i8, i8 addrspace(1)* %gep0
105   %b = load i8, i8 addrspace(1)* %gep1
106   %c = load i8, i8 addrspace(1)* %gep2
107   %icmp0 = icmp sgt i8 %a, %b
108   %i0 = select i1 %icmp0, i8 %a, i8 %b
109   %icmp1 = icmp sgt i8 %i0, %c
110   %i1 = select i1 %icmp1, i8 %i0, i8 %c
111   store i8 %i1, i8 addrspace(1)* %out
112   ret void
115 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i8:
116 ; SI: v_max3_u32
118 ; VI: v_max_u16
119 ; VI: v_max_u16
121 ; GFX9: v_max3_u16
122 define amdgpu_kernel void @v_test_umax3_ugt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 {
123   %tid = call i32 @llvm.amdgcn.workitem.id.x()
124   %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid
125   %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid
126   %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid
127   %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid
128   %a = load i8, i8 addrspace(1)* %gep0
129   %b = load i8, i8 addrspace(1)* %gep1
130   %c = load i8, i8 addrspace(1)* %gep2
131   %icmp0 = icmp ugt i8 %a, %b
132   %i0 = select i1 %icmp0, i8 %a, i8 %b
133   %icmp1 = icmp ugt i8 %i0, %c
134   %i1 = select i1 %icmp1, i8 %i0, i8 %c
135   store i8 %i1, i8 addrspace(1)* %out
136   ret void
139 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i7:
140 ; SI: v_max3_i32
142 ; VI: v_max_i16
143 ; VI: v_max_i16
145 ; GFX9: v_max3_i16
146 define amdgpu_kernel void @v_test_imax3_sgt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 {
147   %tid = call i32 @llvm.amdgcn.workitem.id.x()
148   %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid
149   %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid
150   %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid
151   %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid
152   %a = load i7, i7 addrspace(1)* %gep0
153   %b = load i7, i7 addrspace(1)* %gep1
154   %c = load i7, i7 addrspace(1)* %gep2
155   %icmp0 = icmp sgt i7 %a, %b
156   %i0 = select i1 %icmp0, i7 %a, i7 %b
157   %icmp1 = icmp sgt i7 %i0, %c
158   %i1 = select i1 %icmp1, i7 %i0, i7 %c
159   store i7 %i1, i7 addrspace(1)* %out
160   ret void
163 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i7:
164 ; SI: v_max3_u32
166 ; VI: v_max_u16
167 ; VI: v_max_u16
169 ; GFX9: v_max3_u16
170 define amdgpu_kernel void @v_test_umax3_ugt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 {
171   %tid = call i32 @llvm.amdgcn.workitem.id.x()
172   %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid
173   %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid
174   %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid
175   %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid
176   %a = load i7, i7 addrspace(1)* %gep0
177   %b = load i7, i7 addrspace(1)* %gep1
178   %c = load i7, i7 addrspace(1)* %gep2
179   %icmp0 = icmp ugt i7 %a, %b
180   %i0 = select i1 %icmp0, i7 %a, i7 %b
181   %icmp1 = icmp ugt i7 %i0, %c
182   %i1 = select i1 %icmp1, i7 %i0, i7 %c
183   store i7 %i1, i7 addrspace(1)* %out
184   ret void
187 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i33:
188 ; GCN-NOT: v_max3
189 define amdgpu_kernel void @v_test_imax3_sgt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 {
190   %tid = call i32 @llvm.amdgcn.workitem.id.x()
191   %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid
192   %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid
193   %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid
194   %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid
195   %a = load i33, i33 addrspace(1)* %gep0
196   %b = load i33, i33 addrspace(1)* %gep1
197   %c = load i33, i33 addrspace(1)* %gep2
198   %icmp0 = icmp sgt i33 %a, %b
199   %i0 = select i1 %icmp0, i33 %a, i33 %b
200   %icmp1 = icmp sgt i33 %i0, %c
201   %i1 = select i1 %icmp1, i33 %i0, i33 %c
202   store i33 %i1, i33 addrspace(1)* %out
203   ret void
206 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i33:
207 ; GCN-NOT: v_max3
208 define amdgpu_kernel void @v_test_umax3_ugt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 {
209   %tid = call i32 @llvm.amdgcn.workitem.id.x()
210   %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid
211   %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid
212   %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid
213   %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid
214   %a = load i33, i33 addrspace(1)* %gep0
215   %b = load i33, i33 addrspace(1)* %gep1
216   %c = load i33, i33 addrspace(1)* %gep2
217   %icmp0 = icmp ugt i33 %a, %b
218   %i0 = select i1 %icmp0, i33 %a, i33 %b
219   %icmp1 = icmp ugt i33 %i0, %c
220   %i1 = select i1 %icmp1, i33 %i0, i33 %c
221   store i33 %i1, i33 addrspace(1)* %out
222   ret void
225 ; GCN-LABEL: {{^}}v_test_imax3_sgt_i64:
226 ; GCN-NOT: v_max3
227 define amdgpu_kernel void @v_test_imax3_sgt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 {
228   %tid = call i32 @llvm.amdgcn.workitem.id.x()
229   %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
230   %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid
231   %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid
232   %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
233   %a = load i64, i64 addrspace(1)* %gep0
234   %b = load i64, i64 addrspace(1)* %gep1
235   %c = load i64, i64 addrspace(1)* %gep2
236   %icmp0 = icmp sgt i64 %a, %b
237   %i0 = select i1 %icmp0, i64 %a, i64 %b
238   %icmp1 = icmp sgt i64 %i0, %c
239   %i1 = select i1 %icmp1, i64 %i0, i64 %c
240   store i64 %i1, i64 addrspace(1)* %out
241   ret void
244 ; GCN-LABEL: {{^}}v_test_umax3_ugt_i64:
245 ; GCN-NOT: v_max3
246 define amdgpu_kernel void @v_test_umax3_ugt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 {
247   %tid = call i32 @llvm.amdgcn.workitem.id.x()
248   %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid
249   %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid
250   %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid
251   %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
252   %a = load i64, i64 addrspace(1)* %gep0
253   %b = load i64, i64 addrspace(1)* %gep1
254   %c = load i64, i64 addrspace(1)* %gep2
255   %icmp0 = icmp ugt i64 %a, %b
256   %i0 = select i1 %icmp0, i64 %a, i64 %b
257   %icmp1 = icmp ugt i64 %i0, %c
258   %i1 = select i1 %icmp1, i64 %i0, i64 %c
259   store i64 %i1, i64 addrspace(1)* %out
260   ret void
263 declare i32 @llvm.amdgcn.workitem.id.x() #1
265 attributes #0 = { nounwind }
266 attributes #1 = { nounwind readnone speculatable }