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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 i64 @is_lower_bit_clear_i64(i64 %x) { 575; CHECK-LABEL: is_lower_bit_clear_i64: 576; CHECK: # %bb.0: 577; CHECK-NEXT: xorl %eax, %eax 578; CHECK-NEXT: testl $134217728, %edi # imm = 0x8000000 579; CHECK-NEXT: sete %al 580; CHECK-NEXT: retq 581 %sh = lshr i64 %x, 27 582 %m = and i64 %sh, 1 583 %r = xor i64 %m, 1 584 ret i64 %r 585} 586 587define i32 @is_bit_clear_i32(i32 %x) { 588; CHECK-LABEL: is_bit_clear_i32: 589; CHECK: # %bb.0: 590; CHECK-NEXT: xorl %eax, %eax 591; CHECK-NEXT: testl $134217728, %edi # imm = 0x8000000 592; CHECK-NEXT: sete %al 593; CHECK-NEXT: retq 594 %sh = lshr i32 %x, 27 595 %n = xor i32 %sh, -1 596 %r = and i32 %n, 1 597 ret i32 %r 598} 599 600define i16 @is_bit_clear_i16(i16 %x) { 601; CHECK-LABEL: is_bit_clear_i16: 602; CHECK: # %bb.0: 603; CHECK-NEXT: xorl %eax, %eax 604; CHECK-NEXT: testb $-128, %dil 605; CHECK-NEXT: sete %al 606; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 607; CHECK-NEXT: retq 608 %sh = lshr i16 %x, 7 609 %m = and i16 %sh, 1 610 %r = xor i16 %m, 1 611 ret i16 %r 612} 613 614define i8 @is_bit_clear_i8(i8 %x) { 615; CHECK-LABEL: is_bit_clear_i8: 616; CHECK: # %bb.0: 617; CHECK-NEXT: testb $8, %dil 618; CHECK-NEXT: sete %al 619; CHECK-NEXT: retq 620 %sh = lshr i8 %x, 3 621 %m = and i8 %sh, 1 622 %r = xor i8 %m, 1 623 ret i8 %r 624} 625 626; TODO: We could use bt/test on the 64-bit value. 627 628define i8 @overshift(i64 %x) { 629; CHECK-LABEL: overshift: 630; CHECK: # %bb.0: 631; CHECK-NEXT: movq %rdi, %rax 632; CHECK-NEXT: shrq $42, %rax 633; CHECK-NEXT: notb %al 634; CHECK-NEXT: andb $1, %al 635; CHECK-NEXT: # kill: def $al killed $al killed $rax 636; CHECK-NEXT: retq 637 %a = lshr i64 %x, 42 638 %t = trunc i64 %a to i8 639 %n = xor i8 %t, -1 640 %r = and i8 %n, 1 641 ret i8 %r 642} 643 644define i32 @setcc_is_bit_clear(i32 %x) { 645; CHECK-LABEL: setcc_is_bit_clear: 646; CHECK: # %bb.0: 647; CHECK-NEXT: xorl %eax, %eax 648; CHECK-NEXT: testl $1024, %edi # imm = 0x400 649; CHECK-NEXT: sete %al 650; CHECK-NEXT: retq 651 %a1 = and i32 %x, 1024 652 %b1 = icmp eq i32 %a1, 0 653 %r = zext i1 %b1 to i32 654 ret i32 %r 655} 656 657define i32 @is_bit_set(i32 %x) { 658; CHECK-LABEL: is_bit_set: 659; CHECK: # %bb.0: 660; CHECK-NEXT: movl %edi, %eax 661; CHECK-NEXT: shrl $10, %eax 662; CHECK-NEXT: andl $1, %eax 663; CHECK-NEXT: retq 664 %sh = lshr i32 %x, 10 665 %m = and i32 %sh, 1 666 ret i32 %m 667} 668 669define i32 @setcc_is_bit_set(i32 %x) { 670; CHECK-LABEL: setcc_is_bit_set: 671; CHECK: # %bb.0: 672; CHECK-NEXT: movl %edi, %eax 673; CHECK-NEXT: shrl $10, %eax 674; CHECK-NEXT: andl $1, %eax 675; CHECK-NEXT: retq 676 %a1 = and i32 %x, 1024 677 %b1 = icmp ne i32 %a1, 0 678 %r = zext i1 %b1 to i32 679 ret i32 %r 680} 681 682declare void @bar() 683 684!llvm.module.flags = !{!0} 685!0 = !{i32 1, !"ProfileSummary", !1} 686!1 = !{!2, !3, !4, !5, !6, !7, !8, !9} 687!2 = !{!"ProfileFormat", !"InstrProf"} 688!3 = !{!"TotalCount", i64 10000} 689!4 = !{!"MaxCount", i64 10} 690!5 = !{!"MaxInternalCount", i64 1} 691!6 = !{!"MaxFunctionCount", i64 1000} 692!7 = !{!"NumCounts", i64 3} 693!8 = !{!"NumFunctions", i64 3} 694!9 = !{!"DetailedSummary", !10} 695!10 = !{!11, !12, !13} 696!11 = !{i32 10000, i64 100, i32 1} 697!12 = !{i32 999000, i64 100, i32 1} 698!13 = !{i32 999999, i64 1, i32 2} 699!14 = !{!"function_entry_count", i64 0} 700