Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / unfold-masked-merge-scalar-constmask-interleavedbytehalves.ll
blobc7579e2aa9d1fb00d42d19b301be3a024bceef27
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi < %s | FileCheck %s --check-prefix=CHECK-NOBMI
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi < %s | FileCheck %s --check-prefix=CHECK-BMI
5 ; https://bugs.llvm.org/show_bug.cgi?id=37104
7 ; X:           [bit 3210]
8 ; Y: [bit 7654]
10 define i8 @out8_constmask(i8 %x, i8 %y) {
11 ; CHECK-NOBMI-LABEL: out8_constmask:
12 ; CHECK-NOBMI:       # %bb.0:
13 ; CHECK-NOBMI-NEXT:    movl %esi, %eax
14 ; CHECK-NOBMI-NEXT:    andb $15, %dil
15 ; CHECK-NOBMI-NEXT:    andb $-16, %al
16 ; CHECK-NOBMI-NEXT:    orb %dil, %al
17 ; CHECK-NOBMI-NEXT:    # kill: def $al killed $al killed $eax
18 ; CHECK-NOBMI-NEXT:    retq
20 ; CHECK-BMI-LABEL: out8_constmask:
21 ; CHECK-BMI:       # %bb.0:
22 ; CHECK-BMI-NEXT:    movl %esi, %eax
23 ; CHECK-BMI-NEXT:    andb $15, %dil
24 ; CHECK-BMI-NEXT:    andb $-16, %al
25 ; CHECK-BMI-NEXT:    orb %dil, %al
26 ; CHECK-BMI-NEXT:    # kill: def $al killed $al killed $eax
27 ; CHECK-BMI-NEXT:    retq
28   %mx = and i8 %x, 15
29   %my = and i8 %y, -16
30   %r = or i8 %mx, %my
31   ret i8 %r
34 define i16 @out16_constmask(i16 %x, i16 %y) {
35 ; CHECK-NOBMI-LABEL: out16_constmask:
36 ; CHECK-NOBMI:       # %bb.0:
37 ; CHECK-NOBMI-NEXT:    # kill: def $esi killed $esi def $rsi
38 ; CHECK-NOBMI-NEXT:    # kill: def $edi killed $edi def $rdi
39 ; CHECK-NOBMI-NEXT:    andl $3855, %edi # imm = 0xF0F
40 ; CHECK-NOBMI-NEXT:    andl $-3856, %esi # imm = 0xF0F0
41 ; CHECK-NOBMI-NEXT:    leal (%rsi,%rdi), %eax
42 ; CHECK-NOBMI-NEXT:    # kill: def $ax killed $ax killed $eax
43 ; CHECK-NOBMI-NEXT:    retq
45 ; CHECK-BMI-LABEL: out16_constmask:
46 ; CHECK-BMI:       # %bb.0:
47 ; CHECK-BMI-NEXT:    # kill: def $esi killed $esi def $rsi
48 ; CHECK-BMI-NEXT:    # kill: def $edi killed $edi def $rdi
49 ; CHECK-BMI-NEXT:    andl $3855, %edi # imm = 0xF0F
50 ; CHECK-BMI-NEXT:    andl $-3856, %esi # imm = 0xF0F0
51 ; CHECK-BMI-NEXT:    leal (%rsi,%rdi), %eax
52 ; CHECK-BMI-NEXT:    # kill: def $ax killed $ax killed $eax
53 ; CHECK-BMI-NEXT:    retq
54   %mx = and i16 %x, 3855
55   %my = and i16 %y, -3856
56   %r = or i16 %mx, %my
57   ret i16 %r
60 define i32 @out32_constmask(i32 %x, i32 %y) {
61 ; CHECK-NOBMI-LABEL: out32_constmask:
62 ; CHECK-NOBMI:       # %bb.0:
63 ; CHECK-NOBMI-NEXT:    # kill: def $esi killed $esi def $rsi
64 ; CHECK-NOBMI-NEXT:    # kill: def $edi killed $edi def $rdi
65 ; CHECK-NOBMI-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
66 ; CHECK-NOBMI-NEXT:    andl $-252645136, %esi # imm = 0xF0F0F0F0
67 ; CHECK-NOBMI-NEXT:    leal (%rsi,%rdi), %eax
68 ; CHECK-NOBMI-NEXT:    retq
70 ; CHECK-BMI-LABEL: out32_constmask:
71 ; CHECK-BMI:       # %bb.0:
72 ; CHECK-BMI-NEXT:    # kill: def $esi killed $esi def $rsi
73 ; CHECK-BMI-NEXT:    # kill: def $edi killed $edi def $rdi
74 ; CHECK-BMI-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
75 ; CHECK-BMI-NEXT:    andl $-252645136, %esi # imm = 0xF0F0F0F0
76 ; CHECK-BMI-NEXT:    leal (%rsi,%rdi), %eax
77 ; CHECK-BMI-NEXT:    retq
78   %mx = and i32 %x, 252645135
79   %my = and i32 %y, -252645136
80   %r = or i32 %mx, %my
81   ret i32 %r
84 define i64 @out64_constmask(i64 %x, i64 %y) {
85 ; CHECK-NOBMI-LABEL: out64_constmask:
86 ; CHECK-NOBMI:       # %bb.0:
87 ; CHECK-NOBMI-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
88 ; CHECK-NOBMI-NEXT:    andq %rdi, %rcx
89 ; CHECK-NOBMI-NEXT:    movabsq $-1085102592571150096, %rax # imm = 0xF0F0F0F0F0F0F0F0
90 ; CHECK-NOBMI-NEXT:    andq %rsi, %rax
91 ; CHECK-NOBMI-NEXT:    orq %rcx, %rax
92 ; CHECK-NOBMI-NEXT:    retq
94 ; CHECK-BMI-LABEL: out64_constmask:
95 ; CHECK-BMI:       # %bb.0:
96 ; CHECK-BMI-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
97 ; CHECK-BMI-NEXT:    andq %rdi, %rcx
98 ; CHECK-BMI-NEXT:    movabsq $-1085102592571150096, %rax # imm = 0xF0F0F0F0F0F0F0F0
99 ; CHECK-BMI-NEXT:    andq %rsi, %rax
100 ; CHECK-BMI-NEXT:    orq %rcx, %rax
101 ; CHECK-BMI-NEXT:    retq
102   %mx = and i64 %x, 1085102592571150095
103   %my = and i64 %y, -1085102592571150096
104   %r = or i64 %mx, %my
105   ret i64 %r
108 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109 ; Should be the same as the previous one.
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112 define i8 @in8_constmask(i8 %x, i8 %y) {
113 ; CHECK-NOBMI-LABEL: in8_constmask:
114 ; CHECK-NOBMI:       # %bb.0:
115 ; CHECK-NOBMI-NEXT:    movl %esi, %eax
116 ; CHECK-NOBMI-NEXT:    xorl %esi, %edi
117 ; CHECK-NOBMI-NEXT:    andb $15, %dil
118 ; CHECK-NOBMI-NEXT:    xorb %dil, %al
119 ; CHECK-NOBMI-NEXT:    # kill: def $al killed $al killed $eax
120 ; CHECK-NOBMI-NEXT:    retq
122 ; CHECK-BMI-LABEL: in8_constmask:
123 ; CHECK-BMI:       # %bb.0:
124 ; CHECK-BMI-NEXT:    movl %esi, %eax
125 ; CHECK-BMI-NEXT:    xorl %esi, %edi
126 ; CHECK-BMI-NEXT:    andb $15, %dil
127 ; CHECK-BMI-NEXT:    xorb %dil, %al
128 ; CHECK-BMI-NEXT:    # kill: def $al killed $al killed $eax
129 ; CHECK-BMI-NEXT:    retq
130   %n0 = xor i8 %x, %y
131   %n1 = and i8 %n0, 15
132   %r = xor i8 %n1, %y
133   ret i8 %r
136 define i16 @in16_constmask(i16 %x, i16 %y) {
137 ; CHECK-NOBMI-LABEL: in16_constmask:
138 ; CHECK-NOBMI:       # %bb.0:
139 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
140 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
141 ; CHECK-NOBMI-NEXT:    andl $3855, %eax # imm = 0xF0F
142 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
143 ; CHECK-NOBMI-NEXT:    # kill: def $ax killed $ax killed $eax
144 ; CHECK-NOBMI-NEXT:    retq
146 ; CHECK-BMI-LABEL: in16_constmask:
147 ; CHECK-BMI:       # %bb.0:
148 ; CHECK-BMI-NEXT:    movl %edi, %eax
149 ; CHECK-BMI-NEXT:    xorl %esi, %eax
150 ; CHECK-BMI-NEXT:    andl $3855, %eax # imm = 0xF0F
151 ; CHECK-BMI-NEXT:    xorl %esi, %eax
152 ; CHECK-BMI-NEXT:    # kill: def $ax killed $ax killed $eax
153 ; CHECK-BMI-NEXT:    retq
154   %n0 = xor i16 %x, %y
155   %n1 = and i16 %n0, 3855
156   %r = xor i16 %n1, %y
157   ret i16 %r
160 define i32 @in32_constmask(i32 %x, i32 %y) {
161 ; CHECK-NOBMI-LABEL: in32_constmask:
162 ; CHECK-NOBMI:       # %bb.0:
163 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
164 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
165 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
166 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
167 ; CHECK-NOBMI-NEXT:    retq
169 ; CHECK-BMI-LABEL: in32_constmask:
170 ; CHECK-BMI:       # %bb.0:
171 ; CHECK-BMI-NEXT:    movl %edi, %eax
172 ; CHECK-BMI-NEXT:    xorl %esi, %eax
173 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
174 ; CHECK-BMI-NEXT:    xorl %esi, %eax
175 ; CHECK-BMI-NEXT:    retq
176   %n0 = xor i32 %x, %y
177   %n1 = and i32 %n0, 252645135
178   %r = xor i32 %n1, %y
179   ret i32 %r
182 define i64 @in64_constmask(i64 %x, i64 %y) {
183 ; CHECK-NOBMI-LABEL: in64_constmask:
184 ; CHECK-NOBMI:       # %bb.0:
185 ; CHECK-NOBMI-NEXT:    xorq %rsi, %rdi
186 ; CHECK-NOBMI-NEXT:    movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F
187 ; CHECK-NOBMI-NEXT:    andq %rdi, %rax
188 ; CHECK-NOBMI-NEXT:    xorq %rsi, %rax
189 ; CHECK-NOBMI-NEXT:    retq
191 ; CHECK-BMI-LABEL: in64_constmask:
192 ; CHECK-BMI:       # %bb.0:
193 ; CHECK-BMI-NEXT:    xorq %rsi, %rdi
194 ; CHECK-BMI-NEXT:    movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F
195 ; CHECK-BMI-NEXT:    andq %rdi, %rax
196 ; CHECK-BMI-NEXT:    xorq %rsi, %rax
197 ; CHECK-BMI-NEXT:    retq
198   %n0 = xor i64 %x, %y
199   %n1 = and i64 %n0, 1085102592571150095
200   %r = xor i64 %n1, %y
201   ret i64 %r
204 ; ============================================================================ ;
205 ; Constant Commutativity tests.
206 ; ============================================================================ ;
208 define i32 @in_constmask_commutativity_0_1(i32 %x, i32 %y) {
209 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_0_1:
210 ; CHECK-NOBMI:       # %bb.0:
211 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
212 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
213 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
214 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
215 ; CHECK-NOBMI-NEXT:    retq
217 ; CHECK-BMI-LABEL: in_constmask_commutativity_0_1:
218 ; CHECK-BMI:       # %bb.0:
219 ; CHECK-BMI-NEXT:    movl %edi, %eax
220 ; CHECK-BMI-NEXT:    xorl %esi, %eax
221 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
222 ; CHECK-BMI-NEXT:    xorl %esi, %eax
223 ; CHECK-BMI-NEXT:    retq
224   %n0 = xor i32 %x, %y
225   %n1 = and i32 %n0, 252645135
226   %r = xor i32 %y, %n1 ; swapped
227   ret i32 %r
230 define i32 @in_constmask_commutativity_1_0(i32 %x, i32 %y) {
231 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_0:
232 ; CHECK-NOBMI:       # %bb.0:
233 ; CHECK-NOBMI-NEXT:    movl %esi, %eax
234 ; CHECK-NOBMI-NEXT:    xorl %edi, %eax
235 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
236 ; CHECK-NOBMI-NEXT:    xorl %edi, %eax
237 ; CHECK-NOBMI-NEXT:    retq
239 ; CHECK-BMI-LABEL: in_constmask_commutativity_1_0:
240 ; CHECK-BMI:       # %bb.0:
241 ; CHECK-BMI-NEXT:    movl %esi, %eax
242 ; CHECK-BMI-NEXT:    xorl %edi, %eax
243 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
244 ; CHECK-BMI-NEXT:    xorl %edi, %eax
245 ; CHECK-BMI-NEXT:    retq
246   %n0 = xor i32 %x, %y
247   %n1 = and i32 %n0, 252645135
248   %r = xor i32 %n1, %x ; %x instead of %y
249   ret i32 %r
252 define i32 @in_constmask_commutativity_1_1(i32 %x, i32 %y) {
253 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_1:
254 ; CHECK-NOBMI:       # %bb.0:
255 ; CHECK-NOBMI-NEXT:    movl %esi, %eax
256 ; CHECK-NOBMI-NEXT:    xorl %edi, %eax
257 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
258 ; CHECK-NOBMI-NEXT:    xorl %edi, %eax
259 ; CHECK-NOBMI-NEXT:    retq
261 ; CHECK-BMI-LABEL: in_constmask_commutativity_1_1:
262 ; CHECK-BMI:       # %bb.0:
263 ; CHECK-BMI-NEXT:    movl %esi, %eax
264 ; CHECK-BMI-NEXT:    xorl %edi, %eax
265 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
266 ; CHECK-BMI-NEXT:    xorl %edi, %eax
267 ; CHECK-BMI-NEXT:    retq
268   %n0 = xor i32 %x, %y
269   %n1 = and i32 %n0, 252645135
270   %r = xor i32 %x, %n1 ; swapped, %x instead of %y
271   ret i32 %r
274 ; ============================================================================ ;
275 ; Y is an 'and' too.
276 ; ============================================================================ ;
278 define i32 @in_complex_y0_constmask(i32 %x, i32 %y_hi, i32 %y_low) {
279 ; CHECK-NOBMI-LABEL: in_complex_y0_constmask:
280 ; CHECK-NOBMI:       # %bb.0:
281 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
282 ; CHECK-NOBMI-NEXT:    andl %edx, %esi
283 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
284 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
285 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
286 ; CHECK-NOBMI-NEXT:    retq
288 ; CHECK-BMI-LABEL: in_complex_y0_constmask:
289 ; CHECK-BMI:       # %bb.0:
290 ; CHECK-BMI-NEXT:    movl %edi, %eax
291 ; CHECK-BMI-NEXT:    andl %edx, %esi
292 ; CHECK-BMI-NEXT:    xorl %esi, %eax
293 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
294 ; CHECK-BMI-NEXT:    xorl %esi, %eax
295 ; CHECK-BMI-NEXT:    retq
296   %y = and i32 %y_hi, %y_low
297   %n0 = xor i32 %x, %y
298   %n1 = and i32 %n0, 252645135
299   %r = xor i32 %n1, %y
300   ret i32 %r
303 define i32 @in_complex_y1_constmask(i32 %x, i32 %y_hi, i32 %y_low) {
304 ; CHECK-NOBMI-LABEL: in_complex_y1_constmask:
305 ; CHECK-NOBMI:       # %bb.0:
306 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
307 ; CHECK-NOBMI-NEXT:    andl %edx, %esi
308 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
309 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
310 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
311 ; CHECK-NOBMI-NEXT:    retq
313 ; CHECK-BMI-LABEL: in_complex_y1_constmask:
314 ; CHECK-BMI:       # %bb.0:
315 ; CHECK-BMI-NEXT:    movl %edi, %eax
316 ; CHECK-BMI-NEXT:    andl %edx, %esi
317 ; CHECK-BMI-NEXT:    xorl %esi, %eax
318 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
319 ; CHECK-BMI-NEXT:    xorl %esi, %eax
320 ; CHECK-BMI-NEXT:    retq
321   %y = and i32 %y_hi, %y_low
322   %n0 = xor i32 %x, %y
323   %n1 = and i32 %n0, 252645135
324   %r = xor i32 %y, %n1
325   ret i32 %r
328 ; ============================================================================ ;
329 ; Negative tests. Should not be folded.
330 ; ============================================================================ ;
332 ; Multi-use tests.
334 declare void @use32(i32) nounwind
336 define i32 @in_multiuse_A_constmask(i32 %x, i32 %y, i32 %z) nounwind {
337 ; CHECK-NOBMI-LABEL: in_multiuse_A_constmask:
338 ; CHECK-NOBMI:       # %bb.0:
339 ; CHECK-NOBMI-NEXT:    pushq %rbp
340 ; CHECK-NOBMI-NEXT:    pushq %rbx
341 ; CHECK-NOBMI-NEXT:    pushq %rax
342 ; CHECK-NOBMI-NEXT:    movl %esi, %ebx
343 ; CHECK-NOBMI-NEXT:    movl %edi, %ebp
344 ; CHECK-NOBMI-NEXT:    xorl %esi, %ebp
345 ; CHECK-NOBMI-NEXT:    andl $252645135, %ebp # imm = 0xF0F0F0F
346 ; CHECK-NOBMI-NEXT:    movl %ebp, %edi
347 ; CHECK-NOBMI-NEXT:    callq use32
348 ; CHECK-NOBMI-NEXT:    xorl %ebx, %ebp
349 ; CHECK-NOBMI-NEXT:    movl %ebp, %eax
350 ; CHECK-NOBMI-NEXT:    addq $8, %rsp
351 ; CHECK-NOBMI-NEXT:    popq %rbx
352 ; CHECK-NOBMI-NEXT:    popq %rbp
353 ; CHECK-NOBMI-NEXT:    retq
355 ; CHECK-BMI-LABEL: in_multiuse_A_constmask:
356 ; CHECK-BMI:       # %bb.0:
357 ; CHECK-BMI-NEXT:    pushq %rbp
358 ; CHECK-BMI-NEXT:    pushq %rbx
359 ; CHECK-BMI-NEXT:    pushq %rax
360 ; CHECK-BMI-NEXT:    movl %esi, %ebx
361 ; CHECK-BMI-NEXT:    movl %edi, %ebp
362 ; CHECK-BMI-NEXT:    xorl %esi, %ebp
363 ; CHECK-BMI-NEXT:    andl $252645135, %ebp # imm = 0xF0F0F0F
364 ; CHECK-BMI-NEXT:    movl %ebp, %edi
365 ; CHECK-BMI-NEXT:    callq use32
366 ; CHECK-BMI-NEXT:    xorl %ebx, %ebp
367 ; CHECK-BMI-NEXT:    movl %ebp, %eax
368 ; CHECK-BMI-NEXT:    addq $8, %rsp
369 ; CHECK-BMI-NEXT:    popq %rbx
370 ; CHECK-BMI-NEXT:    popq %rbp
371 ; CHECK-BMI-NEXT:    retq
372   %n0 = xor i32 %x, %y
373   %n1 = and i32 %n0, 252645135
374   call void @use32(i32 %n1)
375   %r = xor i32 %n1, %y
376   ret i32 %r
379 define i32 @in_multiuse_B_constmask(i32 %x, i32 %y, i32 %z) nounwind {
380 ; CHECK-NOBMI-LABEL: in_multiuse_B_constmask:
381 ; CHECK-NOBMI:       # %bb.0:
382 ; CHECK-NOBMI-NEXT:    pushq %rbp
383 ; CHECK-NOBMI-NEXT:    pushq %rbx
384 ; CHECK-NOBMI-NEXT:    pushq %rax
385 ; CHECK-NOBMI-NEXT:    movl %esi, %ebx
386 ; CHECK-NOBMI-NEXT:    xorl %esi, %edi
387 ; CHECK-NOBMI-NEXT:    movl %edi, %ebp
388 ; CHECK-NOBMI-NEXT:    andl $252645135, %ebp # imm = 0xF0F0F0F
389 ; CHECK-NOBMI-NEXT:    callq use32
390 ; CHECK-NOBMI-NEXT:    xorl %ebx, %ebp
391 ; CHECK-NOBMI-NEXT:    movl %ebp, %eax
392 ; CHECK-NOBMI-NEXT:    addq $8, %rsp
393 ; CHECK-NOBMI-NEXT:    popq %rbx
394 ; CHECK-NOBMI-NEXT:    popq %rbp
395 ; CHECK-NOBMI-NEXT:    retq
397 ; CHECK-BMI-LABEL: in_multiuse_B_constmask:
398 ; CHECK-BMI:       # %bb.0:
399 ; CHECK-BMI-NEXT:    pushq %rbp
400 ; CHECK-BMI-NEXT:    pushq %rbx
401 ; CHECK-BMI-NEXT:    pushq %rax
402 ; CHECK-BMI-NEXT:    movl %esi, %ebx
403 ; CHECK-BMI-NEXT:    xorl %esi, %edi
404 ; CHECK-BMI-NEXT:    movl %edi, %ebp
405 ; CHECK-BMI-NEXT:    andl $252645135, %ebp # imm = 0xF0F0F0F
406 ; CHECK-BMI-NEXT:    callq use32
407 ; CHECK-BMI-NEXT:    xorl %ebx, %ebp
408 ; CHECK-BMI-NEXT:    movl %ebp, %eax
409 ; CHECK-BMI-NEXT:    addq $8, %rsp
410 ; CHECK-BMI-NEXT:    popq %rbx
411 ; CHECK-BMI-NEXT:    popq %rbp
412 ; CHECK-BMI-NEXT:    retq
413   %n0 = xor i32 %x, %y
414   %n1 = and i32 %n0, 252645135
415   call void @use32(i32 %n0)
416   %r = xor i32 %n1, %y
417   ret i32 %r
420 ; Various bad variants
422 define i32 @n0_badconstmask(i32 %x, i32 %y) {
423 ; CHECK-NOBMI-LABEL: n0_badconstmask:
424 ; CHECK-NOBMI:       # %bb.0:
425 ; CHECK-NOBMI-NEXT:    movl %esi, %eax
426 ; CHECK-NOBMI-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
427 ; CHECK-NOBMI-NEXT:    andl $-252645135, %eax # imm = 0xF0F0F0F1
428 ; CHECK-NOBMI-NEXT:    orl %edi, %eax
429 ; CHECK-NOBMI-NEXT:    retq
431 ; CHECK-BMI-LABEL: n0_badconstmask:
432 ; CHECK-BMI:       # %bb.0:
433 ; CHECK-BMI-NEXT:    movl %esi, %eax
434 ; CHECK-BMI-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
435 ; CHECK-BMI-NEXT:    andl $-252645135, %eax # imm = 0xF0F0F0F1
436 ; CHECK-BMI-NEXT:    orl %edi, %eax
437 ; CHECK-BMI-NEXT:    retq
438   %mx = and i32 %x, 252645135
439   %my = and i32 %y, -252645135 ; instead of -252645136
440   %r = or i32 %mx, %my
441   ret i32 %r
444 define i32 @n1_thirdvar_constmask(i32 %x, i32 %y, i32 %z) {
445 ; CHECK-NOBMI-LABEL: n1_thirdvar_constmask:
446 ; CHECK-NOBMI:       # %bb.0:
447 ; CHECK-NOBMI-NEXT:    movl %edi, %eax
448 ; CHECK-NOBMI-NEXT:    xorl %esi, %eax
449 ; CHECK-NOBMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
450 ; CHECK-NOBMI-NEXT:    xorl %edx, %eax
451 ; CHECK-NOBMI-NEXT:    retq
453 ; CHECK-BMI-LABEL: n1_thirdvar_constmask:
454 ; CHECK-BMI:       # %bb.0:
455 ; CHECK-BMI-NEXT:    movl %edi, %eax
456 ; CHECK-BMI-NEXT:    xorl %esi, %eax
457 ; CHECK-BMI-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
458 ; CHECK-BMI-NEXT:    xorl %edx, %eax
459 ; CHECK-BMI-NEXT:    retq
460   %n0 = xor i32 %x, %y
461   %n1 = and i32 %n0, 252645135
462   %r = xor i32 %n1, %z ; instead of %y
463   ret i32 %r