467 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi < %s | FileCheck %s --check-prefix=CHECK-NOBMI3; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi < %s | FileCheck %s --check-prefix=CHECK-BMI4 5; https://bugs.llvm.org/show_bug.cgi?id=371046 7; X: [bit2] [bit0]8; Y: [bit3] [bit1]9 10define i8 @out8_constmask(i8 %x, i8 %y) {11; CHECK-NOBMI-LABEL: out8_constmask:12; CHECK-NOBMI: # %bb.0:13; CHECK-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi14; CHECK-NOBMI-NEXT: # kill: def $edi killed $edi def $rdi15; CHECK-NOBMI-NEXT: andb $85, %dil16; CHECK-NOBMI-NEXT: andb $-86, %sil17; CHECK-NOBMI-NEXT: leal (%rsi,%rdi), %eax18; CHECK-NOBMI-NEXT: # kill: def $al killed $al killed $eax19; CHECK-NOBMI-NEXT: retq20;21; CHECK-BMI-LABEL: out8_constmask:22; CHECK-BMI: # %bb.0:23; CHECK-BMI-NEXT: # kill: def $esi killed $esi def $rsi24; CHECK-BMI-NEXT: # kill: def $edi killed $edi def $rdi25; CHECK-BMI-NEXT: andb $85, %dil26; CHECK-BMI-NEXT: andb $-86, %sil27; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax28; CHECK-BMI-NEXT: # kill: def $al killed $al killed $eax29; CHECK-BMI-NEXT: retq30 %mx = and i8 %x, 8531 %my = and i8 %y, -8632 %r = or i8 %mx, %my33 ret i8 %r34}35 36define i16 @out16_constmask(i16 %x, i16 %y) {37; CHECK-NOBMI-LABEL: out16_constmask:38; CHECK-NOBMI: # %bb.0:39; CHECK-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi40; CHECK-NOBMI-NEXT: # kill: def $edi killed $edi def $rdi41; CHECK-NOBMI-NEXT: andl $21845, %edi # imm = 0x555542; CHECK-NOBMI-NEXT: andl $-21846, %esi # imm = 0xAAAA43; CHECK-NOBMI-NEXT: leal (%rsi,%rdi), %eax44; CHECK-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax45; CHECK-NOBMI-NEXT: retq46;47; CHECK-BMI-LABEL: out16_constmask:48; CHECK-BMI: # %bb.0:49; CHECK-BMI-NEXT: # kill: def $esi killed $esi def $rsi50; CHECK-BMI-NEXT: # kill: def $edi killed $edi def $rdi51; CHECK-BMI-NEXT: andl $21845, %edi # imm = 0x555552; CHECK-BMI-NEXT: andl $-21846, %esi # imm = 0xAAAA53; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax54; CHECK-BMI-NEXT: # kill: def $ax killed $ax killed $eax55; CHECK-BMI-NEXT: retq56 %mx = and i16 %x, 2184557 %my = and i16 %y, -2184658 %r = or i16 %mx, %my59 ret i16 %r60}61 62define i32 @out32_constmask(i32 %x, i32 %y) {63; CHECK-NOBMI-LABEL: out32_constmask:64; CHECK-NOBMI: # %bb.0:65; CHECK-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi66; CHECK-NOBMI-NEXT: # kill: def $edi killed $edi def $rdi67; CHECK-NOBMI-NEXT: andl $1431655765, %edi # imm = 0x5555555568; CHECK-NOBMI-NEXT: andl $-1431655766, %esi # imm = 0xAAAAAAAA69; CHECK-NOBMI-NEXT: leal (%rsi,%rdi), %eax70; CHECK-NOBMI-NEXT: retq71;72; CHECK-BMI-LABEL: out32_constmask:73; CHECK-BMI: # %bb.0:74; CHECK-BMI-NEXT: # kill: def $esi killed $esi def $rsi75; CHECK-BMI-NEXT: # kill: def $edi killed $edi def $rdi76; CHECK-BMI-NEXT: andl $1431655765, %edi # imm = 0x5555555577; CHECK-BMI-NEXT: andl $-1431655766, %esi # imm = 0xAAAAAAAA78; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax79; CHECK-BMI-NEXT: retq80 %mx = and i32 %x, 143165576581 %my = and i32 %y, -143165576682 %r = or i32 %mx, %my83 ret i32 %r84}85 86define i64 @out64_constmask(i64 %x, i64 %y) {87; CHECK-NOBMI-LABEL: out64_constmask:88; CHECK-NOBMI: # %bb.0:89; CHECK-NOBMI-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x555555555555555590; CHECK-NOBMI-NEXT: andq %rdi, %rcx91; CHECK-NOBMI-NEXT: movabsq $-6148914691236517206, %rax # imm = 0xAAAAAAAAAAAAAAAA92; CHECK-NOBMI-NEXT: andq %rsi, %rax93; CHECK-NOBMI-NEXT: orq %rcx, %rax94; CHECK-NOBMI-NEXT: retq95;96; CHECK-BMI-LABEL: out64_constmask:97; CHECK-BMI: # %bb.0:98; CHECK-BMI-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x555555555555555599; CHECK-BMI-NEXT: andq %rdi, %rcx100; CHECK-BMI-NEXT: movabsq $-6148914691236517206, %rax # imm = 0xAAAAAAAAAAAAAAAA101; CHECK-BMI-NEXT: andq %rsi, %rax102; CHECK-BMI-NEXT: orq %rcx, %rax103; CHECK-BMI-NEXT: retq104 %mx = and i64 %x, 6148914691236517205105 %my = and i64 %y, -6148914691236517206106 %r = or i64 %mx, %my107 ret i64 %r108}109 110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111; Should be the same as the previous one.112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113 114define i8 @in8_constmask(i8 %x, i8 %y) {115; CHECK-NOBMI-LABEL: in8_constmask:116; CHECK-NOBMI: # %bb.0:117; CHECK-NOBMI-NEXT: movl %esi, %eax118; CHECK-NOBMI-NEXT: xorl %esi, %edi119; CHECK-NOBMI-NEXT: andb $85, %dil120; CHECK-NOBMI-NEXT: xorb %dil, %al121; CHECK-NOBMI-NEXT: # kill: def $al killed $al killed $eax122; CHECK-NOBMI-NEXT: retq123;124; CHECK-BMI-LABEL: in8_constmask:125; CHECK-BMI: # %bb.0:126; CHECK-BMI-NEXT: movl %esi, %eax127; CHECK-BMI-NEXT: xorl %esi, %edi128; CHECK-BMI-NEXT: andb $85, %dil129; CHECK-BMI-NEXT: xorb %dil, %al130; CHECK-BMI-NEXT: # kill: def $al killed $al killed $eax131; CHECK-BMI-NEXT: retq132 %n0 = xor i8 %x, %y133 %n1 = and i8 %n0, 85134 %r = xor i8 %n1, %y135 ret i8 %r136}137 138define i16 @in16_constmask(i16 %x, i16 %y) {139; CHECK-NOBMI-LABEL: in16_constmask:140; CHECK-NOBMI: # %bb.0:141; CHECK-NOBMI-NEXT: movl %edi, %eax142; CHECK-NOBMI-NEXT: xorl %esi, %eax143; CHECK-NOBMI-NEXT: andl $21845, %eax # imm = 0x5555144; CHECK-NOBMI-NEXT: xorl %esi, %eax145; CHECK-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax146; CHECK-NOBMI-NEXT: retq147;148; CHECK-BMI-LABEL: in16_constmask:149; CHECK-BMI: # %bb.0:150; CHECK-BMI-NEXT: movl %edi, %eax151; CHECK-BMI-NEXT: xorl %esi, %eax152; CHECK-BMI-NEXT: andl $21845, %eax # imm = 0x5555153; CHECK-BMI-NEXT: xorl %esi, %eax154; CHECK-BMI-NEXT: # kill: def $ax killed $ax killed $eax155; CHECK-BMI-NEXT: retq156 %n0 = xor i16 %x, %y157 %n1 = and i16 %n0, 21845158 %r = xor i16 %n1, %y159 ret i16 %r160}161 162define i32 @in32_constmask(i32 %x, i32 %y) {163; CHECK-NOBMI-LABEL: in32_constmask:164; CHECK-NOBMI: # %bb.0:165; CHECK-NOBMI-NEXT: movl %edi, %eax166; CHECK-NOBMI-NEXT: xorl %esi, %eax167; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555168; CHECK-NOBMI-NEXT: xorl %esi, %eax169; CHECK-NOBMI-NEXT: retq170;171; CHECK-BMI-LABEL: in32_constmask:172; CHECK-BMI: # %bb.0:173; CHECK-BMI-NEXT: movl %edi, %eax174; CHECK-BMI-NEXT: xorl %esi, %eax175; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555176; CHECK-BMI-NEXT: xorl %esi, %eax177; CHECK-BMI-NEXT: retq178 %n0 = xor i32 %x, %y179 %n1 = and i32 %n0, 1431655765180 %r = xor i32 %n1, %y181 ret i32 %r182}183 184define i64 @in64_constmask(i64 %x, i64 %y) {185; CHECK-NOBMI-LABEL: in64_constmask:186; CHECK-NOBMI: # %bb.0:187; CHECK-NOBMI-NEXT: xorq %rsi, %rdi188; CHECK-NOBMI-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555189; CHECK-NOBMI-NEXT: andq %rdi, %rax190; CHECK-NOBMI-NEXT: xorq %rsi, %rax191; CHECK-NOBMI-NEXT: retq192;193; CHECK-BMI-LABEL: in64_constmask:194; CHECK-BMI: # %bb.0:195; CHECK-BMI-NEXT: xorq %rsi, %rdi196; CHECK-BMI-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555197; CHECK-BMI-NEXT: andq %rdi, %rax198; CHECK-BMI-NEXT: xorq %rsi, %rax199; CHECK-BMI-NEXT: retq200 %n0 = xor i64 %x, %y201 %n1 = and i64 %n0, 6148914691236517205202 %r = xor i64 %n1, %y203 ret i64 %r204}205 206; ============================================================================ ;207; Constant Commutativity tests.208; ============================================================================ ;209 210define i32 @in_constmask_commutativity_0_1(i32 %x, i32 %y) {211; CHECK-NOBMI-LABEL: in_constmask_commutativity_0_1:212; CHECK-NOBMI: # %bb.0:213; CHECK-NOBMI-NEXT: movl %edi, %eax214; CHECK-NOBMI-NEXT: xorl %esi, %eax215; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555216; CHECK-NOBMI-NEXT: xorl %esi, %eax217; CHECK-NOBMI-NEXT: retq218;219; CHECK-BMI-LABEL: in_constmask_commutativity_0_1:220; CHECK-BMI: # %bb.0:221; CHECK-BMI-NEXT: movl %edi, %eax222; CHECK-BMI-NEXT: xorl %esi, %eax223; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555224; CHECK-BMI-NEXT: xorl %esi, %eax225; CHECK-BMI-NEXT: retq226 %n0 = xor i32 %x, %y227 %n1 = and i32 %n0, 1431655765228 %r = xor i32 %y, %n1 ; swapped229 ret i32 %r230}231 232define i32 @in_constmask_commutativity_1_0(i32 %x, i32 %y) {233; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_0:234; CHECK-NOBMI: # %bb.0:235; CHECK-NOBMI-NEXT: movl %esi, %eax236; CHECK-NOBMI-NEXT: xorl %edi, %eax237; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555238; CHECK-NOBMI-NEXT: xorl %edi, %eax239; CHECK-NOBMI-NEXT: retq240;241; CHECK-BMI-LABEL: in_constmask_commutativity_1_0:242; CHECK-BMI: # %bb.0:243; CHECK-BMI-NEXT: movl %esi, %eax244; CHECK-BMI-NEXT: xorl %edi, %eax245; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555246; CHECK-BMI-NEXT: xorl %edi, %eax247; CHECK-BMI-NEXT: retq248 %n0 = xor i32 %x, %y249 %n1 = and i32 %n0, 1431655765250 %r = xor i32 %n1, %x ; %x instead of %y251 ret i32 %r252}253 254define i32 @in_constmask_commutativity_1_1(i32 %x, i32 %y) {255; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_1:256; CHECK-NOBMI: # %bb.0:257; CHECK-NOBMI-NEXT: movl %esi, %eax258; CHECK-NOBMI-NEXT: xorl %edi, %eax259; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555260; CHECK-NOBMI-NEXT: xorl %edi, %eax261; CHECK-NOBMI-NEXT: retq262;263; CHECK-BMI-LABEL: in_constmask_commutativity_1_1:264; CHECK-BMI: # %bb.0:265; CHECK-BMI-NEXT: movl %esi, %eax266; CHECK-BMI-NEXT: xorl %edi, %eax267; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555268; CHECK-BMI-NEXT: xorl %edi, %eax269; CHECK-BMI-NEXT: retq270 %n0 = xor i32 %x, %y271 %n1 = and i32 %n0, 1431655765272 %r = xor i32 %x, %n1 ; swapped, %x instead of %y273 ret i32 %r274}275 276; ============================================================================ ;277; Y is an 'and' too.278; ============================================================================ ;279 280define i32 @in_complex_y0_constmask(i32 %x, i32 %y_hi, i32 %y_low) {281; CHECK-NOBMI-LABEL: in_complex_y0_constmask:282; CHECK-NOBMI: # %bb.0:283; CHECK-NOBMI-NEXT: movl %edi, %eax284; CHECK-NOBMI-NEXT: andl %edx, %esi285; CHECK-NOBMI-NEXT: xorl %esi, %eax286; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555287; CHECK-NOBMI-NEXT: xorl %esi, %eax288; CHECK-NOBMI-NEXT: retq289;290; CHECK-BMI-LABEL: in_complex_y0_constmask:291; CHECK-BMI: # %bb.0:292; CHECK-BMI-NEXT: movl %edi, %eax293; CHECK-BMI-NEXT: andl %edx, %esi294; CHECK-BMI-NEXT: xorl %esi, %eax295; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555296; CHECK-BMI-NEXT: xorl %esi, %eax297; CHECK-BMI-NEXT: retq298 %y = and i32 %y_hi, %y_low299 %n0 = xor i32 %x, %y300 %n1 = and i32 %n0, 1431655765301 %r = xor i32 %n1, %y302 ret i32 %r303}304 305define i32 @in_complex_y1_constmask(i32 %x, i32 %y_hi, i32 %y_low) {306; CHECK-NOBMI-LABEL: in_complex_y1_constmask:307; CHECK-NOBMI: # %bb.0:308; CHECK-NOBMI-NEXT: movl %edi, %eax309; CHECK-NOBMI-NEXT: andl %edx, %esi310; CHECK-NOBMI-NEXT: xorl %esi, %eax311; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555312; CHECK-NOBMI-NEXT: xorl %esi, %eax313; CHECK-NOBMI-NEXT: retq314;315; CHECK-BMI-LABEL: in_complex_y1_constmask:316; CHECK-BMI: # %bb.0:317; CHECK-BMI-NEXT: movl %edi, %eax318; CHECK-BMI-NEXT: andl %edx, %esi319; CHECK-BMI-NEXT: xorl %esi, %eax320; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555321; CHECK-BMI-NEXT: xorl %esi, %eax322; CHECK-BMI-NEXT: retq323 %y = and i32 %y_hi, %y_low324 %n0 = xor i32 %x, %y325 %n1 = and i32 %n0, 1431655765326 %r = xor i32 %y, %n1327 ret i32 %r328}329 330; ============================================================================ ;331; Negative tests. Should not be folded.332; ============================================================================ ;333 334; Multi-use tests.335 336declare void @use32(i32) nounwind337 338define i32 @in_multiuse_A_constmask(i32 %x, i32 %y, i32 %z) nounwind {339; CHECK-NOBMI-LABEL: in_multiuse_A_constmask:340; CHECK-NOBMI: # %bb.0:341; CHECK-NOBMI-NEXT: pushq %rbp342; CHECK-NOBMI-NEXT: pushq %rbx343; CHECK-NOBMI-NEXT: pushq %rax344; CHECK-NOBMI-NEXT: movl %esi, %ebx345; CHECK-NOBMI-NEXT: movl %edi, %ebp346; CHECK-NOBMI-NEXT: xorl %esi, %ebp347; CHECK-NOBMI-NEXT: andl $1431655765, %ebp # imm = 0x55555555348; CHECK-NOBMI-NEXT: movl %ebp, %edi349; CHECK-NOBMI-NEXT: callq use32@PLT350; CHECK-NOBMI-NEXT: xorl %ebx, %ebp351; CHECK-NOBMI-NEXT: movl %ebp, %eax352; CHECK-NOBMI-NEXT: addq $8, %rsp353; CHECK-NOBMI-NEXT: popq %rbx354; CHECK-NOBMI-NEXT: popq %rbp355; CHECK-NOBMI-NEXT: retq356;357; CHECK-BMI-LABEL: in_multiuse_A_constmask:358; CHECK-BMI: # %bb.0:359; CHECK-BMI-NEXT: pushq %rbp360; CHECK-BMI-NEXT: pushq %rbx361; CHECK-BMI-NEXT: pushq %rax362; CHECK-BMI-NEXT: movl %esi, %ebx363; CHECK-BMI-NEXT: movl %edi, %ebp364; CHECK-BMI-NEXT: xorl %esi, %ebp365; CHECK-BMI-NEXT: andl $1431655765, %ebp # imm = 0x55555555366; CHECK-BMI-NEXT: movl %ebp, %edi367; CHECK-BMI-NEXT: callq use32@PLT368; CHECK-BMI-NEXT: xorl %ebx, %ebp369; CHECK-BMI-NEXT: movl %ebp, %eax370; CHECK-BMI-NEXT: addq $8, %rsp371; CHECK-BMI-NEXT: popq %rbx372; CHECK-BMI-NEXT: popq %rbp373; CHECK-BMI-NEXT: retq374 %n0 = xor i32 %x, %y375 %n1 = and i32 %n0, 1431655765376 call void @use32(i32 %n1)377 %r = xor i32 %n1, %y378 ret i32 %r379}380 381define i32 @in_multiuse_B_constmask(i32 %x, i32 %y, i32 %z) nounwind {382; CHECK-NOBMI-LABEL: in_multiuse_B_constmask:383; CHECK-NOBMI: # %bb.0:384; CHECK-NOBMI-NEXT: pushq %rbp385; CHECK-NOBMI-NEXT: pushq %rbx386; CHECK-NOBMI-NEXT: pushq %rax387; CHECK-NOBMI-NEXT: movl %esi, %ebx388; CHECK-NOBMI-NEXT: xorl %esi, %edi389; CHECK-NOBMI-NEXT: movl %edi, %ebp390; CHECK-NOBMI-NEXT: andl $1431655765, %ebp # imm = 0x55555555391; CHECK-NOBMI-NEXT: callq use32@PLT392; CHECK-NOBMI-NEXT: xorl %ebx, %ebp393; CHECK-NOBMI-NEXT: movl %ebp, %eax394; CHECK-NOBMI-NEXT: addq $8, %rsp395; CHECK-NOBMI-NEXT: popq %rbx396; CHECK-NOBMI-NEXT: popq %rbp397; CHECK-NOBMI-NEXT: retq398;399; CHECK-BMI-LABEL: in_multiuse_B_constmask:400; CHECK-BMI: # %bb.0:401; CHECK-BMI-NEXT: pushq %rbp402; CHECK-BMI-NEXT: pushq %rbx403; CHECK-BMI-NEXT: pushq %rax404; CHECK-BMI-NEXT: movl %esi, %ebx405; CHECK-BMI-NEXT: xorl %esi, %edi406; CHECK-BMI-NEXT: movl %edi, %ebp407; CHECK-BMI-NEXT: andl $1431655765, %ebp # imm = 0x55555555408; CHECK-BMI-NEXT: callq use32@PLT409; CHECK-BMI-NEXT: xorl %ebx, %ebp410; CHECK-BMI-NEXT: movl %ebp, %eax411; CHECK-BMI-NEXT: addq $8, %rsp412; CHECK-BMI-NEXT: popq %rbx413; CHECK-BMI-NEXT: popq %rbp414; CHECK-BMI-NEXT: retq415 %n0 = xor i32 %x, %y416 %n1 = and i32 %n0, 1431655765417 call void @use32(i32 %n0)418 %r = xor i32 %n1, %y419 ret i32 %r420}421 422; Various bad variants423 424define i32 @n0_badconstmask(i32 %x, i32 %y) {425; CHECK-NOBMI-LABEL: n0_badconstmask:426; CHECK-NOBMI: # %bb.0:427; CHECK-NOBMI-NEXT: movl %esi, %eax428; CHECK-NOBMI-NEXT: andl $1431655765, %edi # imm = 0x55555555429; CHECK-NOBMI-NEXT: andl $-1431655765, %eax # imm = 0xAAAAAAAB430; CHECK-NOBMI-NEXT: orl %edi, %eax431; CHECK-NOBMI-NEXT: retq432;433; CHECK-BMI-LABEL: n0_badconstmask:434; CHECK-BMI: # %bb.0:435; CHECK-BMI-NEXT: movl %esi, %eax436; CHECK-BMI-NEXT: andl $1431655765, %edi # imm = 0x55555555437; CHECK-BMI-NEXT: andl $-1431655765, %eax # imm = 0xAAAAAAAB438; CHECK-BMI-NEXT: orl %edi, %eax439; CHECK-BMI-NEXT: retq440 %mx = and i32 %x, 1431655765441 %my = and i32 %y, -1431655765 ; instead of -1431655766442 %r = or i32 %mx, %my443 ret i32 %r444}445 446define i32 @n1_thirdvar_constmask(i32 %x, i32 %y, i32 %z) {447; CHECK-NOBMI-LABEL: n1_thirdvar_constmask:448; CHECK-NOBMI: # %bb.0:449; CHECK-NOBMI-NEXT: movl %edi, %eax450; CHECK-NOBMI-NEXT: xorl %esi, %eax451; CHECK-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555452; CHECK-NOBMI-NEXT: xorl %edx, %eax453; CHECK-NOBMI-NEXT: retq454;455; CHECK-BMI-LABEL: n1_thirdvar_constmask:456; CHECK-BMI: # %bb.0:457; CHECK-BMI-NEXT: movl %edi, %eax458; CHECK-BMI-NEXT: xorl %esi, %eax459; CHECK-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555460; CHECK-BMI-NEXT: xorl %edx, %eax461; CHECK-BMI-NEXT: retq462 %n0 = xor i32 %x, %y463 %n1 = and i32 %n0, 1431655765464 %r = xor i32 %n1, %z ; instead of %y465 ret i32 %r466}467