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