1032 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; https://bugs.llvm.org/show_bug.cgi?id=371045 6define i8 @out8(i8 %x, i8 %y, i8 %mask) {7; CHECK-NOBMI-LABEL: out8:8; CHECK-NOBMI: # %bb.0:9; CHECK-NOBMI-NEXT: movl %edi, %eax10; CHECK-NOBMI-NEXT: xorl %esi, %eax11; CHECK-NOBMI-NEXT: andl %edx, %eax12; CHECK-NOBMI-NEXT: xorl %esi, %eax13; CHECK-NOBMI-NEXT: # kill: def $al killed $al killed $eax14; CHECK-NOBMI-NEXT: retq15;16; CHECK-BMI-LABEL: out8:17; CHECK-BMI: # %bb.0:18; CHECK-BMI-NEXT: andnl %esi, %edx, %eax19; CHECK-BMI-NEXT: andl %edx, %edi20; CHECK-BMI-NEXT: orl %edi, %eax21; CHECK-BMI-NEXT: # kill: def $al killed $al killed $eax22; CHECK-BMI-NEXT: retq23 %mx = and i8 %x, %mask24 %notmask = xor i8 %mask, -125 %my = and i8 %y, %notmask26 %r = or i8 %mx, %my27 ret i8 %r28}29 30define i16 @out16(i16 %x, i16 %y, i16 %mask) {31; CHECK-NOBMI-LABEL: out16:32; CHECK-NOBMI: # %bb.0:33; CHECK-NOBMI-NEXT: movl %edi, %eax34; CHECK-NOBMI-NEXT: xorl %esi, %eax35; CHECK-NOBMI-NEXT: andl %edx, %eax36; CHECK-NOBMI-NEXT: xorl %esi, %eax37; CHECK-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax38; CHECK-NOBMI-NEXT: retq39;40; CHECK-BMI-LABEL: out16:41; CHECK-BMI: # %bb.0:42; CHECK-BMI-NEXT: andnl %esi, %edx, %eax43; CHECK-BMI-NEXT: andl %edx, %edi44; CHECK-BMI-NEXT: orl %edi, %eax45; CHECK-BMI-NEXT: # kill: def $ax killed $ax killed $eax46; CHECK-BMI-NEXT: retq47 %mx = and i16 %x, %mask48 %notmask = xor i16 %mask, -149 %my = and i16 %y, %notmask50 %r = or i16 %mx, %my51 ret i16 %r52}53 54define i32 @out32(i32 %x, i32 %y, i32 %mask) {55; CHECK-NOBMI-LABEL: out32:56; CHECK-NOBMI: # %bb.0:57; CHECK-NOBMI-NEXT: movl %edi, %eax58; CHECK-NOBMI-NEXT: xorl %esi, %eax59; CHECK-NOBMI-NEXT: andl %edx, %eax60; CHECK-NOBMI-NEXT: xorl %esi, %eax61; CHECK-NOBMI-NEXT: retq62;63; CHECK-BMI-LABEL: out32:64; CHECK-BMI: # %bb.0:65; CHECK-BMI-NEXT: andl %edx, %edi66; CHECK-BMI-NEXT: andnl %esi, %edx, %eax67; CHECK-BMI-NEXT: orl %edi, %eax68; CHECK-BMI-NEXT: retq69 %mx = and i32 %x, %mask70 %notmask = xor i32 %mask, -171 %my = and i32 %y, %notmask72 %r = or i32 %mx, %my73 ret i32 %r74}75 76define i64 @out64(i64 %x, i64 %y, i64 %mask) {77; CHECK-NOBMI-LABEL: out64:78; CHECK-NOBMI: # %bb.0:79; CHECK-NOBMI-NEXT: movq %rdi, %rax80; CHECK-NOBMI-NEXT: xorq %rsi, %rax81; CHECK-NOBMI-NEXT: andq %rdx, %rax82; CHECK-NOBMI-NEXT: xorq %rsi, %rax83; CHECK-NOBMI-NEXT: retq84;85; CHECK-BMI-LABEL: out64:86; CHECK-BMI: # %bb.0:87; CHECK-BMI-NEXT: andq %rdx, %rdi88; CHECK-BMI-NEXT: andnq %rsi, %rdx, %rax89; CHECK-BMI-NEXT: orq %rdi, %rax90; CHECK-BMI-NEXT: retq91 %mx = and i64 %x, %mask92 %notmask = xor i64 %mask, -193 %my = and i64 %y, %notmask94 %r = or i64 %mx, %my95 ret i64 %r96}97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98; Should be the same as the previous one.99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100 101define i8 @in8(i8 %x, i8 %y, i8 %mask) {102; CHECK-NOBMI-LABEL: in8:103; CHECK-NOBMI: # %bb.0:104; CHECK-NOBMI-NEXT: movl %edi, %eax105; CHECK-NOBMI-NEXT: xorl %esi, %eax106; CHECK-NOBMI-NEXT: andl %edx, %eax107; CHECK-NOBMI-NEXT: xorl %esi, %eax108; CHECK-NOBMI-NEXT: # kill: def $al killed $al killed $eax109; CHECK-NOBMI-NEXT: retq110;111; CHECK-BMI-LABEL: in8:112; CHECK-BMI: # %bb.0:113; CHECK-BMI-NEXT: andnl %esi, %edx, %eax114; CHECK-BMI-NEXT: andl %edx, %edi115; CHECK-BMI-NEXT: orl %edi, %eax116; CHECK-BMI-NEXT: # kill: def $al killed $al killed $eax117; CHECK-BMI-NEXT: retq118 %n0 = xor i8 %x, %y119 %n1 = and i8 %n0, %mask120 %r = xor i8 %n1, %y121 ret i8 %r122}123 124define i16 @in16(i16 %x, i16 %y, i16 %mask) {125; CHECK-NOBMI-LABEL: in16:126; CHECK-NOBMI: # %bb.0:127; CHECK-NOBMI-NEXT: movl %edi, %eax128; CHECK-NOBMI-NEXT: xorl %esi, %eax129; CHECK-NOBMI-NEXT: andl %edx, %eax130; CHECK-NOBMI-NEXT: xorl %esi, %eax131; CHECK-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax132; CHECK-NOBMI-NEXT: retq133;134; CHECK-BMI-LABEL: in16:135; CHECK-BMI: # %bb.0:136; CHECK-BMI-NEXT: andnl %esi, %edx, %eax137; CHECK-BMI-NEXT: andl %edx, %edi138; CHECK-BMI-NEXT: orl %edi, %eax139; CHECK-BMI-NEXT: # kill: def $ax killed $ax killed $eax140; CHECK-BMI-NEXT: retq141 %n0 = xor i16 %x, %y142 %n1 = and i16 %n0, %mask143 %r = xor i16 %n1, %y144 ret i16 %r145}146 147define i32 @in32(i32 %x, i32 %y, i32 %mask) {148; CHECK-NOBMI-LABEL: in32:149; CHECK-NOBMI: # %bb.0:150; CHECK-NOBMI-NEXT: movl %edi, %eax151; CHECK-NOBMI-NEXT: xorl %esi, %eax152; CHECK-NOBMI-NEXT: andl %edx, %eax153; CHECK-NOBMI-NEXT: xorl %esi, %eax154; CHECK-NOBMI-NEXT: retq155;156; CHECK-BMI-LABEL: in32:157; CHECK-BMI: # %bb.0:158; CHECK-BMI-NEXT: andnl %esi, %edx, %eax159; CHECK-BMI-NEXT: andl %edx, %edi160; CHECK-BMI-NEXT: orl %edi, %eax161; CHECK-BMI-NEXT: retq162 %n0 = xor i32 %x, %y163 %n1 = and i32 %n0, %mask164 %r = xor i32 %n1, %y165 ret i32 %r166}167 168define i64 @in64(i64 %x, i64 %y, i64 %mask) {169; CHECK-NOBMI-LABEL: in64:170; CHECK-NOBMI: # %bb.0:171; CHECK-NOBMI-NEXT: movq %rdi, %rax172; CHECK-NOBMI-NEXT: xorq %rsi, %rax173; CHECK-NOBMI-NEXT: andq %rdx, %rax174; CHECK-NOBMI-NEXT: xorq %rsi, %rax175; CHECK-NOBMI-NEXT: retq176;177; CHECK-BMI-LABEL: in64:178; CHECK-BMI: # %bb.0:179; CHECK-BMI-NEXT: andnq %rsi, %rdx, %rax180; CHECK-BMI-NEXT: andq %rdx, %rdi181; CHECK-BMI-NEXT: orq %rdi, %rax182; CHECK-BMI-NEXT: retq183 %n0 = xor i64 %x, %y184 %n1 = and i64 %n0, %mask185 %r = xor i64 %n1, %y186 ret i64 %r187}188; ============================================================================ ;189; Commutativity tests.190; ============================================================================ ;191define i32 @in_commutativity_0_0_1(i32 %x, i32 %y, i32 %mask) {192; CHECK-NOBMI-LABEL: in_commutativity_0_0_1:193; CHECK-NOBMI: # %bb.0:194; CHECK-NOBMI-NEXT: movl %edi, %eax195; CHECK-NOBMI-NEXT: xorl %esi, %eax196; CHECK-NOBMI-NEXT: andl %edx, %eax197; CHECK-NOBMI-NEXT: xorl %esi, %eax198; CHECK-NOBMI-NEXT: retq199;200; CHECK-BMI-LABEL: in_commutativity_0_0_1:201; CHECK-BMI: # %bb.0:202; CHECK-BMI-NEXT: andnl %esi, %edx, %eax203; CHECK-BMI-NEXT: andl %edx, %edi204; CHECK-BMI-NEXT: orl %edi, %eax205; CHECK-BMI-NEXT: retq206 %n0 = xor i32 %x, %y207 %n1 = and i32 %mask, %n0 ; swapped208 %r = xor i32 %n1, %y209 ret i32 %r210}211define i32 @in_commutativity_0_1_0(i32 %x, i32 %y, i32 %mask) {212; CHECK-NOBMI-LABEL: in_commutativity_0_1_0:213; CHECK-NOBMI: # %bb.0:214; CHECK-NOBMI-NEXT: movl %edi, %eax215; CHECK-NOBMI-NEXT: xorl %esi, %eax216; CHECK-NOBMI-NEXT: andl %edx, %eax217; CHECK-NOBMI-NEXT: xorl %esi, %eax218; CHECK-NOBMI-NEXT: retq219;220; CHECK-BMI-LABEL: in_commutativity_0_1_0:221; CHECK-BMI: # %bb.0:222; CHECK-BMI-NEXT: andnl %esi, %edx, %eax223; CHECK-BMI-NEXT: andl %edx, %edi224; CHECK-BMI-NEXT: orl %edi, %eax225; CHECK-BMI-NEXT: retq226 %n0 = xor i32 %x, %y227 %n1 = and i32 %n0, %mask228 %r = xor i32 %y, %n1 ; swapped229 ret i32 %r230}231define i32 @in_commutativity_0_1_1(i32 %x, i32 %y, i32 %mask) {232; CHECK-NOBMI-LABEL: in_commutativity_0_1_1:233; CHECK-NOBMI: # %bb.0:234; CHECK-NOBMI-NEXT: movl %edi, %eax235; CHECK-NOBMI-NEXT: xorl %esi, %eax236; CHECK-NOBMI-NEXT: andl %edx, %eax237; CHECK-NOBMI-NEXT: xorl %esi, %eax238; CHECK-NOBMI-NEXT: retq239;240; CHECK-BMI-LABEL: in_commutativity_0_1_1:241; CHECK-BMI: # %bb.0:242; CHECK-BMI-NEXT: andnl %esi, %edx, %eax243; CHECK-BMI-NEXT: andl %edx, %edi244; CHECK-BMI-NEXT: orl %edi, %eax245; CHECK-BMI-NEXT: retq246 %n0 = xor i32 %x, %y247 %n1 = and i32 %mask, %n0 ; swapped248 %r = xor i32 %y, %n1 ; swapped249 ret i32 %r250}251define i32 @in_commutativity_1_0_0(i32 %x, i32 %y, i32 %mask) {252; CHECK-NOBMI-LABEL: in_commutativity_1_0_0:253; CHECK-NOBMI: # %bb.0:254; CHECK-NOBMI-NEXT: movl %esi, %eax255; CHECK-NOBMI-NEXT: xorl %edi, %eax256; CHECK-NOBMI-NEXT: andl %edx, %eax257; CHECK-NOBMI-NEXT: xorl %edi, %eax258; CHECK-NOBMI-NEXT: retq259;260; CHECK-BMI-LABEL: in_commutativity_1_0_0:261; CHECK-BMI: # %bb.0:262; CHECK-BMI-NEXT: andnl %edi, %edx, %eax263; CHECK-BMI-NEXT: andl %edx, %esi264; CHECK-BMI-NEXT: orl %esi, %eax265; CHECK-BMI-NEXT: retq266 %n0 = xor i32 %x, %y267 %n1 = and i32 %n0, %mask268 %r = xor i32 %n1, %x ; %x instead of %y269 ret i32 %r270}271define i32 @in_commutativity_1_0_1(i32 %x, i32 %y, i32 %mask) {272; CHECK-NOBMI-LABEL: in_commutativity_1_0_1:273; CHECK-NOBMI: # %bb.0:274; CHECK-NOBMI-NEXT: movl %esi, %eax275; CHECK-NOBMI-NEXT: xorl %edi, %eax276; CHECK-NOBMI-NEXT: andl %edx, %eax277; CHECK-NOBMI-NEXT: xorl %edi, %eax278; CHECK-NOBMI-NEXT: retq279;280; CHECK-BMI-LABEL: in_commutativity_1_0_1:281; CHECK-BMI: # %bb.0:282; CHECK-BMI-NEXT: andnl %edi, %edx, %eax283; CHECK-BMI-NEXT: andl %edx, %esi284; CHECK-BMI-NEXT: orl %esi, %eax285; CHECK-BMI-NEXT: retq286 %n0 = xor i32 %x, %y287 %n1 = and i32 %mask, %n0 ; swapped288 %r = xor i32 %n1, %x ; %x instead of %y289 ret i32 %r290}291define i32 @in_commutativity_1_1_0(i32 %x, i32 %y, i32 %mask) {292; CHECK-NOBMI-LABEL: in_commutativity_1_1_0:293; CHECK-NOBMI: # %bb.0:294; CHECK-NOBMI-NEXT: movl %esi, %eax295; CHECK-NOBMI-NEXT: xorl %edi, %eax296; CHECK-NOBMI-NEXT: andl %edx, %eax297; CHECK-NOBMI-NEXT: xorl %edi, %eax298; CHECK-NOBMI-NEXT: retq299;300; CHECK-BMI-LABEL: in_commutativity_1_1_0:301; CHECK-BMI: # %bb.0:302; CHECK-BMI-NEXT: andnl %edi, %edx, %eax303; CHECK-BMI-NEXT: andl %edx, %esi304; CHECK-BMI-NEXT: orl %esi, %eax305; CHECK-BMI-NEXT: retq306 %n0 = xor i32 %x, %y307 %n1 = and i32 %n0, %mask308 %r = xor i32 %x, %n1 ; swapped, %x instead of %y309 ret i32 %r310}311define i32 @in_commutativity_1_1_1(i32 %x, i32 %y, i32 %mask) {312; CHECK-NOBMI-LABEL: in_commutativity_1_1_1:313; CHECK-NOBMI: # %bb.0:314; CHECK-NOBMI-NEXT: movl %esi, %eax315; CHECK-NOBMI-NEXT: xorl %edi, %eax316; CHECK-NOBMI-NEXT: andl %edx, %eax317; CHECK-NOBMI-NEXT: xorl %edi, %eax318; CHECK-NOBMI-NEXT: retq319;320; CHECK-BMI-LABEL: in_commutativity_1_1_1:321; CHECK-BMI: # %bb.0:322; CHECK-BMI-NEXT: andnl %edi, %edx, %eax323; CHECK-BMI-NEXT: andl %edx, %esi324; CHECK-BMI-NEXT: orl %esi, %eax325; CHECK-BMI-NEXT: retq326 %n0 = xor i32 %x, %y327 %n1 = and i32 %mask, %n0 ; swapped328 %r = xor i32 %x, %n1 ; swapped, %x instead of %y329 ret i32 %r330}331; ============================================================================ ;332; Y is an 'and' too.333; ============================================================================ ;334define i32 @in_complex_y0(i32 %x, i32 %y_hi, i32 %y_low, i32 %mask) {335; CHECK-NOBMI-LABEL: in_complex_y0:336; CHECK-NOBMI: # %bb.0:337; CHECK-NOBMI-NEXT: movl %edi, %eax338; CHECK-NOBMI-NEXT: andl %edx, %esi339; CHECK-NOBMI-NEXT: xorl %esi, %eax340; CHECK-NOBMI-NEXT: andl %ecx, %eax341; CHECK-NOBMI-NEXT: xorl %esi, %eax342; CHECK-NOBMI-NEXT: retq343;344; CHECK-BMI-LABEL: in_complex_y0:345; CHECK-BMI: # %bb.0:346; CHECK-BMI-NEXT: andl %edx, %esi347; CHECK-BMI-NEXT: andl %ecx, %edi348; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax349; CHECK-BMI-NEXT: orl %edi, %eax350; CHECK-BMI-NEXT: retq351 %y = and i32 %y_hi, %y_low352 %n0 = xor i32 %x, %y353 %n1 = and i32 %n0, %mask354 %r = xor i32 %n1, %y355 ret i32 %r356}357define i32 @in_complex_y1(i32 %x, i32 %y_hi, i32 %y_low, i32 %mask) {358; CHECK-NOBMI-LABEL: in_complex_y1:359; CHECK-NOBMI: # %bb.0:360; CHECK-NOBMI-NEXT: movl %edi, %eax361; CHECK-NOBMI-NEXT: andl %edx, %esi362; CHECK-NOBMI-NEXT: xorl %esi, %eax363; CHECK-NOBMI-NEXT: andl %ecx, %eax364; CHECK-NOBMI-NEXT: xorl %esi, %eax365; CHECK-NOBMI-NEXT: retq366;367; CHECK-BMI-LABEL: in_complex_y1:368; CHECK-BMI: # %bb.0:369; CHECK-BMI-NEXT: andl %edx, %esi370; CHECK-BMI-NEXT: andl %ecx, %edi371; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax372; CHECK-BMI-NEXT: orl %edi, %eax373; CHECK-BMI-NEXT: retq374 %y = and i32 %y_hi, %y_low375 %n0 = xor i32 %x, %y376 %n1 = and i32 %n0, %mask377 %r = xor i32 %y, %n1378 ret i32 %r379}380; ============================================================================ ;381; M is an 'xor' too.382; ============================================================================ ;383define i32 @in_complex_m0(i32 %x, i32 %y, i32 %m_a, i32 %m_b) {384; CHECK-NOBMI-LABEL: in_complex_m0:385; CHECK-NOBMI: # %bb.0:386; CHECK-NOBMI-NEXT: movl %edi, %eax387; CHECK-NOBMI-NEXT: xorl %ecx, %edx388; CHECK-NOBMI-NEXT: xorl %esi, %eax389; CHECK-NOBMI-NEXT: andl %edx, %eax390; CHECK-NOBMI-NEXT: xorl %esi, %eax391; CHECK-NOBMI-NEXT: retq392;393; CHECK-BMI-LABEL: in_complex_m0:394; CHECK-BMI: # %bb.0:395; CHECK-BMI-NEXT: xorl %ecx, %edx396; CHECK-BMI-NEXT: andnl %esi, %edx, %eax397; CHECK-BMI-NEXT: andl %edi, %edx398; CHECK-BMI-NEXT: orl %edx, %eax399; CHECK-BMI-NEXT: retq400 %mask = xor i32 %m_a, %m_b401 %n0 = xor i32 %x, %y402 %n1 = and i32 %n0, %mask403 %r = xor i32 %n1, %y404 ret i32 %r405}406define i32 @in_complex_m1(i32 %x, i32 %y, i32 %m_a, i32 %m_b) {407; CHECK-NOBMI-LABEL: in_complex_m1:408; CHECK-NOBMI: # %bb.0:409; CHECK-NOBMI-NEXT: movl %edi, %eax410; CHECK-NOBMI-NEXT: xorl %ecx, %edx411; CHECK-NOBMI-NEXT: xorl %esi, %eax412; CHECK-NOBMI-NEXT: andl %edx, %eax413; CHECK-NOBMI-NEXT: xorl %esi, %eax414; CHECK-NOBMI-NEXT: retq415;416; CHECK-BMI-LABEL: in_complex_m1:417; CHECK-BMI: # %bb.0:418; CHECK-BMI-NEXT: xorl %ecx, %edx419; CHECK-BMI-NEXT: andnl %esi, %edx, %eax420; CHECK-BMI-NEXT: andl %edi, %edx421; CHECK-BMI-NEXT: orl %edx, %eax422; CHECK-BMI-NEXT: retq423 %mask = xor i32 %m_a, %m_b424 %n0 = xor i32 %x, %y425 %n1 = and i32 %mask, %n0426 %r = xor i32 %n1, %y427 ret i32 %r428}429; ============================================================================ ;430; Both Y and M are complex.431; ============================================================================ ;432define i32 @in_complex_y0_m0(i32 %x, i32 %y_hi, i32 %y_low, i32 %m_a, i32 %m_b) {433; CHECK-NOBMI-LABEL: in_complex_y0_m0:434; CHECK-NOBMI: # %bb.0:435; CHECK-NOBMI-NEXT: movl %edi, %eax436; CHECK-NOBMI-NEXT: andl %edx, %esi437; CHECK-NOBMI-NEXT: xorl %r8d, %ecx438; CHECK-NOBMI-NEXT: xorl %esi, %eax439; CHECK-NOBMI-NEXT: andl %ecx, %eax440; CHECK-NOBMI-NEXT: xorl %esi, %eax441; CHECK-NOBMI-NEXT: retq442;443; CHECK-BMI-LABEL: in_complex_y0_m0:444; CHECK-BMI: # %bb.0:445; CHECK-BMI-NEXT: andl %edx, %esi446; CHECK-BMI-NEXT: xorl %r8d, %ecx447; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax448; CHECK-BMI-NEXT: andl %edi, %ecx449; CHECK-BMI-NEXT: orl %ecx, %eax450; CHECK-BMI-NEXT: retq451 %y = and i32 %y_hi, %y_low452 %mask = xor i32 %m_a, %m_b453 %n0 = xor i32 %x, %y454 %n1 = and i32 %n0, %mask455 %r = xor i32 %n1, %y456 ret i32 %r457}458define i32 @in_complex_y1_m0(i32 %x, i32 %y_hi, i32 %y_low, i32 %m_a, i32 %m_b) {459; CHECK-NOBMI-LABEL: in_complex_y1_m0:460; CHECK-NOBMI: # %bb.0:461; CHECK-NOBMI-NEXT: movl %edi, %eax462; CHECK-NOBMI-NEXT: andl %edx, %esi463; CHECK-NOBMI-NEXT: xorl %r8d, %ecx464; CHECK-NOBMI-NEXT: xorl %esi, %eax465; CHECK-NOBMI-NEXT: andl %ecx, %eax466; CHECK-NOBMI-NEXT: xorl %esi, %eax467; CHECK-NOBMI-NEXT: retq468;469; CHECK-BMI-LABEL: in_complex_y1_m0:470; CHECK-BMI: # %bb.0:471; CHECK-BMI-NEXT: andl %edx, %esi472; CHECK-BMI-NEXT: xorl %r8d, %ecx473; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax474; CHECK-BMI-NEXT: andl %edi, %ecx475; CHECK-BMI-NEXT: orl %ecx, %eax476; CHECK-BMI-NEXT: retq477 %y = and i32 %y_hi, %y_low478 %mask = xor i32 %m_a, %m_b479 %n0 = xor i32 %x, %y480 %n1 = and i32 %n0, %mask481 %r = xor i32 %y, %n1482 ret i32 %r483}484define i32 @in_complex_y0_m1(i32 %x, i32 %y_hi, i32 %y_low, i32 %m_a, i32 %m_b) {485; CHECK-NOBMI-LABEL: in_complex_y0_m1:486; CHECK-NOBMI: # %bb.0:487; CHECK-NOBMI-NEXT: movl %edi, %eax488; CHECK-NOBMI-NEXT: andl %edx, %esi489; CHECK-NOBMI-NEXT: xorl %r8d, %ecx490; CHECK-NOBMI-NEXT: xorl %esi, %eax491; CHECK-NOBMI-NEXT: andl %ecx, %eax492; CHECK-NOBMI-NEXT: xorl %esi, %eax493; CHECK-NOBMI-NEXT: retq494;495; CHECK-BMI-LABEL: in_complex_y0_m1:496; CHECK-BMI: # %bb.0:497; CHECK-BMI-NEXT: andl %edx, %esi498; CHECK-BMI-NEXT: xorl %r8d, %ecx499; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax500; CHECK-BMI-NEXT: andl %edi, %ecx501; CHECK-BMI-NEXT: orl %ecx, %eax502; CHECK-BMI-NEXT: retq503 %y = and i32 %y_hi, %y_low504 %mask = xor i32 %m_a, %m_b505 %n0 = xor i32 %x, %y506 %n1 = and i32 %mask, %n0507 %r = xor i32 %n1, %y508 ret i32 %r509}510define i32 @in_complex_y1_m1(i32 %x, i32 %y_hi, i32 %y_low, i32 %m_a, i32 %m_b) {511; CHECK-NOBMI-LABEL: in_complex_y1_m1:512; CHECK-NOBMI: # %bb.0:513; CHECK-NOBMI-NEXT: movl %edi, %eax514; CHECK-NOBMI-NEXT: andl %edx, %esi515; CHECK-NOBMI-NEXT: xorl %r8d, %ecx516; CHECK-NOBMI-NEXT: xorl %esi, %eax517; CHECK-NOBMI-NEXT: andl %ecx, %eax518; CHECK-NOBMI-NEXT: xorl %esi, %eax519; CHECK-NOBMI-NEXT: retq520;521; CHECK-BMI-LABEL: in_complex_y1_m1:522; CHECK-BMI: # %bb.0:523; CHECK-BMI-NEXT: andl %edx, %esi524; CHECK-BMI-NEXT: xorl %r8d, %ecx525; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax526; CHECK-BMI-NEXT: andl %edi, %ecx527; CHECK-BMI-NEXT: orl %ecx, %eax528; CHECK-BMI-NEXT: retq529 %y = and i32 %y_hi, %y_low530 %mask = xor i32 %m_a, %m_b531 %n0 = xor i32 %x, %y532 %n1 = and i32 %mask, %n0533 %r = xor i32 %y, %n1534 ret i32 %r535}536; ============================================================================ ;537; Various cases with %x and/or %y being a constant538; ============================================================================ ;539define i32 @out_constant_varx_mone(i32 %x, i32 %y, i32 %mask) {540; CHECK-NOBMI-LABEL: out_constant_varx_mone:541; CHECK-NOBMI: # %bb.0:542; CHECK-NOBMI-NEXT: andl %edx, %edi543; CHECK-NOBMI-NEXT: movl %edx, %eax544; CHECK-NOBMI-NEXT: notl %eax545; CHECK-NOBMI-NEXT: orl %edi, %eax546; CHECK-NOBMI-NEXT: retq547;548; CHECK-BMI-LABEL: out_constant_varx_mone:549; CHECK-BMI: # %bb.0:550; CHECK-BMI-NEXT: andl %edx, %edi551; CHECK-BMI-NEXT: movl %edx, %eax552; CHECK-BMI-NEXT: notl %eax553; CHECK-BMI-NEXT: orl %edi, %eax554; CHECK-BMI-NEXT: retq555 %notmask = xor i32 %mask, -1556 %mx = and i32 %mask, %x557 %my = and i32 %notmask, -1558 %r = or i32 %mx, %my559 ret i32 %r560}561define i32 @in_constant_varx_mone(i32 %x, i32 %y, i32 %mask) {562; CHECK-NOBMI-LABEL: in_constant_varx_mone:563; CHECK-NOBMI: # %bb.0:564; CHECK-NOBMI-NEXT: movl %edi, %eax565; CHECK-NOBMI-NEXT: notl %eax566; CHECK-NOBMI-NEXT: andl %edx, %eax567; CHECK-NOBMI-NEXT: notl %eax568; CHECK-NOBMI-NEXT: retq569;570; CHECK-BMI-LABEL: in_constant_varx_mone:571; CHECK-BMI: # %bb.0:572; CHECK-BMI-NEXT: andnl %edx, %edi, %eax573; CHECK-BMI-NEXT: notl %eax574; CHECK-BMI-NEXT: retq575 %n0 = xor i32 %x, -1 ; %x576 %n1 = and i32 %n0, %mask577 %r = xor i32 %n1, -1578 ret i32 %r579}580; This is not a canonical form. Testing for completeness only.581define i32 @out_constant_varx_mone_invmask(i32 %x, i32 %y, i32 %mask) {582; CHECK-NOBMI-LABEL: out_constant_varx_mone_invmask:583; CHECK-NOBMI: # %bb.0:584; CHECK-NOBMI-NEXT: movl %edi, %eax585; CHECK-NOBMI-NEXT: orl %edx, %eax586; CHECK-NOBMI-NEXT: retq587;588; CHECK-BMI-LABEL: out_constant_varx_mone_invmask:589; CHECK-BMI: # %bb.0:590; CHECK-BMI-NEXT: movl %edi, %eax591; CHECK-BMI-NEXT: orl %edx, %eax592; CHECK-BMI-NEXT: retq593 %notmask = xor i32 %mask, -1594 %mx = and i32 %notmask, %x595 %my = and i32 %mask, -1596 %r = or i32 %mx, %my597 ret i32 %r598}599; This is not a canonical form. Testing for completeness only.600define i32 @in_constant_varx_mone_invmask(i32 %x, i32 %y, i32 %mask) {601; CHECK-NOBMI-LABEL: in_constant_varx_mone_invmask:602; CHECK-NOBMI: # %bb.0:603; CHECK-NOBMI-NEXT: movl %edi, %eax604; CHECK-NOBMI-NEXT: notl %edx605; CHECK-NOBMI-NEXT: notl %eax606; CHECK-NOBMI-NEXT: andl %edx, %eax607; CHECK-NOBMI-NEXT: notl %eax608; CHECK-NOBMI-NEXT: retq609;610; CHECK-BMI-LABEL: in_constant_varx_mone_invmask:611; CHECK-BMI: # %bb.0:612; CHECK-BMI-NEXT: notl %edx613; CHECK-BMI-NEXT: andnl %edx, %edi, %eax614; CHECK-BMI-NEXT: notl %eax615; CHECK-BMI-NEXT: retq616 %notmask = xor i32 %mask, -1617 %n0 = xor i32 %x, -1 ; %x618 %n1 = and i32 %n0, %notmask619 %r = xor i32 %n1, -1620 ret i32 %r621}622define i32 @out_constant_varx_42(i32 %x, i32 %y, i32 %mask) {623; CHECK-NOBMI-LABEL: out_constant_varx_42:624; CHECK-NOBMI: # %bb.0:625; CHECK-NOBMI-NEXT: movl %edi, %eax626; CHECK-NOBMI-NEXT: xorl $42, %eax627; CHECK-NOBMI-NEXT: andl %edx, %eax628; CHECK-NOBMI-NEXT: xorl $42, %eax629; CHECK-NOBMI-NEXT: retq630;631; CHECK-BMI-LABEL: out_constant_varx_42:632; CHECK-BMI: # %bb.0:633; CHECK-BMI-NEXT: andl %edx, %edi634; CHECK-BMI-NEXT: movl %edx, %eax635; CHECK-BMI-NEXT: notl %eax636; CHECK-BMI-NEXT: andl $42, %eax637; CHECK-BMI-NEXT: orl %edi, %eax638; CHECK-BMI-NEXT: retq639 %notmask = xor i32 %mask, -1640 %mx = and i32 %mask, %x641 %my = and i32 %notmask, 42642 %r = or i32 %mx, %my643 ret i32 %r644}645define i32 @in_constant_varx_42(i32 %x, i32 %y, i32 %mask) {646; CHECK-NOBMI-LABEL: in_constant_varx_42:647; CHECK-NOBMI: # %bb.0:648; CHECK-NOBMI-NEXT: movl %edi, %eax649; CHECK-NOBMI-NEXT: xorl $42, %eax650; CHECK-NOBMI-NEXT: andl %edx, %eax651; CHECK-NOBMI-NEXT: xorl $42, %eax652; CHECK-NOBMI-NEXT: retq653;654; CHECK-BMI-LABEL: in_constant_varx_42:655; CHECK-BMI: # %bb.0:656; CHECK-BMI-NEXT: andnl %edx, %edi, %eax657; CHECK-BMI-NEXT: orl $42, %edx658; CHECK-BMI-NEXT: andnl %edx, %eax, %eax659; CHECK-BMI-NEXT: retq660 %n0 = xor i32 %x, 42 ; %x661 %n1 = and i32 %n0, %mask662 %r = xor i32 %n1, 42663 ret i32 %r664}665; This is not a canonical form. Testing for completeness only.666define i32 @out_constant_varx_42_invmask(i32 %x, i32 %y, i32 %mask) {667; CHECK-NOBMI-LABEL: out_constant_varx_42_invmask:668; CHECK-NOBMI: # %bb.0:669; CHECK-NOBMI-NEXT: movl %edi, %eax670; CHECK-NOBMI-NEXT: xorl $42, %eax671; CHECK-NOBMI-NEXT: andl %edx, %eax672; CHECK-NOBMI-NEXT: xorl %edi, %eax673; CHECK-NOBMI-NEXT: retq674;675; CHECK-BMI-LABEL: out_constant_varx_42_invmask:676; CHECK-BMI: # %bb.0:677; CHECK-BMI-NEXT: andnl %edi, %edx, %eax678; CHECK-BMI-NEXT: andl $42, %edx679; CHECK-BMI-NEXT: orl %edx, %eax680; CHECK-BMI-NEXT: retq681 %notmask = xor i32 %mask, -1682 %mx = and i32 %notmask, %x683 %my = and i32 %mask, 42684 %r = or i32 %mx, %my685 ret i32 %r686}687; This is not a canonical form. Testing for completeness only.688define i32 @in_constant_varx_42_invmask(i32 %x, i32 %y, i32 %mask) {689; CHECK-NOBMI-LABEL: in_constant_varx_42_invmask:690; CHECK-NOBMI: # %bb.0:691; CHECK-NOBMI-NEXT: movl %edi, %eax692; CHECK-NOBMI-NEXT: notl %edx693; CHECK-NOBMI-NEXT: xorl $42, %eax694; CHECK-NOBMI-NEXT: andl %edx, %eax695; CHECK-NOBMI-NEXT: xorl $42, %eax696; CHECK-NOBMI-NEXT: retq697;698; CHECK-BMI-LABEL: in_constant_varx_42_invmask:699; CHECK-BMI: # %bb.0:700; CHECK-BMI-NEXT: andnl %edi, %edx, %eax701; CHECK-BMI-NEXT: andl $42, %edx702; CHECK-BMI-NEXT: orl %edx, %eax703; CHECK-BMI-NEXT: retq704 %notmask = xor i32 %mask, -1705 %n0 = xor i32 %x, 42 ; %x706 %n1 = and i32 %n0, %notmask707 %r = xor i32 %n1, 42708 ret i32 %r709}710define i32 @out_constant_mone_vary(i32 %x, i32 %y, i32 %mask) {711; CHECK-NOBMI-LABEL: out_constant_mone_vary:712; CHECK-NOBMI: # %bb.0:713; CHECK-NOBMI-NEXT: movl %esi, %eax714; CHECK-NOBMI-NEXT: orl %edx, %eax715; CHECK-NOBMI-NEXT: retq716;717; CHECK-BMI-LABEL: out_constant_mone_vary:718; CHECK-BMI: # %bb.0:719; CHECK-BMI-NEXT: movl %esi, %eax720; CHECK-BMI-NEXT: orl %edx, %eax721; CHECK-BMI-NEXT: retq722 %notmask = xor i32 %mask, -1723 %mx = and i32 %mask, -1724 %my = and i32 %notmask, %y725 %r = or i32 %mx, %my726 ret i32 %r727}728define i32 @in_constant_mone_vary(i32 %x, i32 %y, i32 %mask) {729; CHECK-NOBMI-LABEL: in_constant_mone_vary:730; CHECK-NOBMI: # %bb.0:731; CHECK-NOBMI-NEXT: movl %esi, %eax732; CHECK-NOBMI-NEXT: orl %edx, %eax733; CHECK-NOBMI-NEXT: retq734;735; CHECK-BMI-LABEL: in_constant_mone_vary:736; CHECK-BMI: # %bb.0:737; CHECK-BMI-NEXT: movl %esi, %eax738; CHECK-BMI-NEXT: orl %edx, %eax739; CHECK-BMI-NEXT: retq740 %n0 = xor i32 -1, %y ; %x741 %n1 = and i32 %n0, %mask742 %r = xor i32 %n1, %y743 ret i32 %r744}745; This is not a canonical form. Testing for completeness only.746define i32 @out_constant_mone_vary_invmask(i32 %x, i32 %y, i32 %mask) {747; CHECK-NOBMI-LABEL: out_constant_mone_vary_invmask:748; CHECK-NOBMI: # %bb.0:749; CHECK-NOBMI-NEXT: andl %edx, %esi750; CHECK-NOBMI-NEXT: movl %edx, %eax751; CHECK-NOBMI-NEXT: notl %eax752; CHECK-NOBMI-NEXT: orl %esi, %eax753; CHECK-NOBMI-NEXT: retq754;755; CHECK-BMI-LABEL: out_constant_mone_vary_invmask:756; CHECK-BMI: # %bb.0:757; CHECK-BMI-NEXT: andl %edx, %esi758; CHECK-BMI-NEXT: movl %edx, %eax759; CHECK-BMI-NEXT: notl %eax760; CHECK-BMI-NEXT: orl %esi, %eax761; CHECK-BMI-NEXT: retq762 %notmask = xor i32 %mask, -1763 %mx = and i32 %notmask, -1764 %my = and i32 %mask, %y765 %r = or i32 %mx, %my766 ret i32 %r767}768; This is not a canonical form. Testing for completeness only.769define i32 @in_constant_mone_vary_invmask(i32 %x, i32 %y, i32 %mask) {770; CHECK-NOBMI-LABEL: in_constant_mone_vary_invmask:771; CHECK-NOBMI: # %bb.0:772; CHECK-NOBMI-NEXT: movl %edx, %eax773; CHECK-NOBMI-NEXT: notl %eax774; CHECK-NOBMI-NEXT: orl %esi, %eax775; CHECK-NOBMI-NEXT: retq776;777; CHECK-BMI-LABEL: in_constant_mone_vary_invmask:778; CHECK-BMI: # %bb.0:779; CHECK-BMI-NEXT: movl %edx, %eax780; CHECK-BMI-NEXT: notl %eax781; CHECK-BMI-NEXT: orl %esi, %eax782; CHECK-BMI-NEXT: retq783 %notmask = xor i32 %mask, -1784 %n0 = xor i32 -1, %y ; %x785 %n1 = and i32 %n0, %notmask786 %r = xor i32 %n1, %y787 ret i32 %r788}789define i32 @out_constant_42_vary(i32 %x, i32 %y, i32 %mask) {790; CHECK-NOBMI-LABEL: out_constant_42_vary:791; CHECK-NOBMI: # %bb.0:792; CHECK-NOBMI-NEXT: movl %esi, %eax793; CHECK-NOBMI-NEXT: xorl $42, %eax794; CHECK-NOBMI-NEXT: andl %edx, %eax795; CHECK-NOBMI-NEXT: xorl %esi, %eax796; CHECK-NOBMI-NEXT: retq797;798; CHECK-BMI-LABEL: out_constant_42_vary:799; CHECK-BMI: # %bb.0:800; CHECK-BMI-NEXT: andnl %esi, %edx, %eax801; CHECK-BMI-NEXT: andl $42, %edx802; CHECK-BMI-NEXT: orl %edx, %eax803; CHECK-BMI-NEXT: retq804 %notmask = xor i32 %mask, -1805 %mx = and i32 %mask, 42806 %my = and i32 %notmask, %y807 %r = or i32 %mx, %my808 ret i32 %r809}810define i32 @in_constant_42_vary(i32 %x, i32 %y, i32 %mask) {811; CHECK-NOBMI-LABEL: in_constant_42_vary:812; CHECK-NOBMI: # %bb.0:813; CHECK-NOBMI-NEXT: movl %esi, %eax814; CHECK-NOBMI-NEXT: xorl $42, %eax815; CHECK-NOBMI-NEXT: andl %edx, %eax816; CHECK-NOBMI-NEXT: xorl %esi, %eax817; CHECK-NOBMI-NEXT: retq818;819; CHECK-BMI-LABEL: in_constant_42_vary:820; CHECK-BMI: # %bb.0:821; CHECK-BMI-NEXT: andnl %esi, %edx, %eax822; CHECK-BMI-NEXT: andl $42, %edx823; CHECK-BMI-NEXT: orl %edx, %eax824; CHECK-BMI-NEXT: retq825 %n0 = xor i32 42, %y ; %x826 %n1 = and i32 %n0, %mask827 %r = xor i32 %n1, %y828 ret i32 %r829}830; This is not a canonical form. Testing for completeness only.831define i32 @out_constant_42_vary_invmask(i32 %x, i32 %y, i32 %mask) {832; CHECK-NOBMI-LABEL: out_constant_42_vary_invmask:833; CHECK-NOBMI: # %bb.0:834; CHECK-NOBMI-NEXT: movl %esi, %eax835; CHECK-NOBMI-NEXT: xorl $42, %eax836; CHECK-NOBMI-NEXT: andl %edx, %eax837; CHECK-NOBMI-NEXT: xorl $42, %eax838; CHECK-NOBMI-NEXT: retq839;840; CHECK-BMI-LABEL: out_constant_42_vary_invmask:841; CHECK-BMI: # %bb.0:842; CHECK-BMI-NEXT: andl %edx, %esi843; CHECK-BMI-NEXT: movl %edx, %eax844; CHECK-BMI-NEXT: notl %eax845; CHECK-BMI-NEXT: andl $42, %eax846; CHECK-BMI-NEXT: orl %esi, %eax847; CHECK-BMI-NEXT: retq848 %notmask = xor i32 %mask, -1849 %mx = and i32 %notmask, 42850 %my = and i32 %mask, %y851 %r = or i32 %mx, %my852 ret i32 %r853}854; This is not a canonical form. Testing for completeness only.855define i32 @in_constant_42_vary_invmask(i32 %x, i32 %y, i32 %mask) {856; CHECK-NOBMI-LABEL: in_constant_42_vary_invmask:857; CHECK-NOBMI: # %bb.0:858; CHECK-NOBMI-NEXT: notl %edx859; CHECK-NOBMI-NEXT: movl %esi, %eax860; CHECK-NOBMI-NEXT: xorl $42, %eax861; CHECK-NOBMI-NEXT: andl %edx, %eax862; CHECK-NOBMI-NEXT: xorl %esi, %eax863; CHECK-NOBMI-NEXT: retq864;865; CHECK-BMI-LABEL: in_constant_42_vary_invmask:866; CHECK-BMI: # %bb.0:867; CHECK-BMI-NEXT: andnl %edx, %esi, %eax868; CHECK-BMI-NEXT: orl $42, %edx869; CHECK-BMI-NEXT: andnl %edx, %eax, %eax870; CHECK-BMI-NEXT: retq871 %notmask = xor i32 %mask, -1872 %n0 = xor i32 42, %y ; %x873 %n1 = and i32 %n0, %notmask874 %r = xor i32 %n1, %y875 ret i32 %r876}877; ============================================================================ ;878; Negative tests. Should not be folded.879; ============================================================================ ;880; Multi-use tests.881declare void @use32(i32) nounwind882define i32 @in_multiuse_A(i32 %x, i32 %y, i32 %z, i32 %mask) nounwind {883; CHECK-NOBMI-LABEL: in_multiuse_A:884; CHECK-NOBMI: # %bb.0:885; CHECK-NOBMI-NEXT: pushq %rbp886; CHECK-NOBMI-NEXT: pushq %rbx887; CHECK-NOBMI-NEXT: pushq %rax888; CHECK-NOBMI-NEXT: movl %esi, %ebx889; CHECK-NOBMI-NEXT: movl %edi, %ebp890; CHECK-NOBMI-NEXT: xorl %esi, %ebp891; CHECK-NOBMI-NEXT: andl %ecx, %ebp892; CHECK-NOBMI-NEXT: movl %ebp, %edi893; CHECK-NOBMI-NEXT: callq use32@PLT894; CHECK-NOBMI-NEXT: xorl %ebx, %ebp895; CHECK-NOBMI-NEXT: movl %ebp, %eax896; CHECK-NOBMI-NEXT: addq $8, %rsp897; CHECK-NOBMI-NEXT: popq %rbx898; CHECK-NOBMI-NEXT: popq %rbp899; CHECK-NOBMI-NEXT: retq900;901; CHECK-BMI-LABEL: in_multiuse_A:902; CHECK-BMI: # %bb.0:903; CHECK-BMI-NEXT: pushq %rbp904; CHECK-BMI-NEXT: pushq %rbx905; CHECK-BMI-NEXT: pushq %rax906; CHECK-BMI-NEXT: movl %esi, %ebx907; CHECK-BMI-NEXT: movl %edi, %ebp908; CHECK-BMI-NEXT: xorl %esi, %ebp909; CHECK-BMI-NEXT: andl %ecx, %ebp910; CHECK-BMI-NEXT: movl %ebp, %edi911; CHECK-BMI-NEXT: callq use32@PLT912; CHECK-BMI-NEXT: xorl %ebx, %ebp913; CHECK-BMI-NEXT: movl %ebp, %eax914; CHECK-BMI-NEXT: addq $8, %rsp915; CHECK-BMI-NEXT: popq %rbx916; CHECK-BMI-NEXT: popq %rbp917; CHECK-BMI-NEXT: retq918 %n0 = xor i32 %x, %y919 %n1 = and i32 %n0, %mask920 call void @use32(i32 %n1)921 %r = xor i32 %n1, %y922 ret i32 %r923}924define i32 @in_multiuse_B(i32 %x, i32 %y, i32 %z, i32 %mask) nounwind {925; CHECK-NOBMI-LABEL: in_multiuse_B:926; CHECK-NOBMI: # %bb.0:927; CHECK-NOBMI-NEXT: pushq %rbp928; CHECK-NOBMI-NEXT: pushq %rbx929; CHECK-NOBMI-NEXT: pushq %rax930; CHECK-NOBMI-NEXT: movl %ecx, %ebx931; CHECK-NOBMI-NEXT: movl %esi, %ebp932; CHECK-NOBMI-NEXT: xorl %esi, %edi933; CHECK-NOBMI-NEXT: andl %edi, %ebx934; CHECK-NOBMI-NEXT: callq use32@PLT935; CHECK-NOBMI-NEXT: xorl %ebp, %ebx936; CHECK-NOBMI-NEXT: movl %ebx, %eax937; CHECK-NOBMI-NEXT: addq $8, %rsp938; CHECK-NOBMI-NEXT: popq %rbx939; CHECK-NOBMI-NEXT: popq %rbp940; CHECK-NOBMI-NEXT: retq941;942; CHECK-BMI-LABEL: in_multiuse_B:943; CHECK-BMI: # %bb.0:944; CHECK-BMI-NEXT: pushq %rbp945; CHECK-BMI-NEXT: pushq %rbx946; CHECK-BMI-NEXT: pushq %rax947; CHECK-BMI-NEXT: movl %ecx, %ebx948; CHECK-BMI-NEXT: movl %esi, %ebp949; CHECK-BMI-NEXT: xorl %esi, %edi950; CHECK-BMI-NEXT: andl %edi, %ebx951; CHECK-BMI-NEXT: callq use32@PLT952; CHECK-BMI-NEXT: xorl %ebp, %ebx953; CHECK-BMI-NEXT: movl %ebx, %eax954; CHECK-BMI-NEXT: addq $8, %rsp955; CHECK-BMI-NEXT: popq %rbx956; CHECK-BMI-NEXT: popq %rbp957; CHECK-BMI-NEXT: retq958 %n0 = xor i32 %x, %y959 %n1 = and i32 %n0, %mask960 call void @use32(i32 %n0)961 %r = xor i32 %n1, %y962 ret i32 %r963}964; Various bad variants965define i32 @n0_badmask(i32 %x, i32 %y, i32 %mask, i32 %mask2) {966; CHECK-NOBMI-LABEL: n0_badmask:967; CHECK-NOBMI: # %bb.0:968; CHECK-NOBMI-NEXT: movl %ecx, %eax969; CHECK-NOBMI-NEXT: andl %edx, %edi970; CHECK-NOBMI-NEXT: notl %eax971; CHECK-NOBMI-NEXT: andl %esi, %eax972; CHECK-NOBMI-NEXT: orl %edi, %eax973; CHECK-NOBMI-NEXT: retq974;975; CHECK-BMI-LABEL: n0_badmask:976; CHECK-BMI: # %bb.0:977; CHECK-BMI-NEXT: andl %edx, %edi978; CHECK-BMI-NEXT: andnl %esi, %ecx, %eax979; CHECK-BMI-NEXT: orl %edi, %eax980; CHECK-BMI-NEXT: retq981 %mx = and i32 %x, %mask982 %notmask = xor i32 %mask2, -1 ; %mask2 instead of %mask983 %my = and i32 %y, %notmask984 %r = or i32 %mx, %my985 ret i32 %r986}987define i32 @n0_badxor(i32 %x, i32 %y, i32 %mask) {988; CHECK-NOBMI-LABEL: n0_badxor:989; CHECK-NOBMI: # %bb.0:990; CHECK-NOBMI-NEXT: movl %edx, %eax991; CHECK-NOBMI-NEXT: andl %edx, %edi992; CHECK-NOBMI-NEXT: xorl $1, %eax993; CHECK-NOBMI-NEXT: andl %esi, %eax994; CHECK-NOBMI-NEXT: orl %edi, %eax995; CHECK-NOBMI-NEXT: retq996;997; CHECK-BMI-LABEL: n0_badxor:998; CHECK-BMI: # %bb.0:999; CHECK-BMI-NEXT: movl %edx, %eax1000; CHECK-BMI-NEXT: andl %edx, %edi1001; CHECK-BMI-NEXT: xorl $1, %eax1002; CHECK-BMI-NEXT: andl %esi, %eax1003; CHECK-BMI-NEXT: orl %edi, %eax1004; CHECK-BMI-NEXT: retq1005 %mx = and i32 %x, %mask1006 %notmask = xor i32 %mask, 1 ; instead of -11007 %my = and i32 %y, %notmask1008 %r = or i32 %mx, %my1009 ret i32 %r1010}1011define i32 @n1_thirdvar(i32 %x, i32 %y, i32 %z, i32 %mask) {1012; CHECK-NOBMI-LABEL: n1_thirdvar:1013; CHECK-NOBMI: # %bb.0:1014; CHECK-NOBMI-NEXT: movl %edi, %eax1015; CHECK-NOBMI-NEXT: xorl %esi, %eax1016; CHECK-NOBMI-NEXT: andl %ecx, %eax1017; CHECK-NOBMI-NEXT: xorl %edx, %eax1018; CHECK-NOBMI-NEXT: retq1019;1020; CHECK-BMI-LABEL: n1_thirdvar:1021; CHECK-BMI: # %bb.0:1022; CHECK-BMI-NEXT: movl %edi, %eax1023; CHECK-BMI-NEXT: xorl %esi, %eax1024; CHECK-BMI-NEXT: andl %ecx, %eax1025; CHECK-BMI-NEXT: xorl %edx, %eax1026; CHECK-BMI-NEXT: retq1027 %n0 = xor i32 %x, %y1028 %n1 = and i32 %n0, %mask1029 %r = xor i32 %n1, %z ; instead of %y1030 ret i32 %r1031}1032