[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / poison-ops.ll
blob3cd2ceb125ce84f767225c1e93b53684179c5783
1 ; NOTE: This test case is borrowed from undef-ops.ll
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
4 define i32 @add_poison_rhs(i32 %x) {
5 ; CHECK-LABEL: add_poison_rhs:
6 ; CHECK:       # %bb.0:
7 ; CHECK-NEXT:    retq
8   %r = add i32 %x, poison
9   ret i32 %r
12 define <4 x i32> @add_poison_rhs_vec(<4 x i32> %x) {
13 ; CHECK-LABEL: add_poison_rhs_vec:
14 ; CHECK:       # %bb.0:
15 ; CHECK-NEXT:    retq
16   %r = add <4 x i32> %x, poison
17   ret <4 x i32> %r
20 define i32 @add_poison_lhs(i32 %x) {
21 ; CHECK-LABEL: add_poison_lhs:
22 ; CHECK:       # %bb.0:
23 ; CHECK-NEXT:    retq
24   %r = add i32 poison, %x
25   ret i32 %r
28 define <4 x i32> @add_poison_lhs_vec(<4 x i32> %x) {
29 ; CHECK-LABEL: add_poison_lhs_vec:
30 ; CHECK:       # %bb.0:
31 ; CHECK-NEXT:    retq
32   %r = add <4 x i32> poison, %x
33   ret <4 x i32> %r
36 define i32 @sub_poison_rhs(i32 %x) {
37 ; CHECK-LABEL: sub_poison_rhs:
38 ; CHECK:       # %bb.0:
39 ; CHECK-NEXT:    retq
40   %r = sub i32 %x, poison
41   ret i32 %r
44 define <4 x i32> @sub_poison_rhs_vec(<4 x i32> %x) {
45 ; CHECK-LABEL: sub_poison_rhs_vec:
46 ; CHECK:       # %bb.0:
47 ; CHECK-NEXT:    retq
48   %r = sub <4 x i32> %x, poison
49   ret <4 x i32> %r
52 define i32 @sub_poison_lhs(i32 %x) {
53 ; CHECK-LABEL: sub_poison_lhs:
54 ; CHECK:       # %bb.0:
55 ; CHECK-NEXT:    retq
56   %r = sub i32 poison, %x
57   ret i32 %r
60 define <4 x i32> @sub_poison_lhs_vec(<4 x i32> %x) {
61 ; CHECK-LABEL: sub_poison_lhs_vec:
62 ; CHECK:       # %bb.0:
63 ; CHECK-NEXT:    retq
64   %r = sub <4 x i32> poison, %x
65   ret <4 x i32> %r
68 define i32 @mul_poison_rhs(i32 %x) {
69 ; CHECK-LABEL: mul_poison_rhs:
70 ; CHECK:       # %bb.0:
71 ; CHECK-NEXT:    xorl %eax, %eax
72 ; CHECK-NEXT:    retq
73   %r = mul i32 %x, poison
74   ret i32 %r
77 define <4 x i32> @mul_poison_rhs_vec(<4 x i32> %x) {
78 ; CHECK-LABEL: mul_poison_rhs_vec:
79 ; CHECK:       # %bb.0:
80 ; CHECK-NEXT:    xorps %xmm0, %xmm0
81 ; CHECK-NEXT:    retq
82   %r = mul <4 x i32> %x, poison
83   ret <4 x i32> %r
86 define i32 @mul_poison_lhs(i32 %x) {
87 ; CHECK-LABEL: mul_poison_lhs:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    xorl %eax, %eax
90 ; CHECK-NEXT:    retq
91   %r = mul i32 poison, %x
92   ret i32 %r
95 define <4 x i32> @mul_poison_lhs_vec(<4 x i32> %x) {
96 ; CHECK-LABEL: mul_poison_lhs_vec:
97 ; CHECK:       # %bb.0:
98 ; CHECK-NEXT:    xorps %xmm0, %xmm0
99 ; CHECK-NEXT:    retq
100   %r = mul <4 x i32> poison, %x
101   ret <4 x i32> %r
104 define i32 @sdiv_poison_rhs(i32 %x) {
105 ; CHECK-LABEL: sdiv_poison_rhs:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    retq
108   %r = sdiv i32 %x, poison
109   ret i32 %r
112 define <4 x i32> @sdiv_poison_rhs_vec(<4 x i32> %x) {
113 ; CHECK-LABEL: sdiv_poison_rhs_vec:
114 ; CHECK:       # %bb.0:
115 ; CHECK-NEXT:    retq
116   %r = sdiv <4 x i32> %x, poison
117   ret <4 x i32> %r
120 define i32 @sdiv_poison_lhs(i32 %x) {
121 ; CHECK-LABEL: sdiv_poison_lhs:
122 ; CHECK:       # %bb.0:
123 ; CHECK-NEXT:    xorl %eax, %eax
124 ; CHECK-NEXT:    retq
125   %r = sdiv i32 poison, %x
126   ret i32 %r
129 define <4 x i32> @sdiv_poison_lhs_vec(<4 x i32> %x) {
130 ; CHECK-LABEL: sdiv_poison_lhs_vec:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    xorps %xmm0, %xmm0
133 ; CHECK-NEXT:    retq
134   %r = sdiv <4 x i32> poison, %x
135   ret <4 x i32> %r
138 define i32 @udiv_poison_rhs(i32 %x) {
139 ; CHECK-LABEL: udiv_poison_rhs:
140 ; CHECK:       # %bb.0:
141 ; CHECK-NEXT:    retq
142   %r = udiv i32 %x, poison
143   ret i32 %r
146 define <4 x i32> @udiv_poison_rhs_vec(<4 x i32> %x) {
147 ; CHECK-LABEL: udiv_poison_rhs_vec:
148 ; CHECK:       # %bb.0:
149 ; CHECK-NEXT:    retq
150   %r = udiv <4 x i32> %x, poison
151   ret <4 x i32> %r
154 define i32 @udiv_poison_lhs(i32 %x) {
155 ; CHECK-LABEL: udiv_poison_lhs:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    xorl %eax, %eax
158 ; CHECK-NEXT:    retq
159   %r = udiv i32 poison, %x
160   ret i32 %r
163 define <4 x i32> @udiv_poison_lhs_vec(<4 x i32> %x) {
164 ; CHECK-LABEL: udiv_poison_lhs_vec:
165 ; CHECK:       # %bb.0:
166 ; CHECK-NEXT:    xorps %xmm0, %xmm0
167 ; CHECK-NEXT:    retq
168   %r = udiv <4 x i32> poison, %x
169   ret <4 x i32> %r
172 define i32 @srem_poison_rhs(i32 %x) {
173 ; CHECK-LABEL: srem_poison_rhs:
174 ; CHECK:       # %bb.0:
175 ; CHECK-NEXT:    retq
176   %r = srem i32 %x, poison
177   ret i32 %r
180 define <4 x i32> @srem_poison_rhs_vec(<4 x i32> %x) {
181 ; CHECK-LABEL: srem_poison_rhs_vec:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    retq
184   %r = srem <4 x i32> %x, poison
185   ret <4 x i32> %r
188 define i32 @srem_poison_lhs(i32 %x) {
189 ; CHECK-LABEL: srem_poison_lhs:
190 ; CHECK:       # %bb.0:
191 ; CHECK-NEXT:    xorl %eax, %eax
192 ; CHECK-NEXT:    retq
193   %r = srem i32 poison, %x
194   ret i32 %r
197 define <4 x i32> @srem_poison_lhs_vec(<4 x i32> %x) {
198 ; CHECK-LABEL: srem_poison_lhs_vec:
199 ; CHECK:       # %bb.0:
200 ; CHECK-NEXT:    xorps %xmm0, %xmm0
201 ; CHECK-NEXT:    retq
202   %r = srem <4 x i32> poison, %x
203   ret <4 x i32> %r
206 define i32 @urem_poison_rhs(i32 %x) {
207 ; CHECK-LABEL: urem_poison_rhs:
208 ; CHECK:       # %bb.0:
209 ; CHECK-NEXT:    retq
210   %r = urem i32 %x, poison
211   ret i32 %r
214 define <4 x i32> @urem_poison_rhs_vec(<4 x i32> %x) {
215 ; CHECK-LABEL: urem_poison_rhs_vec:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    retq
218   %r = urem <4 x i32> %x, poison
219   ret <4 x i32> %r
222 define i32 @urem_poison_lhs(i32 %x) {
223 ; CHECK-LABEL: urem_poison_lhs:
224 ; CHECK:       # %bb.0:
225 ; CHECK-NEXT:    xorl %eax, %eax
226 ; CHECK-NEXT:    retq
227   %r = urem i32 poison, %x
228   ret i32 %r
231 define <4 x i32> @urem_poison_lhs_vec(<4 x i32> %x) {
232 ; CHECK-LABEL: urem_poison_lhs_vec:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    xorps %xmm0, %xmm0
235 ; CHECK-NEXT:    retq
236   %r = urem <4 x i32> poison, %x
237   ret <4 x i32> %r
240 define i32 @ashr_poison_rhs(i32 %x) {
241 ; CHECK-LABEL: ashr_poison_rhs:
242 ; CHECK:       # %bb.0:
243 ; CHECK-NEXT:    retq
244   %r = ashr i32 %x, poison
245   ret i32 %r
248 define <4 x i32> @ashr_poison_rhs_vec(<4 x i32> %x) {
249 ; CHECK-LABEL: ashr_poison_rhs_vec:
250 ; CHECK:       # %bb.0:
251 ; CHECK-NEXT:    retq
252   %r = ashr <4 x i32> %x, poison
253   ret <4 x i32> %r
256 define i32 @ashr_poison_lhs(i32 %x) {
257 ; CHECK-LABEL: ashr_poison_lhs:
258 ; CHECK:       # %bb.0:
259 ; CHECK-NEXT:    xorl %eax, %eax
260 ; CHECK-NEXT:    retq
261   %r = ashr i32 poison, %x
262   ret i32 %r
265 define <4 x i32> @ashr_poison_lhs_vec(<4 x i32> %x) {
266 ; CHECK-LABEL: ashr_poison_lhs_vec:
267 ; CHECK:       # %bb.0:
268 ; CHECK-NEXT:    xorps %xmm0, %xmm0
269 ; CHECK-NEXT:    retq
270   %r = ashr <4 x i32> poison, %x
271   ret <4 x i32> %r
274 define i32 @lshr_poison_rhs(i32 %x) {
275 ; CHECK-LABEL: lshr_poison_rhs:
276 ; CHECK:       # %bb.0:
277 ; CHECK-NEXT:    retq
278   %r = lshr i32 %x, poison
279   ret i32 %r
282 define <4 x i32> @lshr_poison_rhs_vec(<4 x i32> %x) {
283 ; CHECK-LABEL: lshr_poison_rhs_vec:
284 ; CHECK:       # %bb.0:
285 ; CHECK-NEXT:    retq
286   %r = lshr <4 x i32> %x, poison
287   ret <4 x i32> %r
290 define i32 @lshr_poison_lhs(i32 %x) {
291 ; CHECK-LABEL: lshr_poison_lhs:
292 ; CHECK:       # %bb.0:
293 ; CHECK-NEXT:    xorl %eax, %eax
294 ; CHECK-NEXT:    retq
295   %r = lshr i32 poison, %x
296   ret i32 %r
299 define <4 x i32> @lshr_poison_lhs_vec(<4 x i32> %x) {
300 ; CHECK-LABEL: lshr_poison_lhs_vec:
301 ; CHECK:       # %bb.0:
302 ; CHECK-NEXT:    xorps %xmm0, %xmm0
303 ; CHECK-NEXT:    retq
304   %r = lshr <4 x i32> poison, %x
305   ret <4 x i32> %r
308 define i32 @shl_poison_rhs(i32 %x) {
309 ; CHECK-LABEL: shl_poison_rhs:
310 ; CHECK:       # %bb.0:
311 ; CHECK-NEXT:    retq
312   %r = shl i32 %x, poison
313   ret i32 %r
316 define <4 x i32> @shl_poison_rhs_vec(<4 x i32> %x) {
317 ; CHECK-LABEL: shl_poison_rhs_vec:
318 ; CHECK:       # %bb.0:
319 ; CHECK-NEXT:    retq
320   %r = shl <4 x i32> %x, poison
321   ret <4 x i32> %r
324 define i32 @shl_poison_lhs(i32 %x) {
325 ; CHECK-LABEL: shl_poison_lhs:
326 ; CHECK:       # %bb.0:
327 ; CHECK-NEXT:    xorl %eax, %eax
328 ; CHECK-NEXT:    retq
329   %r = shl i32 poison, %x
330   ret i32 %r
333 define <4 x i32> @shl_poison_lhs_vec(<4 x i32> %x) {
334 ; CHECK-LABEL: shl_poison_lhs_vec:
335 ; CHECK:       # %bb.0:
336 ; CHECK-NEXT:    xorps %xmm0, %xmm0
337 ; CHECK-NEXT:    retq
338   %r = shl <4 x i32> poison, %x
339   ret <4 x i32> %r
342 define i32 @and_poison_rhs(i32 %x) {
343 ; CHECK-LABEL: and_poison_rhs:
344 ; CHECK:       # %bb.0:
345 ; CHECK-NEXT:    xorl %eax, %eax
346 ; CHECK-NEXT:    retq
347   %r = and i32 %x, poison
348   ret i32 %r
351 define <4 x i32> @and_poison_rhs_vec(<4 x i32> %x) {
352 ; CHECK-LABEL: and_poison_rhs_vec:
353 ; CHECK:       # %bb.0:
354 ; CHECK-NEXT:    xorps %xmm0, %xmm0
355 ; CHECK-NEXT:    retq
356   %r = and <4 x i32> %x, poison
357   ret <4 x i32> %r
360 define i32 @and_poison_lhs(i32 %x) {
361 ; CHECK-LABEL: and_poison_lhs:
362 ; CHECK:       # %bb.0:
363 ; CHECK-NEXT:    xorl %eax, %eax
364 ; CHECK-NEXT:    retq
365   %r = and i32 poison, %x
366   ret i32 %r
369 define <4 x i32> @and_poison_lhs_vec(<4 x i32> %x) {
370 ; CHECK-LABEL: and_poison_lhs_vec:
371 ; CHECK:       # %bb.0:
372 ; CHECK-NEXT:    xorps %xmm0, %xmm0
373 ; CHECK-NEXT:    retq
374   %r = and <4 x i32> poison, %x
375   ret <4 x i32> %r
378 define i32 @or_poison_rhs(i32 %x) {
379 ; CHECK-LABEL: or_poison_rhs:
380 ; CHECK:       # %bb.0:
381 ; CHECK-NEXT:    movl $-1, %eax
382 ; CHECK-NEXT:    retq
383   %r = or i32 %x, poison
384   ret i32 %r
387 define <4 x i32> @or_poison_rhs_vec(<4 x i32> %x) {
388 ; CHECK-LABEL: or_poison_rhs_vec:
389 ; CHECK:       # %bb.0:
390 ; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
391 ; CHECK-NEXT:    retq
392   %r = or <4 x i32> %x, poison
393   ret <4 x i32> %r
396 define i32 @or_poison_lhs(i32 %x) {
397 ; CHECK-LABEL: or_poison_lhs:
398 ; CHECK:       # %bb.0:
399 ; CHECK-NEXT:    movl $-1, %eax
400 ; CHECK-NEXT:    retq
401   %r = or i32 poison, %x
402   ret i32 %r
405 define <4 x i32> @or_poison_lhs_vec(<4 x i32> %x) {
406 ; CHECK-LABEL: or_poison_lhs_vec:
407 ; CHECK:       # %bb.0:
408 ; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
409 ; CHECK-NEXT:    retq
410   %r = or <4 x i32> poison, %x
411   ret <4 x i32> %r
414 define i32 @xor_poison_rhs(i32 %x) {
415 ; CHECK-LABEL: xor_poison_rhs:
416 ; CHECK:       # %bb.0:
417 ; CHECK-NEXT:    retq
418   %r = xor i32 %x, poison
419   ret i32 %r
422 define <4 x i32> @xor_poison_rhs_vec(<4 x i32> %x) {
423 ; CHECK-LABEL: xor_poison_rhs_vec:
424 ; CHECK:       # %bb.0:
425 ; CHECK-NEXT:    retq
426   %r = xor <4 x i32> %x, poison
427   ret <4 x i32> %r
430 define i32 @xor_poison_lhs(i32 %x) {
431 ; CHECK-LABEL: xor_poison_lhs:
432 ; CHECK:       # %bb.0:
433 ; CHECK-NEXT:    retq
434   %r = xor i32 poison, %x
435   ret i32 %r
438 define <4 x i32> @xor_poison_lhs_vec(<4 x i32> %x) {
439 ; CHECK-LABEL: xor_poison_lhs_vec:
440 ; CHECK:       # %bb.0:
441 ; CHECK-NEXT:    retq
442   %r = xor <4 x i32> poison, %x
443   ret <4 x i32> %r
446 ; This would crash because the shift amount is an i8 operand,
447 ; but the result of the shift is i32. We can't just propagate
448 ; the existing poison as the result.
450 define i1 @poison_operand_size_not_same_as_result() {
451 ; CHECK-LABEL: poison_operand_size_not_same_as_result:
452 ; CHECK:       # %bb.0:
453 ; CHECK-NEXT:    retq
454   %sh = shl i32 7, poison
455   %cmp = icmp eq i32 0, %sh
456   ret i1 %cmp