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: [byte3] [byte0]8; Y: [byte2][byte1]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 $60, %dil16; CHECK-NOBMI-NEXT: andb $-61, %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 $60, %dil26; CHECK-BMI-NEXT: andb $-61, %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, 6031 %my = and i8 %y, -6132 %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 $4080, %edi # imm = 0xFF042; CHECK-NOBMI-NEXT: andl $-4081, %esi # imm = 0xF00F43; 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 $4080, %edi # imm = 0xFF052; CHECK-BMI-NEXT: andl $-4081, %esi # imm = 0xF00F53; 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, 408057 %my = and i16 %y, -408158 %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 $16776960, %edi # imm = 0xFFFF0068; CHECK-NOBMI-NEXT: andl $-16776961, %esi # imm = 0xFF0000FF69; 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 $16776960, %edi # imm = 0xFFFF0077; CHECK-BMI-NEXT: andl $-16776961, %esi # imm = 0xFF0000FF78; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax79; CHECK-BMI-NEXT: retq80 %mx = and i32 %x, 1677696081 %my = and i32 %y, -1677696182 %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 $281474976645120, %rcx # imm = 0xFFFFFFFF000090; CHECK-NOBMI-NEXT: andq %rdi, %rcx91; CHECK-NOBMI-NEXT: movabsq $-281474976645121, %rax # imm = 0xFFFF00000000FFFF92; 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 $281474976645120, %rcx # imm = 0xFFFFFFFF000099; CHECK-BMI-NEXT: andq %rdi, %rcx100; CHECK-BMI-NEXT: movabsq $-281474976645121, %rax # imm = 0xFFFF00000000FFFF101; CHECK-BMI-NEXT: andq %rsi, %rax102; CHECK-BMI-NEXT: orq %rcx, %rax103; CHECK-BMI-NEXT: retq104 %mx = and i64 %x, 281474976645120105 %my = and i64 %y, -281474976645121106 %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 $60, %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 $60, %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, 60134 %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 $4080, %eax # imm = 0xFF0144; 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 $4080, %eax # imm = 0xFF0153; 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, 4080158 %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 $16776960, %eax # imm = 0xFFFF00168; 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 $16776960, %eax # imm = 0xFFFF00176; CHECK-BMI-NEXT: xorl %esi, %eax177; CHECK-BMI-NEXT: retq178 %n0 = xor i32 %x, %y179 %n1 = and i32 %n0, 16776960180 %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 $281474976645120, %rax # imm = 0xFFFFFFFF0000189; 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 $281474976645120, %rax # imm = 0xFFFFFFFF0000197; 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, 281474976645120202 %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 $16776960, %eax # imm = 0xFFFF00216; 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 $16776960, %eax # imm = 0xFFFF00224; CHECK-BMI-NEXT: xorl %esi, %eax225; CHECK-BMI-NEXT: retq226 %n0 = xor i32 %x, %y227 %n1 = and i32 %n0, 16776960228 %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 $16776960, %eax # imm = 0xFFFF00238; 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 $16776960, %eax # imm = 0xFFFF00246; CHECK-BMI-NEXT: xorl %edi, %eax247; CHECK-BMI-NEXT: retq248 %n0 = xor i32 %x, %y249 %n1 = and i32 %n0, 16776960250 %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 $16776960, %eax # imm = 0xFFFF00260; 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 $16776960, %eax # imm = 0xFFFF00268; CHECK-BMI-NEXT: xorl %edi, %eax269; CHECK-BMI-NEXT: retq270 %n0 = xor i32 %x, %y271 %n1 = and i32 %n0, 16776960272 %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 $16776960, %eax # imm = 0xFFFF00287; 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 $16776960, %eax # imm = 0xFFFF00296; 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, 16776960301 %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 $16776960, %eax # imm = 0xFFFF00312; 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 $16776960, %eax # imm = 0xFFFF00321; 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, 16776960326 %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 $16776960, %ebp # imm = 0xFFFF00348; 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 $16776960, %ebp # imm = 0xFFFF00366; 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, 16776960376 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 $16776960, %ebp # imm = 0xFFFF00391; 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 $16776960, %ebp # imm = 0xFFFF00408; 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, 16776960417 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 $16776960, %edi # imm = 0xFFFF00429; CHECK-NOBMI-NEXT: andl $-16776960, %eax # imm = 0xFF000100430; 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 $16776960, %edi # imm = 0xFFFF00437; CHECK-BMI-NEXT: andl $-16776960, %eax # imm = 0xFF000100438; CHECK-BMI-NEXT: orl %edi, %eax439; CHECK-BMI-NEXT: retq440 %mx = and i32 %x, 16776960441 %my = and i32 %y, -16776960 ; instead of -16776961442 %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 $16776960, %eax # imm = 0xFFFF00452; 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 $16776960, %eax # imm = 0xFFFF00460; CHECK-BMI-NEXT: xorl %edx, %eax461; CHECK-BMI-NEXT: retq462 %n0 = xor i32 %x, %y463 %n1 = and i32 %n0, 16776960464 %r = xor i32 %n1, %z ; instead of %y465 ret i32 %r466}467