brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.6 KiB · 6a55d74 Raw
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