[InstCombine] Signed saturation tests. NFC
[llvm-core.git] / test / Transforms / ConstProp / avx512.ll
blob7043c23315cd6d8c249eed227134b1ad9a5e250b
1 ; RUN: opt < %s -constprop -S | FileCheck %s
2 ; REQUIRES: x86-registered-target
4 define i1 @test_avx512_cvts_exact() nounwind readnone {
5 ; CHECK-LABEL: @test_avx512_cvts_exact(
6 ; CHECK-NOT: call
7 ; CHECK: ret i1 true
8 entry:
9   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2si32(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
10   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
11   %i2 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double 7.0, double undef>, i32 4) nounwind
12   %i3 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> <double 7.0, double undef>, i32 4) nounwind
13   %sum02 = add i32 %i0, %i2
14   %sum13 = add i64 %i1, %i3
15   %cmp02 = icmp eq i32 %sum02, 10
16   %cmp13 = icmp eq i64 %sum13, 10
17   %b = and i1 %cmp02, %cmp13
18   ret i1 %b
21 define i1 @test_avx512_cvts_exact_max() nounwind readnone {
22 ; CHECK-LABEL: @test_avx512_cvts_exact_max(
23 ; CHECK-NOT: call
24 ; CHECK: ret i1 true
25 entry:
26   %i0 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double 2147483647.0, double undef>, i32 4) nounwind
27   %b = icmp eq i32 %i0, 2147483647
28   ret i1 %b
31 define i1 @test_avx512_cvts_exact_max_p1() nounwind readnone {
32 ; CHECK-LABEL: @test_avx512_cvts_exact_max_p1(
33 ; CHECK: call
34 entry:
35   %i0 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double 2147483648.0, double undef>, i32 4) nounwind
36   %b = icmp eq i32 %i0, 2147483648
37   ret i1 %b
40 define i1 @test_avx512_cvts_exact_neg_max() nounwind readnone {
41 ; CHECK-LABEL: @test_avx512_cvts_exact_neg_max(
42 ; CHECK-NOT: call
43 ; CHECK: ret i1 true
44 entry:
45   %i0 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double -2147483648.0, double undef>, i32 4) nounwind
46   %b = icmp eq i32 %i0, -2147483648
47   ret i1 %b
50 define i1 @test_avx512_cvts_exact_neg_max_p1() nounwind readnone {
51 ; CHECK-LABEL: @test_avx512_cvts_exact_neg_max_p1(
52 ; CHECK: call
53 entry:
54   %i0 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double -2147483649.0, double undef>, i32 4) nounwind
55   %b = icmp eq i32 %i0, -2147483649
56   ret i1 %b
59 ; Inexact values should not fold as they are dependent on rounding mode
60 define i1 @test_avx512_cvts_inexact() nounwind readnone {
61 ; CHECK-LABEL: @test_avx512_cvts_inexact(
62 ; CHECK: call
63 ; CHECK: call
64 ; CHECK: call
65 ; CHECK: call
66 entry:
67   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2si32(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
68   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
69   %i2 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> <double 1.75, double undef>, i32 4) nounwind
70   %i3 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> <double 1.75, double undef>, i32 4) nounwind
71   %sum02 = add i32 %i0, %i2
72   %sum13 = add i64 %i1, %i3
73   %cmp02 = icmp eq i32 %sum02, 4
74   %cmp13 = icmp eq i64 %sum13, 4
75   %b = and i1 %cmp02, %cmp13
76   ret i1 %b
79 ; FLT_MAX/DBL_MAX should not fold
80 define i1 @test_avx512_cvts_max() nounwind readnone {
81 ; CHECK-LABEL: @test_avx512_cvts_max(
82 ; CHECK: call
83 ; CHECK: call
84 ; CHECK: call
85 ; CHECK: call
86 entry:
87   %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
88   %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
89   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2si32(<4 x float> %fm, i32 4) nounwind
90   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %fm, i32 4) nounwind
91   %i2 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> %dm, i32 4) nounwind
92   %i3 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %dm, i32 4) nounwind
93   %sum02 = add i32 %i0, %i2
94   %sum13 = add i64 %i1, %i3
95   %sum02.sext = sext i32 %sum02 to i64
96   %b = icmp eq i64 %sum02.sext, %sum13
97   ret i1 %b
100 ; INF should not fold
101 define i1 @test_avx512_cvts_inf() nounwind readnone {
102 ; CHECK-LABEL: @test_avx512_cvts_inf(
103 ; CHECK: call
104 ; CHECK: call
105 ; CHECK: call
106 ; CHECK: call
107 entry:
108   %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
109   %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
110   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2si32(<4 x float> %fm, i32 4) nounwind
111   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %fm, i32 4) nounwind
112   %i2 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> %dm, i32 4) nounwind
113   %i3 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %dm, i32 4) nounwind
114   %sum02 = add i32 %i0, %i2
115   %sum13 = add i64 %i1, %i3
116   %sum02.sext = sext i32 %sum02 to i64
117   %b = icmp eq i64 %sum02.sext, %sum13
118   ret i1 %b
121 ; NAN should not fold
122 define i1 @test_avx512_cvts_nan() nounwind readnone {
123 ; CHECK-LABEL: @test_avx512_cvts_nan(
124 ; CHECK: call
125 ; CHECK: call
126 ; CHECK: call
127 ; CHECK: call
128 entry:
129   %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
130   %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
131   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2si32(<4 x float> %fm, i32 4) nounwind
132   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %fm, i32 4) nounwind
133   %i2 = call i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double> %dm, i32 4) nounwind
134   %i3 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %dm, i32 4) nounwind
135   %sum02 = add i32 %i0, %i2
136   %sum13 = add i64 %i1, %i3
137   %sum02.sext = sext i32 %sum02 to i64
138   %b = icmp eq i64 %sum02.sext, %sum13
139   ret i1 %b
142 define i1 @test_avx512_cvtts_exact() nounwind readnone {
143 ; CHECK-LABEL: @test_avx512_cvtts_exact(
144 ; CHECK-NOT: call
145 ; CHECK: ret i1 true
146 entry:
147   %i0 = tail call i32 @llvm.x86.avx512.cvttss2si(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
148   %i1 = tail call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
149   %i2 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> <double 7.0, double undef>, i32 4) nounwind
150   %i3 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> <double 7.0, double undef>, i32 4) nounwind
151   %sum02 = add i32 %i0, %i2
152   %sum13 = add i64 %i1, %i3
153   %cmp02 = icmp eq i32 %sum02, 10
154   %cmp13 = icmp eq i64 %sum13, 10
155   %b = and i1 %cmp02, %cmp13
156   ret i1 %b
159 define i1 @test_avx512_cvtts_inexact() nounwind readnone {
160 ; CHECK-LABEL: @test_avx512_cvtts_inexact(
161 ; CHECK-NOT: call
162 ; CHECK: ret i1 true
163 entry:
164   %i0 = tail call i32 @llvm.x86.avx512.cvttss2si(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
165   %i1 = tail call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
166   %i2 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> <double 1.75, double undef>, i32 4) nounwind
167   %i3 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> <double 1.75, double undef>, i32 4) nounwind
168   %sum02 = add i32 %i0, %i2
169   %sum13 = add i64 %i1, %i3
170   %cmp02 = icmp eq i32 %sum02, 2
171   %cmp13 = icmp eq i64 %sum13, 2
172   %b = and i1 %cmp02, %cmp13
173   ret i1 %b
176 ; FLT_MAX/DBL_MAX should not fold
177 define i1 @test_avx512_cvtts_max() nounwind readnone {
178 ; CHECK-LABEL: @test_avx512_cvtts_max(
179 ; CHECK: call
180 ; CHECK: call
181 ; CHECK: call
182 ; CHECK: call
183 entry:
184   %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
185   %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
186   %i0 = tail call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %fm, i32 4) nounwind
187   %i1 = tail call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %fm, i32 4) nounwind
188   %i2 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %dm, i32 4) nounwind
189   %i3 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %dm, i32 4) nounwind
190   %sum02 = add i32 %i0, %i2
191   %sum13 = add i64 %i1, %i3
192   %sum02.sext = sext i32 %sum02 to i64
193   %b = icmp eq i64 %sum02.sext, %sum13
194   ret i1 %b
197 ; INF should not fold
198 define i1 @test_avx512_cvtts_inf() nounwind readnone {
199 ; CHECK-LABEL: @test_avx512_cvtts_inf(
200 ; CHECK: call
201 ; CHECK: call
202 ; CHECK: call
203 ; CHECK: call
204 entry:
205   %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
206   %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
207   %i0 = tail call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %fm, i32 4) nounwind
208   %i1 = tail call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %fm, i32 4) nounwind
209   %i2 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %dm, i32 4) nounwind
210   %i3 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %dm, i32 4) nounwind
211   %sum02 = add i32 %i0, %i2
212   %sum13 = add i64 %i1, %i3
213   %sum02.sext = sext i32 %sum02 to i64
214   %b = icmp eq i64 %sum02.sext, %sum13
215   ret i1 %b
218 ; NAN should not fold
219 define i1 @test_avx512_cvtts_nan() nounwind readnone {
220 ; CHECK-LABEL: @test_avx512_cvtts_nan(
221 ; CHECK: call
222 ; CHECK: call
223 ; CHECK: call
224 ; CHECK: call
225 entry:
226   %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
227   %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
228   %i0 = tail call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %fm, i32 4) nounwind
229   %i1 = tail call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %fm, i32 4) nounwind
230   %i2 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %dm, i32 4) nounwind
231   %i3 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %dm, i32 4) nounwind
232   %sum02 = add i32 %i0, %i2
233   %sum13 = add i64 %i1, %i3
234   %sum02.sext = sext i32 %sum02 to i64
235   %b = icmp eq i64 %sum02.sext, %sum13
236   ret i1 %b
239 define i1 @test_avx512_cvtu_exact() nounwind readnone {
240 ; CHECK-LABEL: @test_avx512_cvtu_exact(
241 ; CHECK-NOT: call
242 ; CHECK: ret i1 true
243 entry:
244   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
245   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
246   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> <double 7.0, double undef>, i32 4) nounwind
247   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> <double 7.0, double undef>, i32 4) nounwind
248   %sum02 = add i32 %i0, %i2
249   %sum13 = add i64 %i1, %i3
250   %cmp02 = icmp eq i32 %sum02, 10
251   %cmp13 = icmp eq i64 %sum13, 10
252   %b = and i1 %cmp02, %cmp13
253   ret i1 %b
256 ; Negative values should not fold as they can't be represented in an unsigned int.
257 define i1 @test_avx512_cvtu_neg() nounwind readnone {
258 ; CHECK-LABEL: @test_avx512_cvtu_neg(
259 ; CHECK: call
260 ; CHECK: call
261 ; CHECK: call
262 ; CHECK: call
263 entry:
264   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> <float -3.0, float undef, float undef, float undef>, i32 4) nounwind
265   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> <float -3.0, float undef, float undef, float undef>, i32 4) nounwind
266   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> <double -7.0, double undef>, i32 4) nounwind
267   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> <double -7.0, double undef>, i32 4) nounwind
268   %sum02 = add i32 %i0, %i2
269   %sum13 = add i64 %i1, %i3
270   %cmp02 = icmp eq i32 %sum02, -10
271   %cmp13 = icmp eq i64 %sum13, -10
272   %b = and i1 %cmp02, %cmp13
273   ret i1 %b
276 define i1 @test_avx512_cvtu_exact_max() nounwind readnone {
277 ; CHECK-LABEL: @test_avx512_cvtu_exact_max(
278 ; CHECK-NOT: call
279 ; CHECK: ret i1 true
280 entry:
281   %i0 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> <double 4294967295.0, double undef>, i32 4) nounwind
282   %b = icmp eq i32 %i0, 4294967295
283   ret i1 %b
286 define i1 @test_avx512_cvtu_exact_max_p1() nounwind readnone {
287 ; CHECK-LABEL: @test_avx512_cvtu_exact_max_p1(
288 ; CHECK: call
289 entry:
290   %i0 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> <double 4294967296.0, double undef>, i32 4) nounwind
291   %b = icmp eq i32 %i0, 4294967296
292   ret i1 %b
295 ; Inexact values should not fold as they are dependent on rounding mode
296 define i1 @test_avx512_cvtu_inexact() nounwind readnone {
297 ; CHECK-LABEL: @test_avx512_cvtu_inexact(
298 ; CHECK: call
299 ; CHECK: call
300 ; CHECK: call
301 ; CHECK: call
302 entry:
303   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
304   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
305   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> <double 1.75, double undef>, i32 4) nounwind
306   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> <double 1.75, double undef>, i32 4) nounwind
307   %sum02 = add i32 %i0, %i2
308   %sum13 = add i64 %i1, %i3
309   %cmp02 = icmp eq i32 %sum02, 4
310   %cmp13 = icmp eq i64 %sum13, 4
311   %b = and i1 %cmp02, %cmp13
312   ret i1 %b
315 ; FLT_MAX/DBL_MAX should not fold
316 define i1 @test_avx512_cvtu_max() nounwind readnone {
317 ; CHECK-LABEL: @test_avx512_cvtu_max(
318 ; CHECK: call
319 ; CHECK: call
320 ; CHECK: call
321 ; CHECK: call
322 entry:
323   %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
324   %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
325   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> %fm, i32 4) nounwind
326   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %fm, i32 4) nounwind
327   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> %dm, i32 4) nounwind
328   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %dm, i32 4) nounwind
329   %sum02 = add i32 %i0, %i2
330   %sum13 = add i64 %i1, %i3
331   %sum02.sext = sext i32 %sum02 to i64
332   %b = icmp eq i64 %sum02.sext, %sum13
333   ret i1 %b
336 ; INF should not fold
337 define i1 @test_avx512_cvtu_inf() nounwind readnone {
338 ; CHECK-LABEL: @test_avx512_cvtu_inf(
339 ; CHECK: call
340 ; CHECK: call
341 ; CHECK: call
342 ; CHECK: call
343 entry:
344   %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
345   %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
346   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> %fm, i32 4) nounwind
347   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %fm, i32 4) nounwind
348   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> %dm, i32 4) nounwind
349   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %dm, i32 4) nounwind
350   %sum02 = add i32 %i0, %i2
351   %sum13 = add i64 %i1, %i3
352   %sum02.sext = sext i32 %sum02 to i64
353   %b = icmp eq i64 %sum02.sext, %sum13
354   ret i1 %b
357 ; NAN should not fold
358 define i1 @test_avx512_cvtu_nan() nounwind readnone {
359 ; CHECK-LABEL: @test_avx512_cvtu_nan(
360 ; CHECK: call
361 ; CHECK: call
362 ; CHECK: call
363 ; CHECK: call
364 entry:
365   %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
366   %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
367   %i0 = tail call i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float> %fm, i32 4) nounwind
368   %i1 = tail call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %fm, i32 4) nounwind
369   %i2 = call i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double> %dm, i32 4) nounwind
370   %i3 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %dm, i32 4) nounwind
371   %sum02 = add i32 %i0, %i2
372   %sum13 = add i64 %i1, %i3
373   %sum02.sext = sext i32 %sum02 to i64
374   %b = icmp eq i64 %sum02.sext, %sum13
375   ret i1 %b
378 define i1 @test_avx512_cvttu_exact() nounwind readnone {
379 ; CHECK-LABEL: @test_avx512_cvttu_exact(
380 ; CHECK-NOT: call
381 ; CHECK: ret i1 true
382 entry:
383   %i0 = tail call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
384   %i1 = tail call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> <float 3.0, float undef, float undef, float undef>, i32 4) nounwind
385   %i2 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> <double 7.0, double undef>, i32 4) nounwind
386   %i3 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> <double 7.0, double undef>, i32 4) nounwind
387   %sum02 = add i32 %i0, %i2
388   %sum13 = add i64 %i1, %i3
389   %cmp02 = icmp eq i32 %sum02, 10
390   %cmp13 = icmp eq i64 %sum13, 10
391   %b = and i1 %cmp02, %cmp13
392   ret i1 %b
395 define i1 @test_avx512_cvttu_inexact() nounwind readnone {
396 ; CHECK-LABEL: @test_avx512_cvttu_inexact(
397 ; CHECK-NOT: call
398 ; CHECK: ret i1 true
399 entry:
400   %i0 = tail call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
401   %i1 = tail call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> <float 1.75, float undef, float undef, float undef>, i32 4) nounwind
402   %i2 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> <double 1.75, double undef>, i32 4) nounwind
403   %i3 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> <double 1.75, double undef>, i32 4) nounwind
404   %sum02 = add i32 %i0, %i2
405   %sum13 = add i64 %i1, %i3
406   %cmp02 = icmp eq i32 %sum02, 2
407   %cmp13 = icmp eq i64 %sum13, 2
408   %b = and i1 %cmp02, %cmp13
409   ret i1 %b
412 ; FLT_MAX/DBL_MAX should not fold
413 define i1 @test_avx512_cvttu_max() nounwind readnone {
414 ; CHECK-LABEL: @test_avx512_cvttu_max(
415 ; CHECK: call
416 ; CHECK: call
417 ; CHECK: call
418 ; CHECK: call
419 entry:
420   %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
421   %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
422   %i0 = tail call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %fm, i32 4) nounwind
423   %i1 = tail call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %fm, i32 4) nounwind
424   %i2 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %dm, i32 4) nounwind
425   %i3 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %dm, i32 4) nounwind
426   %sum02 = add i32 %i0, %i2
427   %sum13 = add i64 %i1, %i3
428   %sum02.sext = sext i32 %sum02 to i64
429   %b = icmp eq i64 %sum02.sext, %sum13
430   ret i1 %b
433 ; INF should not fold
434 define i1 @test_avx512_cvttu_inf() nounwind readnone {
435 ; CHECK-LABEL: @test_avx512_cvttu_inf(
436 ; CHECK: call
437 ; CHECK: call
438 ; CHECK: call
439 ; CHECK: call
440 entry:
441   %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
442   %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
443   %i0 = tail call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %fm, i32 4) nounwind
444   %i1 = tail call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %fm, i32 4) nounwind
445   %i2 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %dm, i32 4) nounwind
446   %i3 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %dm, i32 4) nounwind
447   %sum02 = add i32 %i0, %i2
448   %sum13 = add i64 %i1, %i3
449   %sum02.sext = sext i32 %sum02 to i64
450   %b = icmp eq i64 %sum02.sext, %sum13
451   ret i1 %b
454 ; NAN should not fold
455 define i1 @test_avx512_cvttu_nan() nounwind readnone {
456 ; CHECK-LABEL: @test_avx512_cvttu_nan(
457 ; CHECK: call
458 ; CHECK: call
459 ; CHECK: call
460 ; CHECK: call
461 entry:
462   %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
463   %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
464   %i0 = tail call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %fm, i32 4) nounwind
465   %i1 = tail call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %fm, i32 4) nounwind
466   %i2 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %dm, i32 4) nounwind
467   %i3 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %dm, i32 4) nounwind
468   %sum02 = add i32 %i0, %i2
469   %sum13 = add i64 %i1, %i3
470   %sum02.sext = sext i32 %sum02 to i64
471   %b = icmp eq i64 %sum02.sext, %sum13
472   ret i1 %b
475 declare i32 @llvm.x86.avx512.vcvtss2si32(<4 x float>, i32) nounwind readnone
476 declare i32 @llvm.x86.avx512.cvttss2si(<4 x float>, i32) nounwind readnone
477 declare i64 @llvm.x86.avx512.vcvtss2si64(<4 x float>, i32) nounwind readnone
478 declare i64 @llvm.x86.avx512.cvttss2si64(<4 x float>, i32) nounwind readnone
479 declare i32 @llvm.x86.avx512.vcvtsd2si32(<2 x double>, i32) nounwind readnone
480 declare i32 @llvm.x86.avx512.cvttsd2si(<2 x double>, i32) nounwind readnone
481 declare i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double>, i32) nounwind readnone
482 declare i64 @llvm.x86.avx512.cvttsd2si64(<2 x double>, i32) nounwind readnone
483 declare i32 @llvm.x86.avx512.vcvtss2usi32(<4 x float>, i32) nounwind readnone
484 declare i32 @llvm.x86.avx512.cvttss2usi(<4 x float>, i32) nounwind readnone
485 declare i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float>, i32) nounwind readnone
486 declare i64 @llvm.x86.avx512.cvttss2usi64(<4 x float>, i32) nounwind readnone
487 declare i32 @llvm.x86.avx512.vcvtsd2usi32(<2 x double>, i32) nounwind readnone
488 declare i32 @llvm.x86.avx512.cvttsd2usi(<2 x double>, i32) nounwind readnone
489 declare i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double>, i32) nounwind readnone
490 declare i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double>, i32) nounwind readnone