brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.0 KiB · 0998a0f Raw
776 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s3 4define void @test64(i64 inreg %x) {5; CHECK-LABEL: test64:6; CHECK:       # %bb.0:7; CHECK-NEXT:    testl $2048, %edi # imm = 0x8008; CHECK-NEXT:    jne .LBB0_29; CHECK-NEXT:  # %bb.1: # %yes10; CHECK-NEXT:    pushq %rax11; CHECK-NEXT:    .cfi_def_cfa_offset 1612; CHECK-NEXT:    callq bar@PLT13; CHECK-NEXT:    popq %rax14; CHECK-NEXT:    .cfi_def_cfa_offset 815; CHECK-NEXT:  .LBB0_2: # %no16; CHECK-NEXT:    retq17  %t = and i64 %x, 204818  %s = icmp eq i64 %t, 019  br i1 %s, label %yes, label %no20 21yes:22  call void @bar()23  ret void24no:25  ret void26}27 28define void @test64_optsize(i64 inreg %x) optsize {29; CHECK-LABEL: test64_optsize:30; CHECK:       # %bb.0:31; CHECK-NEXT:    btl $11, %edi32; CHECK-NEXT:    jb .LBB1_233; CHECK-NEXT:  # %bb.1: # %yes34; CHECK-NEXT:    pushq %rax35; CHECK-NEXT:    .cfi_def_cfa_offset 1636; CHECK-NEXT:    callq bar@PLT37; CHECK-NEXT:    popq %rax38; CHECK-NEXT:    .cfi_def_cfa_offset 839; CHECK-NEXT:  .LBB1_2: # %no40; CHECK-NEXT:    retq41  %t = and i64 %x, 204842  %s = icmp eq i64 %t, 043  br i1 %s, label %yes, label %no44 45yes:46  call void @bar()47  ret void48no:49  ret void50}51 52define void @test64_pgso(i64 inreg %x) !prof !14 {53; CHECK-LABEL: test64_pgso:54; CHECK:       # %bb.0:55; CHECK-NEXT:    btl $11, %edi56; CHECK-NEXT:    jb .LBB2_257; CHECK-NEXT:  # %bb.1: # %yes58; CHECK-NEXT:    pushq %rax59; CHECK-NEXT:    .cfi_def_cfa_offset 1660; CHECK-NEXT:    callq bar@PLT61; CHECK-NEXT:    popq %rax62; CHECK-NEXT:    .cfi_def_cfa_offset 863; CHECK-NEXT:  .LBB2_2: # %no64; CHECK-NEXT:    retq65  %t = and i64 %x, 204866  %s = icmp eq i64 %t, 067  br i1 %s, label %yes, label %no68 69yes:70  call void @bar()71  ret void72no:73  ret void74}75 76; This test is identical to test64 above with only the destination of the br77; reversed. This somehow causes the two functions to get slightly different78; initial IR. One has an extra invert of the setcc. This previous caused one79; the functions to use a BT while the other used a TEST due to another DAG80; combine messing with an expected canonical form.81define void @test64_2(i64 inreg %x) {82; CHECK-LABEL: test64_2:83; CHECK:       # %bb.0:84; CHECK-NEXT:    testl $2048, %edi # imm = 0x80085; CHECK-NEXT:    je .LBB3_286; CHECK-NEXT:  # %bb.1: # %yes87; CHECK-NEXT:    pushq %rax88; CHECK-NEXT:    .cfi_def_cfa_offset 1689; CHECK-NEXT:    callq bar@PLT90; CHECK-NEXT:    popq %rax91; CHECK-NEXT:    .cfi_def_cfa_offset 892; CHECK-NEXT:  .LBB3_2: # %no93; CHECK-NEXT:    retq94  %t = and i64 %x, 204895  %s = icmp eq i64 %t, 096  br i1 %s, label %no, label %yes97 98yes:99  call void @bar()100  ret void101no:102  ret void103}104 105define void @test64_optsize_2(i64 inreg %x) optsize {106; CHECK-LABEL: test64_optsize_2:107; CHECK:       # %bb.0:108; CHECK-NEXT:    btl $11, %edi109; CHECK-NEXT:    jae .LBB4_2110; CHECK-NEXT:  # %bb.1: # %yes111; CHECK-NEXT:    pushq %rax112; CHECK-NEXT:    .cfi_def_cfa_offset 16113; CHECK-NEXT:    callq bar@PLT114; CHECK-NEXT:    popq %rax115; CHECK-NEXT:    .cfi_def_cfa_offset 8116; CHECK-NEXT:  .LBB4_2: # %no117; CHECK-NEXT:    retq118  %t = and i64 %x, 2048119  %s = icmp eq i64 %t, 0120  br i1 %s, label %no, label %yes121 122yes:123  call void @bar()124  ret void125no:126  ret void127}128 129define void @test64_pgso_2(i64 inreg %x) !prof !14 {130; CHECK-LABEL: test64_pgso_2:131; CHECK:       # %bb.0:132; CHECK-NEXT:    btl $11, %edi133; CHECK-NEXT:    jae .LBB5_2134; CHECK-NEXT:  # %bb.1: # %yes135; CHECK-NEXT:    pushq %rax136; CHECK-NEXT:    .cfi_def_cfa_offset 16137; CHECK-NEXT:    callq bar@PLT138; CHECK-NEXT:    popq %rax139; CHECK-NEXT:    .cfi_def_cfa_offset 8140; CHECK-NEXT:  .LBB5_2: # %no141; CHECK-NEXT:    retq142  %t = and i64 %x, 2048143  %s = icmp eq i64 %t, 0144  br i1 %s, label %no, label %yes145 146yes:147  call void @bar()148  ret void149no:150  ret void151}152 153define void @test64_3(i64 inreg %x) {154; CHECK-LABEL: test64_3:155; CHECK:       # %bb.0:156; CHECK-NEXT:    btq $32, %rdi157; CHECK-NEXT:    jb .LBB6_2158; CHECK-NEXT:  # %bb.1: # %yes159; CHECK-NEXT:    pushq %rax160; CHECK-NEXT:    .cfi_def_cfa_offset 16161; CHECK-NEXT:    callq bar@PLT162; CHECK-NEXT:    popq %rax163; CHECK-NEXT:    .cfi_def_cfa_offset 8164; CHECK-NEXT:  .LBB6_2: # %no165; CHECK-NEXT:    retq166  %t = and i64 %x, 4294967296167  %s = icmp eq i64 %t, 0168  br i1 %s, label %yes, label %no169 170yes:171  call void @bar()172  ret void173no:174  ret void175}176 177define void @test64_optsize_3(i64 inreg %x) optsize {178; CHECK-LABEL: test64_optsize_3:179; CHECK:       # %bb.0:180; CHECK-NEXT:    btq $32, %rdi181; CHECK-NEXT:    jb .LBB7_2182; CHECK-NEXT:  # %bb.1: # %yes183; CHECK-NEXT:    pushq %rax184; CHECK-NEXT:    .cfi_def_cfa_offset 16185; CHECK-NEXT:    callq bar@PLT186; CHECK-NEXT:    popq %rax187; CHECK-NEXT:    .cfi_def_cfa_offset 8188; CHECK-NEXT:  .LBB7_2: # %no189; CHECK-NEXT:    retq190  %t = and i64 %x, 4294967296191  %s = icmp eq i64 %t, 0192  br i1 %s, label %yes, label %no193 194yes:195  call void @bar()196  ret void197no:198  ret void199}200 201define void @test64_pgso_3(i64 inreg %x) !prof !14 {202; CHECK-LABEL: test64_pgso_3:203; CHECK:       # %bb.0:204; CHECK-NEXT:    btq $32, %rdi205; CHECK-NEXT:    jb .LBB8_2206; CHECK-NEXT:  # %bb.1: # %yes207; CHECK-NEXT:    pushq %rax208; CHECK-NEXT:    .cfi_def_cfa_offset 16209; CHECK-NEXT:    callq bar@PLT210; CHECK-NEXT:    popq %rax211; CHECK-NEXT:    .cfi_def_cfa_offset 8212; CHECK-NEXT:  .LBB8_2: # %no213; CHECK-NEXT:    retq214  %t = and i64 %x, 4294967296215  %s = icmp eq i64 %t, 0216  br i1 %s, label %yes, label %no217 218yes:219  call void @bar()220  ret void221no:222  ret void223}224 225define void @test64_4(i64 inreg %x) {226; CHECK-LABEL: test64_4:227; CHECK:       # %bb.0:228; CHECK-NEXT:    btq $32, %rdi229; CHECK-NEXT:    jae .LBB9_2230; CHECK-NEXT:  # %bb.1: # %yes231; CHECK-NEXT:    pushq %rax232; CHECK-NEXT:    .cfi_def_cfa_offset 16233; CHECK-NEXT:    callq bar@PLT234; CHECK-NEXT:    popq %rax235; CHECK-NEXT:    .cfi_def_cfa_offset 8236; CHECK-NEXT:  .LBB9_2: # %no237; CHECK-NEXT:    retq238  %t = and i64 %x, 4294967296239  %s = icmp eq i64 %t, 0240  br i1 %s, label %no, label %yes241 242yes:243  call void @bar()244  ret void245no:246  ret void247}248 249define void @test64_optsize_4(i64 inreg %x) optsize {250; CHECK-LABEL: test64_optsize_4:251; CHECK:       # %bb.0:252; CHECK-NEXT:    btq $32, %rdi253; CHECK-NEXT:    jae .LBB10_2254; CHECK-NEXT:  # %bb.1: # %yes255; CHECK-NEXT:    pushq %rax256; CHECK-NEXT:    .cfi_def_cfa_offset 16257; CHECK-NEXT:    callq bar@PLT258; CHECK-NEXT:    popq %rax259; CHECK-NEXT:    .cfi_def_cfa_offset 8260; CHECK-NEXT:  .LBB10_2: # %no261; CHECK-NEXT:    retq262  %t = and i64 %x, 4294967296263  %s = icmp eq i64 %t, 0264  br i1 %s, label %no, label %yes265 266yes:267  call void @bar()268  ret void269no:270  ret void271}272 273define void @test64_pgso_4(i64 inreg %x) !prof !14 {274; CHECK-LABEL: test64_pgso_4:275; CHECK:       # %bb.0:276; CHECK-NEXT:    btq $32, %rdi277; CHECK-NEXT:    jae .LBB11_2278; CHECK-NEXT:  # %bb.1: # %yes279; CHECK-NEXT:    pushq %rax280; CHECK-NEXT:    .cfi_def_cfa_offset 16281; CHECK-NEXT:    callq bar@PLT282; CHECK-NEXT:    popq %rax283; CHECK-NEXT:    .cfi_def_cfa_offset 8284; CHECK-NEXT:  .LBB11_2: # %no285; CHECK-NEXT:    retq286  %t = and i64 %x, 4294967296287  %s = icmp eq i64 %t, 0288  br i1 %s, label %no, label %yes289 290yes:291  call void @bar()292  ret void293no:294  ret void295}296 297define void @test32(i32 inreg %x) {298; CHECK-LABEL: test32:299; CHECK:       # %bb.0:300; CHECK-NEXT:    testl $2048, %edi # imm = 0x800301; CHECK-NEXT:    jne .LBB12_2302; CHECK-NEXT:  # %bb.1: # %yes303; CHECK-NEXT:    pushq %rax304; CHECK-NEXT:    .cfi_def_cfa_offset 16305; CHECK-NEXT:    callq bar@PLT306; CHECK-NEXT:    popq %rax307; CHECK-NEXT:    .cfi_def_cfa_offset 8308; CHECK-NEXT:  .LBB12_2: # %no309; CHECK-NEXT:    retq310  %t = and i32 %x, 2048311  %s = icmp eq i32 %t, 0312  br i1 %s, label %yes, label %no313 314yes:315  call void @bar()316  ret void317no:318  ret void319}320 321define void @test32_optsize(i32 inreg %x) optsize {322; CHECK-LABEL: test32_optsize:323; CHECK:       # %bb.0:324; CHECK-NEXT:    btl $11, %edi325; CHECK-NEXT:    jb .LBB13_2326; CHECK-NEXT:  # %bb.1: # %yes327; CHECK-NEXT:    pushq %rax328; CHECK-NEXT:    .cfi_def_cfa_offset 16329; CHECK-NEXT:    callq bar@PLT330; CHECK-NEXT:    popq %rax331; CHECK-NEXT:    .cfi_def_cfa_offset 8332; CHECK-NEXT:  .LBB13_2: # %no333; CHECK-NEXT:    retq334  %t = and i32 %x, 2048335  %s = icmp eq i32 %t, 0336  br i1 %s, label %yes, label %no337 338yes:339  call void @bar()340  ret void341no:342  ret void343}344 345define void @test32_2(i32 inreg %x) {346; CHECK-LABEL: test32_2:347; CHECK:       # %bb.0:348; CHECK-NEXT:    testl $2048, %edi # imm = 0x800349; CHECK-NEXT:    je .LBB14_2350; CHECK-NEXT:  # %bb.1: # %yes351; CHECK-NEXT:    pushq %rax352; CHECK-NEXT:    .cfi_def_cfa_offset 16353; CHECK-NEXT:    callq bar@PLT354; CHECK-NEXT:    popq %rax355; CHECK-NEXT:    .cfi_def_cfa_offset 8356; CHECK-NEXT:  .LBB14_2: # %no357; CHECK-NEXT:    retq358  %t = and i32 %x, 2048359  %s = icmp eq i32 %t, 0360  br i1 %s, label %no, label %yes361 362yes:363  call void @bar()364  ret void365no:366  ret void367}368 369define void @test32_optsize_2(i32 inreg %x) optsize {370; CHECK-LABEL: test32_optsize_2:371; CHECK:       # %bb.0:372; CHECK-NEXT:    btl $11, %edi373; CHECK-NEXT:    jae .LBB15_2374; CHECK-NEXT:  # %bb.1: # %yes375; CHECK-NEXT:    pushq %rax376; CHECK-NEXT:    .cfi_def_cfa_offset 16377; CHECK-NEXT:    callq bar@PLT378; CHECK-NEXT:    popq %rax379; CHECK-NEXT:    .cfi_def_cfa_offset 8380; CHECK-NEXT:  .LBB15_2: # %no381; CHECK-NEXT:    retq382  %t = and i32 %x, 2048383  %s = icmp eq i32 %t, 0384  br i1 %s, label %no, label %yes385 386yes:387  call void @bar()388  ret void389no:390  ret void391}392 393define void @test32_pgso_2(i32 inreg %x) !prof !14 {394; CHECK-LABEL: test32_pgso_2:395; CHECK:       # %bb.0:396; CHECK-NEXT:    btl $11, %edi397; CHECK-NEXT:    jae .LBB16_2398; CHECK-NEXT:  # %bb.1: # %yes399; CHECK-NEXT:    pushq %rax400; CHECK-NEXT:    .cfi_def_cfa_offset 16401; CHECK-NEXT:    callq bar@PLT402; CHECK-NEXT:    popq %rax403; CHECK-NEXT:    .cfi_def_cfa_offset 8404; CHECK-NEXT:  .LBB16_2: # %no405; CHECK-NEXT:    retq406  %t = and i32 %x, 2048407  %s = icmp eq i32 %t, 0408  br i1 %s, label %no, label %yes409 410yes:411  call void @bar()412  ret void413no:414  ret void415}416 417define void @test16(i16 inreg %x) {418; CHECK-LABEL: test16:419; CHECK:       # %bb.0:420; CHECK-NEXT:    testl $2048, %edi # imm = 0x800421; CHECK-NEXT:    jne .LBB17_2422; CHECK-NEXT:  # %bb.1: # %yes423; CHECK-NEXT:    pushq %rax424; CHECK-NEXT:    .cfi_def_cfa_offset 16425; CHECK-NEXT:    callq bar@PLT426; CHECK-NEXT:    popq %rax427; CHECK-NEXT:    .cfi_def_cfa_offset 8428; CHECK-NEXT:  .LBB17_2: # %no429; CHECK-NEXT:    retq430  %t = and i16 %x, 2048431  %s = icmp eq i16 %t, 0432  br i1 %s, label %yes, label %no433 434yes:435  call void @bar()436  ret void437no:438  ret void439}440 441define void @test16_optsize(i16 inreg %x) optsize {442; CHECK-LABEL: test16_optsize:443; CHECK:       # %bb.0:444; CHECK-NEXT:    btl $11, %edi445; CHECK-NEXT:    jb .LBB18_2446; CHECK-NEXT:  # %bb.1: # %yes447; CHECK-NEXT:    pushq %rax448; CHECK-NEXT:    .cfi_def_cfa_offset 16449; CHECK-NEXT:    callq bar@PLT450; CHECK-NEXT:    popq %rax451; CHECK-NEXT:    .cfi_def_cfa_offset 8452; CHECK-NEXT:  .LBB18_2: # %no453; CHECK-NEXT:    retq454  %t = and i16 %x, 2048455  %s = icmp eq i16 %t, 0456  br i1 %s, label %yes, label %no457 458yes:459  call void @bar()460  ret void461no:462  ret void463}464 465define void @test16_pgso(i16 inreg %x) !prof !14 {466; CHECK-LABEL: test16_pgso:467; CHECK:       # %bb.0:468; CHECK-NEXT:    btl $11, %edi469; CHECK-NEXT:    jb .LBB19_2470; CHECK-NEXT:  # %bb.1: # %yes471; CHECK-NEXT:    pushq %rax472; CHECK-NEXT:    .cfi_def_cfa_offset 16473; CHECK-NEXT:    callq bar@PLT474; CHECK-NEXT:    popq %rax475; CHECK-NEXT:    .cfi_def_cfa_offset 8476; CHECK-NEXT:  .LBB19_2: # %no477; CHECK-NEXT:    retq478  %t = and i16 %x, 2048479  %s = icmp eq i16 %t, 0480  br i1 %s, label %yes, label %no481 482yes:483  call void @bar()484  ret void485no:486  ret void487}488 489define void @test16_2(i16 inreg %x) {490; CHECK-LABEL: test16_2:491; CHECK:       # %bb.0:492; CHECK-NEXT:    testl $2048, %edi # imm = 0x800493; CHECK-NEXT:    je .LBB20_2494; CHECK-NEXT:  # %bb.1: # %yes495; CHECK-NEXT:    pushq %rax496; CHECK-NEXT:    .cfi_def_cfa_offset 16497; CHECK-NEXT:    callq bar@PLT498; CHECK-NEXT:    popq %rax499; CHECK-NEXT:    .cfi_def_cfa_offset 8500; CHECK-NEXT:  .LBB20_2: # %no501; CHECK-NEXT:    retq502  %t = and i16 %x, 2048503  %s = icmp eq i16 %t, 0504  br i1 %s, label %no, label %yes505 506yes:507  call void @bar()508  ret void509no:510  ret void511}512 513define void @test16_optsize_2(i16 inreg %x) optsize {514; CHECK-LABEL: test16_optsize_2:515; CHECK:       # %bb.0:516; CHECK-NEXT:    btl $11, %edi517; CHECK-NEXT:    jae .LBB21_2518; CHECK-NEXT:  # %bb.1: # %yes519; CHECK-NEXT:    pushq %rax520; CHECK-NEXT:    .cfi_def_cfa_offset 16521; CHECK-NEXT:    callq bar@PLT522; CHECK-NEXT:    popq %rax523; CHECK-NEXT:    .cfi_def_cfa_offset 8524; CHECK-NEXT:  .LBB21_2: # %no525; CHECK-NEXT:    retq526  %t = and i16 %x, 2048527  %s = icmp eq i16 %t, 0528  br i1 %s, label %no, label %yes529 530yes:531  call void @bar()532  ret void533no:534  ret void535}536 537define void @test16_pgso_2(i16 inreg %x) !prof !14 {538; CHECK-LABEL: test16_pgso_2:539; CHECK:       # %bb.0:540; CHECK-NEXT:    btl $11, %edi541; CHECK-NEXT:    jae .LBB22_2542; CHECK-NEXT:  # %bb.1: # %yes543; CHECK-NEXT:    pushq %rax544; CHECK-NEXT:    .cfi_def_cfa_offset 16545; CHECK-NEXT:    callq bar@PLT546; CHECK-NEXT:    popq %rax547; CHECK-NEXT:    .cfi_def_cfa_offset 8548; CHECK-NEXT:  .LBB22_2: # %no549; CHECK-NEXT:    retq550  %t = and i16 %x, 2048551  %s = icmp eq i16 %t, 0552  br i1 %s, label %no, label %yes553 554yes:555  call void @bar()556  ret void557no:558  ret void559}560 561define i64 @is_upper_bit_clear_i64(i64 %x) {562; CHECK-LABEL: is_upper_bit_clear_i64:563; CHECK:       # %bb.0:564; CHECK-NEXT:    xorl %eax, %eax565; CHECK-NEXT:    btq $37, %rdi566; CHECK-NEXT:    setae %al567; CHECK-NEXT:    retq568  %sh = lshr i64 %x, 37569  %m = and i64 %sh, 1570  %r = xor i64 %m, 1571  ret i64 %r572}573 574define i32 @is_upper_bit_clear_i64_trunc(i64 %x) {575; CHECK-LABEL: is_upper_bit_clear_i64_trunc:576; CHECK:       # %bb.0:577; CHECK-NEXT:    xorl %eax, %eax578; CHECK-NEXT:    btq $42, %rdi579; CHECK-NEXT:    setae %al580; CHECK-NEXT:    retq581  %sh = lshr i64 %x, 42582  %t = trunc i64 %sh to i32583  %m = and i32 %t, 1584  %r = xor i32 %m, 1585  ret i32 %r586}587 588define i64 @is_upper_bit_clear_i64_not(i64 %x) {589; CHECK-LABEL: is_upper_bit_clear_i64_not:590; CHECK:       # %bb.0:591; CHECK-NEXT:    xorl %eax, %eax592; CHECK-NEXT:    btq $39, %rdi593; CHECK-NEXT:    setae %al594; CHECK-NEXT:    retq595  %n = xor i64 %x, -1596  %sh = lshr i64 %n, 39597  %r = and i64 %sh, 1598  ret i64 %r599}600 601define i64 @is_lower_bit_clear_i64(i64 %x) {602; CHECK-LABEL: is_lower_bit_clear_i64:603; CHECK:       # %bb.0:604; CHECK-NEXT:    xorl %eax, %eax605; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000606; CHECK-NEXT:    sete %al607; CHECK-NEXT:    retq608  %sh = lshr i64 %x, 27609  %m = and i64 %sh, 1610  %r = xor i64 %m, 1611  ret i64 %r612}613 614define i64 @is_lower_bit_clear_i64_not(i64 %x) {615; CHECK-LABEL: is_lower_bit_clear_i64_not:616; CHECK:       # %bb.0:617; CHECK-NEXT:    xorl %eax, %eax618; CHECK-NEXT:    testl $65536, %edi # imm = 0x10000619; CHECK-NEXT:    sete %al620; CHECK-NEXT:    retq621  %n = xor i64 %x, -1622  %sh = lshr i64 %n, 16623  %r = and i64 %sh, 1624  ret i64 %r625}626 627define i32 @is_bit_clear_i32(i32 %x) {628; CHECK-LABEL: is_bit_clear_i32:629; CHECK:       # %bb.0:630; CHECK-NEXT:    xorl %eax, %eax631; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000632; CHECK-NEXT:    sete %al633; CHECK-NEXT:    retq634  %sh = lshr i32 %x, 27635  %n = xor i32 %sh, -1636  %r = and i32 %n, 1637  ret i32 %r638}639 640define i32 @is_bit_clear_i32_not(i32 %x) {641; CHECK-LABEL: is_bit_clear_i32_not:642; CHECK:       # %bb.0:643; CHECK-NEXT:    xorl %eax, %eax644; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000645; CHECK-NEXT:    sete %al646; CHECK-NEXT:    retq647  %n = xor i32 %x, -1648  %sh = lshr i32 %n, 27649  %r = and i32 %sh, 1650  ret i32 %r651}652 653define i16 @is_bit_clear_i16(i16 %x) {654; CHECK-LABEL: is_bit_clear_i16:655; CHECK:       # %bb.0:656; CHECK-NEXT:    xorl %eax, %eax657; CHECK-NEXT:    testb %dil, %dil658; CHECK-NEXT:    setns %al659; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax660; CHECK-NEXT:    retq661  %sh = lshr i16 %x, 7662  %m = and i16 %sh, 1663  %r = xor i16 %m, 1664  ret i16 %r665}666 667define i16 @is_bit_clear_i16_not(i16 %x) {668; CHECK-LABEL: is_bit_clear_i16_not:669; CHECK:       # %bb.0:670; CHECK-NEXT:    xorl %eax, %eax671; CHECK-NEXT:    testb $4, %dil672; CHECK-NEXT:    sete %al673; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax674; CHECK-NEXT:    retq675  %n = xor i16 %x, -1676  %sh = lshr i16 %n, 2677  %r = and i16 %sh, 1678  ret i16 %r679}680 681define i8 @is_bit_clear_i8(i8 %x) {682; CHECK-LABEL: is_bit_clear_i8:683; CHECK:       # %bb.0:684; CHECK-NEXT:    testb $8, %dil685; CHECK-NEXT:    sete %al686; CHECK-NEXT:    retq687  %sh = lshr i8 %x, 3688  %m = and i8 %sh, 1689  %r = xor i8 %m, 1690  ret i8 %r691}692 693define i8 @is_bit_clear_i8_not(i8 %x) {694; CHECK-LABEL: is_bit_clear_i8_not:695; CHECK:       # %bb.0:696; CHECK-NEXT:    testb $4, %dil697; CHECK-NEXT:    sete %al698; CHECK-NEXT:    retq699  %n = xor i8 %x, -1700  %sh = lshr i8 %n, 2701  %r = and i8 %sh, 1702  ret i8 %r703}704 705; Use bt/test on the 64-bit value and truncate result.706 707define i8 @overshift(i64 %x) {708; CHECK-LABEL: overshift:709; CHECK:       # %bb.0:710; CHECK-NEXT:    btq $42, %rdi711; CHECK-NEXT:    setae %al712; CHECK-NEXT:    retq713  %a = lshr i64 %x, 42714  %t = trunc i64 %a to i8715  %n = xor i8 %t, -1716  %r = and i8 %n, 1717  ret i8 %r718}719 720define i32 @setcc_is_bit_clear(i32 %x) {721; CHECK-LABEL: setcc_is_bit_clear:722; CHECK:       # %bb.0:723; CHECK-NEXT:    xorl %eax, %eax724; CHECK-NEXT:    testl $1024, %edi # imm = 0x400725; CHECK-NEXT:    sete %al726; CHECK-NEXT:    retq727  %a1 = and i32 %x, 1024728  %b1 = icmp eq i32 %a1, 0729  %r = zext i1 %b1 to i32730  ret i32 %r731}732 733define i32 @is_bit_set(i32 %x) {734; CHECK-LABEL: is_bit_set:735; CHECK:       # %bb.0:736; CHECK-NEXT:    movl %edi, %eax737; CHECK-NEXT:    shrl $10, %eax738; CHECK-NEXT:    andl $1, %eax739; CHECK-NEXT:    retq740  %sh = lshr i32 %x, 10741  %m = and i32 %sh, 1742  ret i32 %m743}744 745define i32 @setcc_is_bit_set(i32 %x) {746; CHECK-LABEL: setcc_is_bit_set:747; CHECK:       # %bb.0:748; CHECK-NEXT:    movl %edi, %eax749; CHECK-NEXT:    shrl $10, %eax750; CHECK-NEXT:    andl $1, %eax751; CHECK-NEXT:    retq752  %a1 = and i32 %x, 1024753  %b1 = icmp ne i32 %a1, 0754  %r = zext i1 %b1 to i32755  ret i32 %r756}757 758declare void @bar()759 760!llvm.module.flags = !{!0}761!0 = !{i32 1, !"ProfileSummary", !1}762!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}763!2 = !{!"ProfileFormat", !"InstrProf"}764!3 = !{!"TotalCount", i64 10000}765!4 = !{!"MaxCount", i64 10}766!5 = !{!"MaxInternalCount", i64 1}767!6 = !{!"MaxFunctionCount", i64 1000}768!7 = !{!"NumCounts", i64 3}769!8 = !{!"NumFunctions", i64 3}770!9 = !{!"DetailedSummary", !10}771!10 = !{!11, !12, !13}772!11 = !{i32 10000, i64 100, i32 1}773!12 = !{i32 999000, i64 100, i32 1}774!13 = !{i32 999999, i64 1, i32 2}775!14 = !{!"function_entry_count", i64 0}776