1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s 3 4define void @test64(i64 inreg %x) { 5; CHECK-LABEL: test64: 6; CHECK: # %bb.0: 7; CHECK-NEXT: testl $2048, %edi # imm = 0x800 8; CHECK-NEXT: jne .LBB0_2 9; CHECK-NEXT: # %bb.1: # %yes 10; CHECK-NEXT: pushq %rax 11; CHECK-NEXT: .cfi_def_cfa_offset 16 12; CHECK-NEXT: callq bar@PLT 13; CHECK-NEXT: popq %rax 14; CHECK-NEXT: .cfi_def_cfa_offset 8 15; CHECK-NEXT: .LBB0_2: # %no 16; CHECK-NEXT: retq 17 %t = and i64 %x, 2048 18 %s = icmp eq i64 %t, 0 19 br i1 %s, label %yes, label %no 20 21yes: 22 call void @bar() 23 ret void 24no: 25 ret void 26} 27 28define void @test64_optsize(i64 inreg %x) optsize { 29; CHECK-LABEL: test64_optsize: 30; CHECK: # %bb.0: 31; CHECK-NEXT: btl $11, %edi 32; CHECK-NEXT: jb .LBB1_2 33; CHECK-NEXT: # %bb.1: # %yes 34; CHECK-NEXT: pushq %rax 35; CHECK-NEXT: .cfi_def_cfa_offset 16 36; CHECK-NEXT: callq bar@PLT 37; CHECK-NEXT: popq %rax 38; CHECK-NEXT: .cfi_def_cfa_offset 8 39; CHECK-NEXT: .LBB1_2: # %no 40; CHECK-NEXT: retq 41 %t = and i64 %x, 2048 42 %s = icmp eq i64 %t, 0 43 br i1 %s, label %yes, label %no 44 45yes: 46 call void @bar() 47 ret void 48no: 49 ret void 50} 51 52define void @test64_pgso(i64 inreg %x) !prof !14 { 53; CHECK-LABEL: test64_pgso: 54; CHECK: # %bb.0: 55; CHECK-NEXT: btl $11, %edi 56; CHECK-NEXT: jb .LBB2_2 57; CHECK-NEXT: # %bb.1: # %yes 58; CHECK-NEXT: pushq %rax 59; CHECK-NEXT: .cfi_def_cfa_offset 16 60; CHECK-NEXT: callq bar@PLT 61; CHECK-NEXT: popq %rax 62; CHECK-NEXT: .cfi_def_cfa_offset 8 63; CHECK-NEXT: .LBB2_2: # %no 64; CHECK-NEXT: retq 65 %t = and i64 %x, 2048 66 %s = icmp eq i64 %t, 0 67 br i1 %s, label %yes, label %no 68 69yes: 70 call void @bar() 71 ret void 72no: 73 ret void 74} 75 76; This test is identical to test64 above with only the destination of the br 77; reversed. This somehow causes the two functions to get slightly different 78; initial IR. One has an extra invert of the setcc. This previous caused one 79; the functions to use a BT while the other used a TEST due to another DAG 80; 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 = 0x800 85; CHECK-NEXT: je .LBB3_2 86; CHECK-NEXT: # %bb.1: # %yes 87; CHECK-NEXT: pushq %rax 88; CHECK-NEXT: .cfi_def_cfa_offset 16 89; CHECK-NEXT: callq bar@PLT 90; CHECK-NEXT: popq %rax 91; CHECK-NEXT: .cfi_def_cfa_offset 8 92; CHECK-NEXT: .LBB3_2: # %no 93; CHECK-NEXT: retq 94 %t = and i64 %x, 2048 95 %s = icmp eq i64 %t, 0 96 br i1 %s, label %no, label %yes 97 98yes: 99 call void @bar() 100 ret void 101no: 102 ret void 103} 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, %edi 109; CHECK-NEXT: jae .LBB4_2 110; CHECK-NEXT: # %bb.1: # %yes 111; CHECK-NEXT: pushq %rax 112; CHECK-NEXT: .cfi_def_cfa_offset 16 113; CHECK-NEXT: callq bar@PLT 114; CHECK-NEXT: popq %rax 115; CHECK-NEXT: .cfi_def_cfa_offset 8 116; CHECK-NEXT: .LBB4_2: # %no 117; CHECK-NEXT: retq 118 %t = and i64 %x, 2048 119 %s = icmp eq i64 %t, 0 120 br i1 %s, label %no, label %yes 121 122yes: 123 call void @bar() 124 ret void 125no: 126 ret void 127} 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, %edi 133; CHECK-NEXT: jae .LBB5_2 134; CHECK-NEXT: # %bb.1: # %yes 135; CHECK-NEXT: pushq %rax 136; CHECK-NEXT: .cfi_def_cfa_offset 16 137; CHECK-NEXT: callq bar@PLT 138; CHECK-NEXT: popq %rax 139; CHECK-NEXT: .cfi_def_cfa_offset 8 140; CHECK-NEXT: .LBB5_2: # %no 141; CHECK-NEXT: retq 142 %t = and i64 %x, 2048 143 %s = icmp eq i64 %t, 0 144 br i1 %s, label %no, label %yes 145 146yes: 147 call void @bar() 148 ret void 149no: 150 ret void 151} 152 153define void @test64_3(i64 inreg %x) { 154; CHECK-LABEL: test64_3: 155; CHECK: # %bb.0: 156; CHECK-NEXT: btq $32, %rdi 157; CHECK-NEXT: jb .LBB6_2 158; CHECK-NEXT: # %bb.1: # %yes 159; CHECK-NEXT: pushq %rax 160; CHECK-NEXT: .cfi_def_cfa_offset 16 161; CHECK-NEXT: callq bar@PLT 162; CHECK-NEXT: popq %rax 163; CHECK-NEXT: .cfi_def_cfa_offset 8 164; CHECK-NEXT: .LBB6_2: # %no 165; CHECK-NEXT: retq 166 %t = and i64 %x, 4294967296 167 %s = icmp eq i64 %t, 0 168 br i1 %s, label %yes, label %no 169 170yes: 171 call void @bar() 172 ret void 173no: 174 ret void 175} 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, %rdi 181; CHECK-NEXT: jb .LBB7_2 182; CHECK-NEXT: # %bb.1: # %yes 183; CHECK-NEXT: pushq %rax 184; CHECK-NEXT: .cfi_def_cfa_offset 16 185; CHECK-NEXT: callq bar@PLT 186; CHECK-NEXT: popq %rax 187; CHECK-NEXT: .cfi_def_cfa_offset 8 188; CHECK-NEXT: .LBB7_2: # %no 189; CHECK-NEXT: retq 190 %t = and i64 %x, 4294967296 191 %s = icmp eq i64 %t, 0 192 br i1 %s, label %yes, label %no 193 194yes: 195 call void @bar() 196 ret void 197no: 198 ret void 199} 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, %rdi 205; CHECK-NEXT: jb .LBB8_2 206; CHECK-NEXT: # %bb.1: # %yes 207; CHECK-NEXT: pushq %rax 208; CHECK-NEXT: .cfi_def_cfa_offset 16 209; CHECK-NEXT: callq bar@PLT 210; CHECK-NEXT: popq %rax 211; CHECK-NEXT: .cfi_def_cfa_offset 8 212; CHECK-NEXT: .LBB8_2: # %no 213; CHECK-NEXT: retq 214 %t = and i64 %x, 4294967296 215 %s = icmp eq i64 %t, 0 216 br i1 %s, label %yes, label %no 217 218yes: 219 call void @bar() 220 ret void 221no: 222 ret void 223} 224 225define void @test64_4(i64 inreg %x) { 226; CHECK-LABEL: test64_4: 227; CHECK: # %bb.0: 228; CHECK-NEXT: btq $32, %rdi 229; CHECK-NEXT: jae .LBB9_2 230; CHECK-NEXT: # %bb.1: # %yes 231; CHECK-NEXT: pushq %rax 232; CHECK-NEXT: .cfi_def_cfa_offset 16 233; CHECK-NEXT: callq bar@PLT 234; CHECK-NEXT: popq %rax 235; CHECK-NEXT: .cfi_def_cfa_offset 8 236; CHECK-NEXT: .LBB9_2: # %no 237; CHECK-NEXT: retq 238 %t = and i64 %x, 4294967296 239 %s = icmp eq i64 %t, 0 240 br i1 %s, label %no, label %yes 241 242yes: 243 call void @bar() 244 ret void 245no: 246 ret void 247} 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, %rdi 253; CHECK-NEXT: jae .LBB10_2 254; CHECK-NEXT: # %bb.1: # %yes 255; CHECK-NEXT: pushq %rax 256; CHECK-NEXT: .cfi_def_cfa_offset 16 257; CHECK-NEXT: callq bar@PLT 258; CHECK-NEXT: popq %rax 259; CHECK-NEXT: .cfi_def_cfa_offset 8 260; CHECK-NEXT: .LBB10_2: # %no 261; CHECK-NEXT: retq 262 %t = and i64 %x, 4294967296 263 %s = icmp eq i64 %t, 0 264 br i1 %s, label %no, label %yes 265 266yes: 267 call void @bar() 268 ret void 269no: 270 ret void 271} 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, %rdi 277; CHECK-NEXT: jae .LBB11_2 278; CHECK-NEXT: # %bb.1: # %yes 279; CHECK-NEXT: pushq %rax 280; CHECK-NEXT: .cfi_def_cfa_offset 16 281; CHECK-NEXT: callq bar@PLT 282; CHECK-NEXT: popq %rax 283; CHECK-NEXT: .cfi_def_cfa_offset 8 284; CHECK-NEXT: .LBB11_2: # %no 285; CHECK-NEXT: retq 286 %t = and i64 %x, 4294967296 287 %s = icmp eq i64 %t, 0 288 br i1 %s, label %no, label %yes 289 290yes: 291 call void @bar() 292 ret void 293no: 294 ret void 295} 296 297define void @test32(i32 inreg %x) { 298; CHECK-LABEL: test32: 299; CHECK: # %bb.0: 300; CHECK-NEXT: testl $2048, %edi # imm = 0x800 301; CHECK-NEXT: jne .LBB12_2 302; CHECK-NEXT: # %bb.1: # %yes 303; CHECK-NEXT: pushq %rax 304; CHECK-NEXT: .cfi_def_cfa_offset 16 305; CHECK-NEXT: callq bar@PLT 306; CHECK-NEXT: popq %rax 307; CHECK-NEXT: .cfi_def_cfa_offset 8 308; CHECK-NEXT: .LBB12_2: # %no 309; CHECK-NEXT: retq 310 %t = and i32 %x, 2048 311 %s = icmp eq i32 %t, 0 312 br i1 %s, label %yes, label %no 313 314yes: 315 call void @bar() 316 ret void 317no: 318 ret void 319} 320 321define void @test32_optsize(i32 inreg %x) optsize { 322; CHECK-LABEL: test32_optsize: 323; CHECK: # %bb.0: 324; CHECK-NEXT: btl $11, %edi 325; CHECK-NEXT: jb .LBB13_2 326; CHECK-NEXT: # %bb.1: # %yes 327; CHECK-NEXT: pushq %rax 328; CHECK-NEXT: .cfi_def_cfa_offset 16 329; CHECK-NEXT: callq bar@PLT 330; CHECK-NEXT: popq %rax 331; CHECK-NEXT: .cfi_def_cfa_offset 8 332; CHECK-NEXT: .LBB13_2: # %no 333; CHECK-NEXT: retq 334 %t = and i32 %x, 2048 335 %s = icmp eq i32 %t, 0 336 br i1 %s, label %yes, label %no 337 338yes: 339 call void @bar() 340 ret void 341no: 342 ret void 343} 344 345define void @test32_2(i32 inreg %x) { 346; CHECK-LABEL: test32_2: 347; CHECK: # %bb.0: 348; CHECK-NEXT: testl $2048, %edi # imm = 0x800 349; CHECK-NEXT: je .LBB14_2 350; CHECK-NEXT: # %bb.1: # %yes 351; CHECK-NEXT: pushq %rax 352; CHECK-NEXT: .cfi_def_cfa_offset 16 353; CHECK-NEXT: callq bar@PLT 354; CHECK-NEXT: popq %rax 355; CHECK-NEXT: .cfi_def_cfa_offset 8 356; CHECK-NEXT: .LBB14_2: # %no 357; CHECK-NEXT: retq 358 %t = and i32 %x, 2048 359 %s = icmp eq i32 %t, 0 360 br i1 %s, label %no, label %yes 361 362yes: 363 call void @bar() 364 ret void 365no: 366 ret void 367} 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, %edi 373; CHECK-NEXT: jae .LBB15_2 374; CHECK-NEXT: # %bb.1: # %yes 375; CHECK-NEXT: pushq %rax 376; CHECK-NEXT: .cfi_def_cfa_offset 16 377; CHECK-NEXT: callq bar@PLT 378; CHECK-NEXT: popq %rax 379; CHECK-NEXT: .cfi_def_cfa_offset 8 380; CHECK-NEXT: .LBB15_2: # %no 381; CHECK-NEXT: retq 382 %t = and i32 %x, 2048 383 %s = icmp eq i32 %t, 0 384 br i1 %s, label %no, label %yes 385 386yes: 387 call void @bar() 388 ret void 389no: 390 ret void 391} 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, %edi 397; CHECK-NEXT: jae .LBB16_2 398; CHECK-NEXT: # %bb.1: # %yes 399; CHECK-NEXT: pushq %rax 400; CHECK-NEXT: .cfi_def_cfa_offset 16 401; CHECK-NEXT: callq bar@PLT 402; CHECK-NEXT: popq %rax 403; CHECK-NEXT: .cfi_def_cfa_offset 8 404; CHECK-NEXT: .LBB16_2: # %no 405; CHECK-NEXT: retq 406 %t = and i32 %x, 2048 407 %s = icmp eq i32 %t, 0 408 br i1 %s, label %no, label %yes 409 410yes: 411 call void @bar() 412 ret void 413no: 414 ret void 415} 416 417define void @test16(i16 inreg %x) { 418; CHECK-LABEL: test16: 419; CHECK: # %bb.0: 420; CHECK-NEXT: testl $2048, %edi # imm = 0x800 421; CHECK-NEXT: jne .LBB17_2 422; CHECK-NEXT: # %bb.1: # %yes 423; CHECK-NEXT: pushq %rax 424; CHECK-NEXT: .cfi_def_cfa_offset 16 425; CHECK-NEXT: callq bar@PLT 426; CHECK-NEXT: popq %rax 427; CHECK-NEXT: .cfi_def_cfa_offset 8 428; CHECK-NEXT: .LBB17_2: # %no 429; CHECK-NEXT: retq 430 %t = and i16 %x, 2048 431 %s = icmp eq i16 %t, 0 432 br i1 %s, label %yes, label %no 433 434yes: 435 call void @bar() 436 ret void 437no: 438 ret void 439} 440 441define void @test16_optsize(i16 inreg %x) optsize { 442; CHECK-LABEL: test16_optsize: 443; CHECK: # %bb.0: 444; CHECK-NEXT: btl $11, %edi 445; CHECK-NEXT: jb .LBB18_2 446; CHECK-NEXT: # %bb.1: # %yes 447; CHECK-NEXT: pushq %rax 448; CHECK-NEXT: .cfi_def_cfa_offset 16 449; CHECK-NEXT: callq bar@PLT 450; CHECK-NEXT: popq %rax 451; CHECK-NEXT: .cfi_def_cfa_offset 8 452; CHECK-NEXT: .LBB18_2: # %no 453; CHECK-NEXT: retq 454 %t = and i16 %x, 2048 455 %s = icmp eq i16 %t, 0 456 br i1 %s, label %yes, label %no 457 458yes: 459 call void @bar() 460 ret void 461no: 462 ret void 463} 464 465define void @test16_pgso(i16 inreg %x) !prof !14 { 466; CHECK-LABEL: test16_pgso: 467; CHECK: # %bb.0: 468; CHECK-NEXT: btl $11, %edi 469; CHECK-NEXT: jb .LBB19_2 470; CHECK-NEXT: # %bb.1: # %yes 471; CHECK-NEXT: pushq %rax 472; CHECK-NEXT: .cfi_def_cfa_offset 16 473; CHECK-NEXT: callq bar@PLT 474; CHECK-NEXT: popq %rax 475; CHECK-NEXT: .cfi_def_cfa_offset 8 476; CHECK-NEXT: .LBB19_2: # %no 477; CHECK-NEXT: retq 478 %t = and i16 %x, 2048 479 %s = icmp eq i16 %t, 0 480 br i1 %s, label %yes, label %no 481 482yes: 483 call void @bar() 484 ret void 485no: 486 ret void 487} 488 489define void @test16_2(i16 inreg %x) { 490; CHECK-LABEL: test16_2: 491; CHECK: # %bb.0: 492; CHECK-NEXT: testl $2048, %edi # imm = 0x800 493; CHECK-NEXT: je .LBB20_2 494; CHECK-NEXT: # %bb.1: # %yes 495; CHECK-NEXT: pushq %rax 496; CHECK-NEXT: .cfi_def_cfa_offset 16 497; CHECK-NEXT: callq bar@PLT 498; CHECK-NEXT: popq %rax 499; CHECK-NEXT: .cfi_def_cfa_offset 8 500; CHECK-NEXT: .LBB20_2: # %no 501; CHECK-NEXT: retq 502 %t = and i16 %x, 2048 503 %s = icmp eq i16 %t, 0 504 br i1 %s, label %no, label %yes 505 506yes: 507 call void @bar() 508 ret void 509no: 510 ret void 511} 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, %edi 517; CHECK-NEXT: jae .LBB21_2 518; CHECK-NEXT: # %bb.1: # %yes 519; CHECK-NEXT: pushq %rax 520; CHECK-NEXT: .cfi_def_cfa_offset 16 521; CHECK-NEXT: callq bar@PLT 522; CHECK-NEXT: popq %rax 523; CHECK-NEXT: .cfi_def_cfa_offset 8 524; CHECK-NEXT: .LBB21_2: # %no 525; CHECK-NEXT: retq 526 %t = and i16 %x, 2048 527 %s = icmp eq i16 %t, 0 528 br i1 %s, label %no, label %yes 529 530yes: 531 call void @bar() 532 ret void 533no: 534 ret void 535} 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, %edi 541; CHECK-NEXT: jae .LBB22_2 542; CHECK-NEXT: # %bb.1: # %yes 543; CHECK-NEXT: pushq %rax 544; CHECK-NEXT: .cfi_def_cfa_offset 16 545; CHECK-NEXT: callq bar@PLT 546; CHECK-NEXT: popq %rax 547; CHECK-NEXT: .cfi_def_cfa_offset 8 548; CHECK-NEXT: .LBB22_2: # %no 549; CHECK-NEXT: retq 550 %t = and i16 %x, 2048 551 %s = icmp eq i16 %t, 0 552 br i1 %s, label %no, label %yes 553 554yes: 555 call void @bar() 556 ret void 557no: 558 ret void 559} 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, %eax 565; CHECK-NEXT: btq $37, %rdi 566; CHECK-NEXT: setae %al 567; CHECK-NEXT: retq 568 %sh = lshr i64 %x, 37 569 %m = and i64 %sh, 1 570 %r = xor i64 %m, 1 571 ret i64 %r 572} 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, %eax 578; CHECK-NEXT: btq $42, %rdi 579; CHECK-NEXT: setae %al 580; CHECK-NEXT: retq 581 %sh = lshr i64 %x, 42 582 %t = trunc i64 %sh to i32 583 %m = and i32 %t, 1 584 %r = xor i32 %m, 1 585 ret i32 %r 586} 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, %eax 592; CHECK-NEXT: btq $39, %rdi 593; CHECK-NEXT: setae %al 594; CHECK-NEXT: retq 595 %n = xor i64 %x, -1 596 %sh = lshr i64 %n, 39 597 %r = and i64 %sh, 1 598 ret i64 %r 599} 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, %eax 605; CHECK-NEXT: testl $134217728, %edi # imm = 0x8000000 606; CHECK-NEXT: sete %al 607; CHECK-NEXT: retq 608 %sh = lshr i64 %x, 27 609 %m = and i64 %sh, 1 610 %r = xor i64 %m, 1 611 ret i64 %r 612} 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, %eax 618; CHECK-NEXT: testl $65536, %edi # imm = 0x10000 619; CHECK-NEXT: sete %al 620; CHECK-NEXT: retq 621 %n = xor i64 %x, -1 622 %sh = lshr i64 %n, 16 623 %r = and i64 %sh, 1 624 ret i64 %r 625} 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, %eax 631; CHECK-NEXT: testl $134217728, %edi # imm = 0x8000000 632; CHECK-NEXT: sete %al 633; CHECK-NEXT: retq 634 %sh = lshr i32 %x, 27 635 %n = xor i32 %sh, -1 636 %r = and i32 %n, 1 637 ret i32 %r 638} 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, %eax 644; CHECK-NEXT: testl $134217728, %edi # imm = 0x8000000 645; CHECK-NEXT: sete %al 646; CHECK-NEXT: retq 647 %n = xor i32 %x, -1 648 %sh = lshr i32 %n, 27 649 %r = and i32 %sh, 1 650 ret i32 %r 651} 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, %eax 657; CHECK-NEXT: testb %dil, %dil 658; CHECK-NEXT: setns %al 659; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 660; CHECK-NEXT: retq 661 %sh = lshr i16 %x, 7 662 %m = and i16 %sh, 1 663 %r = xor i16 %m, 1 664 ret i16 %r 665} 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, %eax 671; CHECK-NEXT: testb $4, %dil 672; CHECK-NEXT: sete %al 673; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 674; CHECK-NEXT: retq 675 %n = xor i16 %x, -1 676 %sh = lshr i16 %n, 2 677 %r = and i16 %sh, 1 678 ret i16 %r 679} 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, %dil 685; CHECK-NEXT: sete %al 686; CHECK-NEXT: retq 687 %sh = lshr i8 %x, 3 688 %m = and i8 %sh, 1 689 %r = xor i8 %m, 1 690 ret i8 %r 691} 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, %dil 697; CHECK-NEXT: sete %al 698; CHECK-NEXT: retq 699 %n = xor i8 %x, -1 700 %sh = lshr i8 %n, 2 701 %r = and i8 %sh, 1 702 ret i8 %r 703} 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, %rdi 711; CHECK-NEXT: setae %al 712; CHECK-NEXT: retq 713 %a = lshr i64 %x, 42 714 %t = trunc i64 %a to i8 715 %n = xor i8 %t, -1 716 %r = and i8 %n, 1 717 ret i8 %r 718} 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, %eax 724; CHECK-NEXT: testl $1024, %edi # imm = 0x400 725; CHECK-NEXT: sete %al 726; CHECK-NEXT: retq 727 %a1 = and i32 %x, 1024 728 %b1 = icmp eq i32 %a1, 0 729 %r = zext i1 %b1 to i32 730 ret i32 %r 731} 732 733define i32 @is_bit_set(i32 %x) { 734; CHECK-LABEL: is_bit_set: 735; CHECK: # %bb.0: 736; CHECK-NEXT: movl %edi, %eax 737; CHECK-NEXT: shrl $10, %eax 738; CHECK-NEXT: andl $1, %eax 739; CHECK-NEXT: retq 740 %sh = lshr i32 %x, 10 741 %m = and i32 %sh, 1 742 ret i32 %m 743} 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, %eax 749; CHECK-NEXT: shrl $10, %eax 750; CHECK-NEXT: andl $1, %eax 751; CHECK-NEXT: retq 752 %a1 = and i32 %x, 1024 753 %b1 = icmp ne i32 %a1, 0 754 %r = zext i1 %b1 to i32 755 ret i32 %r 756} 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