brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.1 KiB · ed3f0e0 Raw
1141 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -show-mc-encoding | FileCheck %s --check-prefixes=CHECK,NO-NDD3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ndd -show-mc-encoding | FileCheck --check-prefixes=CHECK,NDD %s4 5@d = dso_local global i8 0, align 16@d64 = dso_local global i64 07 8define i32 @test1(i32 %X, ptr %y) nounwind {9; CHECK-LABEL: test1:10; CHECK:       # %bb.0: # %entry11; CHECK-NEXT:    cmpl $0, (%rsi) # encoding: [0x83,0x3e,0x00]12; CHECK-NEXT:    je .LBB0_2 # encoding: [0x74,A]13; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB0_2, kind: FK_PCRel_114; CHECK-NEXT:  # %bb.1: # %cond_true15; CHECK-NEXT:    movl $1, %eax # encoding: [0xb8,0x01,0x00,0x00,0x00]16; CHECK-NEXT:    retq # encoding: [0xc3]17; CHECK-NEXT:  .LBB0_2: # %ReturnBlock18; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]19; CHECK-NEXT:    retq # encoding: [0xc3]20entry:21  %tmp = load i32, ptr %y22  %tmp.upgrd.1 = icmp eq i32 %tmp, 023  br i1 %tmp.upgrd.1, label %ReturnBlock, label %cond_true24 25cond_true:26  ret i32 127 28ReturnBlock:29  ret i32 030}31 32define i32 @test2(i32 %X, ptr %y) nounwind {33; CHECK-LABEL: test2:34; CHECK:       # %bb.0: # %entry35; CHECK-NEXT:    testl $536870911, (%rsi) # encoding: [0xf7,0x06,0xff,0xff,0xff,0x1f]36; CHECK-NEXT:    # imm = 0x1FFFFFFF37; CHECK-NEXT:    je .LBB1_2 # encoding: [0x74,A]38; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB1_2, kind: FK_PCRel_139; CHECK-NEXT:  # %bb.1: # %cond_true40; CHECK-NEXT:    movl $1, %eax # encoding: [0xb8,0x01,0x00,0x00,0x00]41; CHECK-NEXT:    retq # encoding: [0xc3]42; CHECK-NEXT:  .LBB1_2: # %ReturnBlock43; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]44; CHECK-NEXT:    retq # encoding: [0xc3]45entry:46  %tmp = load i32, ptr %y47  %tmp1 = shl i32 %tmp, 348  %tmp1.upgrd.2 = icmp eq i32 %tmp1, 049  br i1 %tmp1.upgrd.2, label %ReturnBlock, label %cond_true50 51cond_true:52  ret i32 153 54ReturnBlock:55  ret i32 056}57 58define i8 @test2b(i8 %X, ptr %y) nounwind {59; CHECK-LABEL: test2b:60; CHECK:       # %bb.0: # %entry61; CHECK-NEXT:    testb $31, (%rsi) # encoding: [0xf6,0x06,0x1f]62; CHECK-NEXT:    je .LBB2_2 # encoding: [0x74,A]63; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB2_2, kind: FK_PCRel_164; CHECK-NEXT:  # %bb.1: # %cond_true65; CHECK-NEXT:    movb $1, %al # encoding: [0xb0,0x01]66; CHECK-NEXT:    retq # encoding: [0xc3]67; CHECK-NEXT:  .LBB2_2: # %ReturnBlock68; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]69; CHECK-NEXT:    retq # encoding: [0xc3]70entry:71  %tmp = load i8, ptr %y72  %tmp1 = shl i8 %tmp, 373  %tmp1.upgrd.2 = icmp eq i8 %tmp1, 074  br i1 %tmp1.upgrd.2, label %ReturnBlock, label %cond_true75 76cond_true:77  ret i8 178 79ReturnBlock:80  ret i8 081}82 83define i64 @test3(i64 %x) nounwind {84; CHECK-LABEL: test3:85; CHECK:       # %bb.0: # %entry86; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]87; CHECK-NEXT:    testq %rdi, %rdi # encoding: [0x48,0x85,0xff]88; CHECK-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]89; CHECK-NEXT:    retq # encoding: [0xc3]90entry:91  %t = icmp eq i64 %x, 092  %r = zext i1 %t to i6493  ret i64 %r94}95 96define i64 @test4(i64 %x) nounwind {97; CHECK-LABEL: test4:98; CHECK:       # %bb.0:99; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]100; CHECK-NEXT:    testq %rdi, %rdi # encoding: [0x48,0x85,0xff]101; CHECK-NEXT:    setle %al # encoding: [0x0f,0x9e,0xc0]102; CHECK-NEXT:    retq # encoding: [0xc3]103  %t = icmp slt i64 %x, 1104  %r = zext i1 %t to i64105  ret i64 %r106}107 108define i32 @test5(double %A) nounwind {109; CHECK-LABEL: test5:110; CHECK:       # %bb.0: # %entry111; CHECK-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # encoding: [0x66,0x0f,0x2e,0x05,A,A,A,A]112; CHECK-NEXT:    # fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: reloc_riprel_4byte113; CHECK-NEXT:    ja .LBB5_3 # encoding: [0x77,A]114; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB5_3, kind: FK_PCRel_1115; CHECK-NEXT:  # %bb.1: # %entry116; CHECK-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # encoding: [0x66,0x0f,0x2e,0x05,A,A,A,A]117; CHECK-NEXT:    # fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: reloc_riprel_4byte118; CHECK-NEXT:    jb .LBB5_3 # encoding: [0x72,A]119; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB5_3, kind: FK_PCRel_1120; CHECK-NEXT:  # %bb.2: # %bb12121; CHECK-NEXT:    movl $32, %eax # encoding: [0xb8,0x20,0x00,0x00,0x00]122; CHECK-NEXT:    retq # encoding: [0xc3]123; CHECK-NEXT:  .LBB5_3: # %bb8124; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]125; CHECK-NEXT:    jmp foo@PLT # TAILCALL126; CHECK-NEXT:    # encoding: [0xeb,A]127; CHECK-NEXT:    # fixup A - offset: 1, value: foo@PLT, kind: FK_PCRel_1128entry:129  %tmp2 = fcmp ogt double %A, 1.500000e+02130  %tmp5 = fcmp ult double %A, 7.500000e+01131  %bothcond = or i1 %tmp2, %tmp5132  br i1 %bothcond, label %bb8, label %bb12133 134bb8:135  %tmp9 = tail call i32 (...) @foo() nounwind136  ret i32 %tmp9137 138bb12:139  ret i32 32140}141 142declare i32 @foo(...)143 144define i32 @test6() nounwind align 2 {145; CHECK-LABEL: test6:146; CHECK:       # %bb.0: # %entry147; CHECK-NEXT:    cmpq $0, -{{[0-9]+}}(%rsp) # encoding: [0x48,0x83,0x7c,0x24,0xf8,0x00]148; CHECK-NEXT:    je .LBB6_1 # encoding: [0x74,A]149; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB6_1, kind: FK_PCRel_1150; CHECK-NEXT:  # %bb.2: # %F151; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]152; CHECK-NEXT:    retq # encoding: [0xc3]153; CHECK-NEXT:  .LBB6_1: # %T154; CHECK-NEXT:    movl $1, %eax # encoding: [0xb8,0x01,0x00,0x00,0x00]155; CHECK-NEXT:    retq # encoding: [0xc3]156entry:157  %A = alloca { i64, i64 }, align 8158  %B = getelementptr inbounds { i64, i64 }, ptr %A, i64 0, i32 1159  %C = load i64, ptr %B160  %D = icmp eq i64 %C, 0161  br i1 %D, label %T, label %F162 163T:164  ret i32 1165 166F:167  ret i32 0168}169 170define i32 @test7(i64 %res) nounwind {171; NO-NDD-LABEL: test7:172; NO-NDD:       # %bb.0: # %entry173; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]174; NO-NDD-NEXT:    shrq $32, %rdi # encoding: [0x48,0xc1,0xef,0x20]175; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]176; NO-NDD-NEXT:    retq # encoding: [0xc3]177;178; NDD-LABEL: test7:179; NDD:       # %bb.0: # %entry180; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]181; NDD-NEXT:    shrq $32, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x20]182; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]183; NDD-NEXT:    retq # encoding: [0xc3]184entry:185  %lnot = icmp ult i64 %res, 4294967296186  %lnot.ext = zext i1 %lnot to i32187  ret i32 %lnot.ext188}189 190define i32 @test8(i64 %res) nounwind {191; NO-NDD-LABEL: test8:192; NO-NDD:       # %bb.0:193; NO-NDD-NEXT:    shrq $32, %rdi # encoding: [0x48,0xc1,0xef,0x20]194; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]195; NO-NDD-NEXT:    cmpl $3, %edi # encoding: [0x83,0xff,0x03]196; NO-NDD-NEXT:    setb %al # encoding: [0x0f,0x92,0xc0]197; NO-NDD-NEXT:    retq # encoding: [0xc3]198;199; NDD-LABEL: test8:200; NDD:       # %bb.0:201; NDD-NEXT:    shrq $32, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x20]202; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]203; NDD-NEXT:    cmpl $3, %edi # encoding: [0x83,0xff,0x03]204; NDD-NEXT:    setb %al # encoding: [0x0f,0x92,0xc0]205; NDD-NEXT:    retq # encoding: [0xc3]206  %lnot = icmp ult i64 %res, 12884901888207  %lnot.ext = zext i1 %lnot to i32208  ret i32 %lnot.ext209}210 211define i32 @test9(i64 %res) nounwind {212; NO-NDD-LABEL: test9:213; NO-NDD:       # %bb.0:214; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]215; NO-NDD-NEXT:    shrq $33, %rdi # encoding: [0x48,0xc1,0xef,0x21]216; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]217; NO-NDD-NEXT:    retq # encoding: [0xc3]218;219; NDD-LABEL: test9:220; NDD:       # %bb.0:221; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]222; NDD-NEXT:    shrq $33, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x21]223; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]224; NDD-NEXT:    retq # encoding: [0xc3]225  %lnot = icmp ult i64 %res, 8589934592226  %lnot.ext = zext i1 %lnot to i32227  ret i32 %lnot.ext228}229 230define i32 @test10(i64 %res) nounwind {231; NO-NDD-LABEL: test10:232; NO-NDD:       # %bb.0:233; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]234; NO-NDD-NEXT:    shrq $32, %rdi # encoding: [0x48,0xc1,0xef,0x20]235; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]236; NO-NDD-NEXT:    retq # encoding: [0xc3]237;238; NDD-LABEL: test10:239; NDD:       # %bb.0:240; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]241; NDD-NEXT:    shrq $32, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x20]242; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]243; NDD-NEXT:    retq # encoding: [0xc3]244  %lnot = icmp uge i64 %res, 4294967296245  %lnot.ext = zext i1 %lnot to i32246  ret i32 %lnot.ext247}248 249define i32 @test11(i64 %l) nounwind {250; NO-NDD-LABEL: test11:251; NO-NDD:       # %bb.0:252; NO-NDD-NEXT:    shrq $47, %rdi # encoding: [0x48,0xc1,0xef,0x2f]253; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]254; NO-NDD-NEXT:    cmpl $1, %edi # encoding: [0x83,0xff,0x01]255; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]256; NO-NDD-NEXT:    retq # encoding: [0xc3]257;258; NDD-LABEL: test11:259; NDD:       # %bb.0:260; NDD-NEXT:    shrq $47, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x2f]261; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]262; NDD-NEXT:    cmpl $1, %edi # encoding: [0x83,0xff,0x01]263; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]264; NDD-NEXT:    retq # encoding: [0xc3]265  %shr.mask = and i64 %l, -140737488355328266  %cmp = icmp eq i64 %shr.mask, 140737488355328267  %conv = zext i1 %cmp to i32268  ret i32 %conv269}270 271define i32 @test12() ssp uwtable {272; CHECK-LABEL: test12:273; CHECK:       # %bb.0: # %entry274; CHECK-NEXT:    pushq %rax # encoding: [0x50]275; CHECK-NEXT:    .cfi_def_cfa_offset 16276; CHECK-NEXT:    callq test12b@PLT # encoding: [0xe8,A,A,A,A]277; CHECK-NEXT:    # fixup A - offset: 1, value: test12b@PLT, kind: FK_PCRel_4278; CHECK-NEXT:    testb %al, %al # encoding: [0x84,0xc0]279; CHECK-NEXT:    je .LBB12_2 # encoding: [0x74,A]280; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB12_2, kind: FK_PCRel_1281; CHECK-NEXT:  # %bb.1: # %T282; CHECK-NEXT:    movl $1, %eax # encoding: [0xb8,0x01,0x00,0x00,0x00]283; CHECK-NEXT:    popq %rcx # encoding: [0x59]284; CHECK-NEXT:    .cfi_def_cfa_offset 8285; CHECK-NEXT:    retq # encoding: [0xc3]286; CHECK-NEXT:  .LBB12_2: # %F287; CHECK-NEXT:    .cfi_def_cfa_offset 16288; CHECK-NEXT:    movl $2, %eax # encoding: [0xb8,0x02,0x00,0x00,0x00]289; CHECK-NEXT:    popq %rcx # encoding: [0x59]290; CHECK-NEXT:    .cfi_def_cfa_offset 8291; CHECK-NEXT:    retq # encoding: [0xc3]292entry:293  %tmp1 = call zeroext i1 @test12b()294  br i1 %tmp1, label %T, label %F295 296T:297  ret i32 1298 299F:300  ret i32 2301}302 303declare zeroext i1 @test12b()304 305define i32 @test13(i32 %mask, i32 %base, i32 %intra) {306; NO-NDD-LABEL: test13:307; NO-NDD:       # %bb.0:308; NO-NDD-NEXT:    movl %esi, %eax # encoding: [0x89,0xf0]309; NO-NDD-NEXT:    testb $8, %dil # encoding: [0x40,0xf6,0xc7,0x08]310; NO-NDD-NEXT:    cmovnel %edx, %eax # encoding: [0x0f,0x45,0xc2]311; NO-NDD-NEXT:    retq # encoding: [0xc3]312;313; NDD-LABEL: test13:314; NDD:       # %bb.0:315; NDD-NEXT:    testb $8, %dil # encoding: [0x40,0xf6,0xc7,0x08]316; NDD-NEXT:    cmovnel %edx, %esi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0x45,0xf2]317; NDD-NEXT:    retq # encoding: [0xc3]318  %and = and i32 %mask, 8319  %tobool = icmp ne i32 %and, 0320  %cond = select i1 %tobool, i32 %intra, i32 %base321  ret i32 %cond322}323 324define i32 @test14(i32 %mask, i32 %base, i32 %intra) {325; NO-NDD-LABEL: test14:326; NO-NDD:       # %bb.0:327; NO-NDD-NEXT:    movl %esi, %eax # encoding: [0x89,0xf0]328; NO-NDD-NEXT:    shrl $7, %edi # encoding: [0xc1,0xef,0x07]329; NO-NDD-NEXT:    cmovnsl %edx, %eax # encoding: [0x0f,0x49,0xc2]330; NO-NDD-NEXT:    retq # encoding: [0xc3]331;332; NDD-LABEL: test14:333; NDD:       # %bb.0:334; NDD-NEXT:    shrl $7, %edi # EVEX TO LEGACY Compression encoding: [0xc1,0xef,0x07]335; NDD-NEXT:    cmovnsl %edx, %esi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0x49,0xf2]336; NDD-NEXT:    retq # encoding: [0xc3]337  %s = lshr i32 %mask, 7338  %tobool = icmp sgt i32 %s, -1339  %cond = select i1 %tobool, i32 %intra, i32 %base340  ret i32 %cond341}342 343; PR19964344define zeroext i1 @test15(i32 %bf.load, i32 %n) {345; NO-NDD-LABEL: test15:346; NO-NDD:       # %bb.0:347; NO-NDD-NEXT:    shrl $16, %edi # encoding: [0xc1,0xef,0x10]348; NO-NDD-NEXT:    sete %cl # encoding: [0x0f,0x94,0xc1]349; NO-NDD-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]350; NO-NDD-NEXT:    setae %al # encoding: [0x0f,0x93,0xc0]351; NO-NDD-NEXT:    orb %cl, %al # encoding: [0x08,0xc8]352; NO-NDD-NEXT:    retq # encoding: [0xc3]353;354; NDD-LABEL: test15:355; NDD:       # %bb.0:356; NDD-NEXT:    shrl $16, %edi # EVEX TO LEGACY Compression encoding: [0xc1,0xef,0x10]357; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]358; NDD-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]359; NDD-NEXT:    setae %cl # encoding: [0x0f,0x93,0xc1]360; NDD-NEXT:    orb %cl, %al # EVEX TO LEGACY Compression encoding: [0x08,0xc8]361; NDD-NEXT:    retq # encoding: [0xc3]362  %bf.lshr = lshr i32 %bf.load, 16363  %cmp2 = icmp eq i32 %bf.lshr, 0364  %cmp5 = icmp uge i32 %bf.lshr, %n365  %.cmp5 = or i1 %cmp2, %cmp5366  ret i1 %.cmp5367}368 369define i8 @signbit_i16(i16 signext %L) {370; CHECK-LABEL: signbit_i16:371; CHECK:       # %bb.0:372; CHECK-NEXT:    testw %di, %di # encoding: [0x66,0x85,0xff]373; CHECK-NEXT:    setns %al # encoding: [0x0f,0x99,0xc0]374; CHECK-NEXT:    retq # encoding: [0xc3]375  %lshr = lshr i16 %L, 15376  %trunc = trunc i16 %lshr to i8377  %not = xor i8 %trunc, 1378  ret i8 %not379}380 381define i8 @signbit_i32(i32 %L) {382; CHECK-LABEL: signbit_i32:383; CHECK:       # %bb.0:384; CHECK-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]385; CHECK-NEXT:    setns %al # encoding: [0x0f,0x99,0xc0]386; CHECK-NEXT:    retq # encoding: [0xc3]387  %lshr = lshr i32 %L, 31388  %trunc = trunc i32 %lshr to i8389  %not = xor i8 %trunc, 1390  ret i8 %not391}392 393define i8 @signbit_i64(i64 %L) {394; CHECK-LABEL: signbit_i64:395; CHECK:       # %bb.0:396; CHECK-NEXT:    testq %rdi, %rdi # encoding: [0x48,0x85,0xff]397; CHECK-NEXT:    setns %al # encoding: [0x0f,0x99,0xc0]398; CHECK-NEXT:    retq # encoding: [0xc3]399  %lshr = lshr i64 %L, 63400  %trunc = trunc i64 %lshr to i8401  %not = xor i8 %trunc, 1402  ret i8 %not403}404 405define zeroext i1 @signbit_i32_i1(i32 %L) {406; CHECK-LABEL: signbit_i32_i1:407; CHECK:       # %bb.0:408; CHECK-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]409; CHECK-NEXT:    setns %al # encoding: [0x0f,0x99,0xc0]410; CHECK-NEXT:    retq # encoding: [0xc3]411  %lshr = lshr i32 %L, 31412  %trunc = trunc i32 %lshr to i1413  %not = xor i1 %trunc, true414  ret i1 %not415}416 417; This test failed due to incorrect handling of "shift + icmp" sequence418define void @test20(i32 %bf.load, i8 %x1, ptr %b_addr) {419; NO-NDD-LABEL: test20:420; NO-NDD:       # %bb.0:421; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]422; NO-NDD-NEXT:    testl $16777215, %edi # encoding: [0xf7,0xc7,0xff,0xff,0xff,0x00]423; NO-NDD-NEXT:    # imm = 0xFFFFFF424; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]425; NO-NDD-NEXT:    movzbl %sil, %ecx # encoding: [0x40,0x0f,0xb6,0xce]426; NO-NDD-NEXT:    addl %eax, %ecx # encoding: [0x01,0xc1]427; NO-NDD-NEXT:    setne (%rdx) # encoding: [0x0f,0x95,0x02]428; NO-NDD-NEXT:    testl $16777215, %edi # encoding: [0xf7,0xc7,0xff,0xff,0xff,0x00]429; NO-NDD-NEXT:    # imm = 0xFFFFFF430; NO-NDD-NEXT:    setne d(%rip) # encoding: [0x0f,0x95,0x05,A,A,A,A]431; NO-NDD-NEXT:    # fixup A - offset: 3, value: d, kind: reloc_riprel_4byte432; NO-NDD-NEXT:    retq # encoding: [0xc3]433;434; NDD-LABEL: test20:435; NDD:       # %bb.0:436; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]437; NDD-NEXT:    testl $16777215, %edi # encoding: [0xf7,0xc7,0xff,0xff,0xff,0x00]438; NDD-NEXT:    # imm = 0xFFFFFF439; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]440; NDD-NEXT:    movzbl %sil, %ecx # encoding: [0x40,0x0f,0xb6,0xce]441; NDD-NEXT:    addl %ecx, %eax # EVEX TO LEGACY Compression encoding: [0x01,0xc8]442; NDD-NEXT:    setne (%rdx) # encoding: [0x0f,0x95,0x02]443; NDD-NEXT:    testl $16777215, %edi # encoding: [0xf7,0xc7,0xff,0xff,0xff,0x00]444; NDD-NEXT:    # imm = 0xFFFFFF445; NDD-NEXT:    setne d(%rip) # encoding: [0x0f,0x95,0x05,A,A,A,A]446; NDD-NEXT:    # fixup A - offset: 3, value: d, kind: reloc_riprel_4byte447; NDD-NEXT:    retq # encoding: [0xc3]448  %bf.shl = shl i32 %bf.load, 8449  %bf.ashr = ashr exact i32 %bf.shl, 8450  %tobool4 = icmp ne i32 %bf.ashr, 0451  %conv = zext i1 %tobool4 to i32452  %conv6 = zext i8 %x1 to i32453  %add = add nuw nsw i32 %conv, %conv6454  %tobool7 = icmp ne i32 %add, 0455  %frombool = zext i1 %tobool7 to i8456  store i8 %frombool, ptr %b_addr, align 1457  %tobool14 = icmp ne i32 %bf.shl, 0458  %frombool15 = zext i1 %tobool14 to i8459  store i8 %frombool15, ptr @d, align 1460  ret void461}462 463define i32 @highmask_i64_simplify(i64 %val) {464; CHECK-LABEL: highmask_i64_simplify:465; CHECK:       # %bb.0:466; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]467; CHECK-NEXT:    retq # encoding: [0xc3]468  %and = and i64 %val, -2199023255552469  %cmp = icmp ult i64 %and, 0470  %ret = zext i1 %cmp to i32471  ret i32 %ret472}473 474define i32 @highmask_i64_mask64(i64 %val) {475; NO-NDD-LABEL: highmask_i64_mask64:476; NO-NDD:       # %bb.0:477; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]478; NO-NDD-NEXT:    shrq $41, %rdi # encoding: [0x48,0xc1,0xef,0x29]479; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]480; NO-NDD-NEXT:    retq # encoding: [0xc3]481;482; NDD-LABEL: highmask_i64_mask64:483; NDD:       # %bb.0:484; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]485; NDD-NEXT:    shrq $41, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x29]486; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]487; NDD-NEXT:    retq # encoding: [0xc3]488  %and = and i64 %val, -2199023255552489  %cmp = icmp ne i64 %and, 0490  %ret = zext i1 %cmp to i32491  ret i32 %ret492}493 494define i64 @highmask_i64_mask64_extra_use(i64 %val) nounwind {495; NO-NDD-LABEL: highmask_i64_mask64_extra_use:496; NO-NDD:       # %bb.0:497; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]498; NO-NDD-NEXT:    movq %rdi, %rcx # encoding: [0x48,0x89,0xf9]499; NO-NDD-NEXT:    shrq $41, %rcx # encoding: [0x48,0xc1,0xe9,0x29]500; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]501; NO-NDD-NEXT:    imulq %rdi, %rax # encoding: [0x48,0x0f,0xaf,0xc7]502; NO-NDD-NEXT:    retq # encoding: [0xc3]503;504; NDD-LABEL: highmask_i64_mask64_extra_use:505; NDD:       # %bb.0:506; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]507; NDD-NEXT:    shrq $41, %rdi, %rcx # encoding: [0x62,0xf4,0xf4,0x18,0xc1,0xef,0x29]508; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]509; NDD-NEXT:    imulq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0xaf,0xc7]510; NDD-NEXT:    retq # encoding: [0xc3]511  %and = and i64 %val, -2199023255552512  %cmp = icmp ne i64 %and, 0513  %z = zext i1 %cmp to i64514  %ret = mul i64 %z, %val515  ret i64 %ret516}517 518define i32 @highmask_i64_mask32(i64 %val) {519; NO-NDD-LABEL: highmask_i64_mask32:520; NO-NDD:       # %bb.0:521; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]522; NO-NDD-NEXT:    shrq $20, %rdi # encoding: [0x48,0xc1,0xef,0x14]523; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]524; NO-NDD-NEXT:    retq # encoding: [0xc3]525;526; NDD-LABEL: highmask_i64_mask32:527; NDD:       # %bb.0:528; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]529; NDD-NEXT:    shrq $20, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x14]530; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]531; NDD-NEXT:    retq # encoding: [0xc3]532  %and = and i64 %val, -1048576533  %cmp = icmp eq i64 %and, 0534  %ret = zext i1 %cmp to i32535  ret i32 %ret536}537 538define i64 @highmask_i64_mask32_extra_use(i64 %val) nounwind {539; NO-NDD-LABEL: highmask_i64_mask32_extra_use:540; NO-NDD:       # %bb.0:541; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]542; NO-NDD-NEXT:    testq $-1048576, %rdi # encoding: [0x48,0xf7,0xc7,0x00,0x00,0xf0,0xff]543; NO-NDD-NEXT:    # imm = 0xFFF00000544; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]545; NO-NDD-NEXT:    imulq %rdi, %rax # encoding: [0x48,0x0f,0xaf,0xc7]546; NO-NDD-NEXT:    retq # encoding: [0xc3]547;548; NDD-LABEL: highmask_i64_mask32_extra_use:549; NDD:       # %bb.0:550; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]551; NDD-NEXT:    testq $-1048576, %rdi # encoding: [0x48,0xf7,0xc7,0x00,0x00,0xf0,0xff]552; NDD-NEXT:    # imm = 0xFFF00000553; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]554; NDD-NEXT:    imulq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0xaf,0xc7]555; NDD-NEXT:    retq # encoding: [0xc3]556  %and = and i64 %val, -1048576557  %cmp = icmp eq i64 %and, 0558  %z = zext i1 %cmp to i64559  %ret = mul i64 %z, %val560  ret i64 %ret561}562 563define i32 @highmask_i64_mask8(i64 %val) {564; CHECK-LABEL: highmask_i64_mask8:565; CHECK:       # %bb.0:566; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]567; CHECK-NEXT:    testq $-16, %rdi # encoding: [0x48,0xf7,0xc7,0xf0,0xff,0xff,0xff]568; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]569; CHECK-NEXT:    retq # encoding: [0xc3]570  %and = and i64 %val, -16571  %cmp = icmp ne i64 %and, 0572  %ret = zext i1 %cmp to i32573  ret i32 %ret574}575 576define i32 @lowmask_i64_mask64(i64 %val) {577; NO-NDD-LABEL: lowmask_i64_mask64:578; NO-NDD:       # %bb.0:579; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]580; NO-NDD-NEXT:    shlq $16, %rdi # encoding: [0x48,0xc1,0xe7,0x10]581; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]582; NO-NDD-NEXT:    retq # encoding: [0xc3]583;584; NDD-LABEL: lowmask_i64_mask64:585; NDD:       # %bb.0:586; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]587; NDD-NEXT:    shlq $16, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x10]588; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]589; NDD-NEXT:    retq # encoding: [0xc3]590  %and = and i64 %val, 281474976710655591  %cmp = icmp eq i64 %and, 0592  %ret = zext i1 %cmp to i32593  ret i32 %ret594}595 596define i64 @lowmask_i64_mask64_extra_use(i64 %val) nounwind {597; NO-NDD-LABEL: lowmask_i64_mask64_extra_use:598; NO-NDD:       # %bb.0:599; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]600; NO-NDD-NEXT:    movq %rdi, %rcx # encoding: [0x48,0x89,0xf9]601; NO-NDD-NEXT:    shlq $16, %rcx # encoding: [0x48,0xc1,0xe1,0x10]602; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]603; NO-NDD-NEXT:    imulq %rdi, %rax # encoding: [0x48,0x0f,0xaf,0xc7]604; NO-NDD-NEXT:    retq # encoding: [0xc3]605;606; NDD-LABEL: lowmask_i64_mask64_extra_use:607; NDD:       # %bb.0:608; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]609; NDD-NEXT:    shlq $16, %rdi, %rcx # encoding: [0x62,0xf4,0xf4,0x18,0xc1,0xe7,0x10]610; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]611; NDD-NEXT:    imulq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0xaf,0xc7]612; NDD-NEXT:    retq # encoding: [0xc3]613  %and = and i64 %val, 281474976710655614  %cmp = icmp eq i64 %and, 0615  %z = zext i1 %cmp to i64616  %ret = mul i64 %z, %val617  ret i64 %ret618}619 620define i32 @lowmask_i64_mask32(i64 %val) {621; NO-NDD-LABEL: lowmask_i64_mask32:622; NO-NDD:       # %bb.0:623; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]624; NO-NDD-NEXT:    shlq $44, %rdi # encoding: [0x48,0xc1,0xe7,0x2c]625; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]626; NO-NDD-NEXT:    retq # encoding: [0xc3]627;628; NDD-LABEL: lowmask_i64_mask32:629; NDD:       # %bb.0:630; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]631; NDD-NEXT:    shlq $44, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x2c]632; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]633; NDD-NEXT:    retq # encoding: [0xc3]634  %and = and i64 %val, 1048575635  %cmp = icmp ne i64 %and, 0636  %ret = zext i1 %cmp to i32637  ret i32 %ret638}639 640define i64 @lowmask_i64_mask32_extra_use(i64 %val) nounwind {641; NO-NDD-LABEL: lowmask_i64_mask32_extra_use:642; NO-NDD:       # %bb.0:643; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]644; NO-NDD-NEXT:    testl $1048575, %edi # encoding: [0xf7,0xc7,0xff,0xff,0x0f,0x00]645; NO-NDD-NEXT:    # imm = 0xFFFFF646; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]647; NO-NDD-NEXT:    imulq %rdi, %rax # encoding: [0x48,0x0f,0xaf,0xc7]648; NO-NDD-NEXT:    retq # encoding: [0xc3]649;650; NDD-LABEL: lowmask_i64_mask32_extra_use:651; NDD:       # %bb.0:652; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]653; NDD-NEXT:    testl $1048575, %edi # encoding: [0xf7,0xc7,0xff,0xff,0x0f,0x00]654; NDD-NEXT:    # imm = 0xFFFFF655; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]656; NDD-NEXT:    imulq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0xaf,0xc7]657; NDD-NEXT:    retq # encoding: [0xc3]658  %and = and i64 %val, 1048575659  %cmp = icmp ne i64 %and, 0660  %z = zext i1 %cmp to i64661  %ret = mul i64 %z, %val662  ret i64 %ret663}664 665define i32 @lowmask_i64_mask8(i64 %val) {666; CHECK-LABEL: lowmask_i64_mask8:667; CHECK:       # %bb.0:668; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]669; CHECK-NEXT:    testb $31, %dil # encoding: [0x40,0xf6,0xc7,0x1f]670; CHECK-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]671; CHECK-NEXT:    retq # encoding: [0xc3]672  %and = and i64 %val, 31673  %cmp = icmp eq i64 %and, 0674  %ret = zext i1 %cmp to i32675  ret i32 %ret676}677 678define i32 @highmask_i32_mask32(i32 %val) {679; CHECK-LABEL: highmask_i32_mask32:680; CHECK:       # %bb.0:681; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]682; CHECK-NEXT:    testl $-1048576, %edi # encoding: [0xf7,0xc7,0x00,0x00,0xf0,0xff]683; CHECK-NEXT:    # imm = 0xFFF00000684; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]685; CHECK-NEXT:    retq # encoding: [0xc3]686  %and = and i32 %val, -1048576687  %cmp = icmp ne i32 %and, 0688  %ret = zext i1 %cmp to i32689  ret i32 %ret690}691 692define i32 @highmask_i32_mask8(i32 %val) {693; CHECK-LABEL: highmask_i32_mask8:694; CHECK:       # %bb.0:695; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]696; CHECK-NEXT:    testl $-16, %edi # encoding: [0xf7,0xc7,0xf0,0xff,0xff,0xff]697; CHECK-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]698; CHECK-NEXT:    retq # encoding: [0xc3]699  %and = and i32 %val, -16700  %cmp = icmp eq i32 %and, 0701  %ret = zext i1 %cmp to i32702  ret i32 %ret703}704 705define i32 @lowmask_i32_mask32(i32 %val) {706; CHECK-LABEL: lowmask_i32_mask32:707; CHECK:       # %bb.0:708; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]709; CHECK-NEXT:    testl $1048575, %edi # encoding: [0xf7,0xc7,0xff,0xff,0x0f,0x00]710; CHECK-NEXT:    # imm = 0xFFFFF711; CHECK-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]712; CHECK-NEXT:    retq # encoding: [0xc3]713  %and = and i32 %val, 1048575714  %cmp = icmp eq i32 %and, 0715  %ret = zext i1 %cmp to i32716  ret i32 %ret717}718 719define i32 @lowmask_i32_mask8(i32 %val) {720; CHECK-LABEL: lowmask_i32_mask8:721; CHECK:       # %bb.0:722; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]723; CHECK-NEXT:    testb $31, %dil # encoding: [0x40,0xf6,0xc7,0x1f]724; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]725; CHECK-NEXT:    retq # encoding: [0xc3]726  %and = and i32 %val, 31727  %cmp = icmp ne i32 %and, 0728  %ret = zext i1 %cmp to i32729  ret i32 %ret730}731 732define i1 @shifted_mask64_testb(i64 %a) {733; NO-NDD-LABEL: shifted_mask64_testb:734; NO-NDD:       # %bb.0:735; NO-NDD-NEXT:    shrq $50, %rdi # encoding: [0x48,0xc1,0xef,0x32]736; NO-NDD-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]737; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]738; NO-NDD-NEXT:    retq # encoding: [0xc3]739;740; NDD-LABEL: shifted_mask64_testb:741; NDD:       # %bb.0:742; NDD-NEXT:    shrq $50, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x32]743; NDD-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]744; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]745; NDD-NEXT:    retq # encoding: [0xc3]746  %v0 = and i64 %a, 287104476244869120  ; 0xff << 50747  %v1 = icmp ne i64 %v0, 0748  ret i1 %v1749}750 751define i1 @shifted_mask64_testw(i64 %a) {752; NO-NDD-LABEL: shifted_mask64_testw:753; NO-NDD:       # %bb.0:754; NO-NDD-NEXT:    shrq $33, %rdi # encoding: [0x48,0xc1,0xef,0x21]755; NO-NDD-NEXT:    testw %di, %di # encoding: [0x66,0x85,0xff]756; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]757; NO-NDD-NEXT:    retq # encoding: [0xc3]758;759; NDD-LABEL: shifted_mask64_testw:760; NDD:       # %bb.0:761; NDD-NEXT:    shrq $33, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x21]762; NDD-NEXT:    testw %di, %di # encoding: [0x66,0x85,0xff]763; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]764; NDD-NEXT:    retq # encoding: [0xc3]765  %v0 = and i64 %a, 562941363486720  ; 0xffff << 33766  %v1 = icmp ne i64 %v0, 0767  ret i1 %v1768}769 770define i1 @shifted_mask64_testl(i64 %a) {771; NO-NDD-LABEL: shifted_mask64_testl:772; NO-NDD:       # %bb.0:773; NO-NDD-NEXT:    shrq $7, %rdi # encoding: [0x48,0xc1,0xef,0x07]774; NO-NDD-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]775; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]776; NO-NDD-NEXT:    retq # encoding: [0xc3]777;778; NDD-LABEL: shifted_mask64_testl:779; NDD:       # %bb.0:780; NDD-NEXT:    shrq $7, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xef,0x07]781; NDD-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]782; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]783; NDD-NEXT:    retq # encoding: [0xc3]784  %v0 = and i64 %a, 549755813760  ; 0xffffffff << 7785  %v1 = icmp eq i64 %v0, 0786  ret i1 %v1787}788 789define i1 @shifted_mask64_extra_use_const(i64 %a) {790; CHECK-LABEL: shifted_mask64_extra_use_const:791; CHECK:       # %bb.0:792; CHECK-NEXT:    movabsq $287104476244869120, %rcx # encoding: [0x48,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]793; CHECK-NEXT:    # imm = 0x3FC000000000000794; CHECK-NEXT:    testq %rcx, %rdi # encoding: [0x48,0x85,0xcf]795; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]796; CHECK-NEXT:    movq %rcx, d64(%rip) # encoding: [0x48,0x89,0x0d,A,A,A,A]797; CHECK-NEXT:    # fixup A - offset: 3, value: d64, kind: reloc_riprel_4byte798; CHECK-NEXT:    retq # encoding: [0xc3]799  %v0 = and i64 %a, 287104476244869120  ; 0xff << 50800  %v1 = icmp ne i64 %v0, 0801  store i64 287104476244869120, ptr @d64802  ret i1 %v1803}804 805define i1 @shifted_mask64_extra_use_and(i64 %a) {806; NO-NDD-LABEL: shifted_mask64_extra_use_and:807; NO-NDD:       # %bb.0:808; NO-NDD-NEXT:    movabsq $287104476244869120, %rcx # encoding: [0x48,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]809; NO-NDD-NEXT:    # imm = 0x3FC000000000000810; NO-NDD-NEXT:    andq %rdi, %rcx # encoding: [0x48,0x21,0xf9]811; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]812; NO-NDD-NEXT:    movq %rcx, d64(%rip) # encoding: [0x48,0x89,0x0d,A,A,A,A]813; NO-NDD-NEXT:    # fixup A - offset: 3, value: d64, kind: reloc_riprel_4byte814; NO-NDD-NEXT:    retq # encoding: [0xc3]815;816; NDD-LABEL: shifted_mask64_extra_use_and:817; NDD:       # %bb.0:818; NDD-NEXT:    movabsq $287104476244869120, %rax # encoding: [0x48,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]819; NDD-NEXT:    # imm = 0x3FC000000000000820; NDD-NEXT:    andq %rax, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0x21,0xc7]821; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]822; NDD-NEXT:    movq %rdi, d64(%rip) # encoding: [0x48,0x89,0x3d,A,A,A,A]823; NDD-NEXT:    # fixup A - offset: 3, value: d64, kind: reloc_riprel_4byte824; NDD-NEXT:    retq # encoding: [0xc3]825  %v0 = and i64 %a, 287104476244869120  ; 0xff << 50826  %v1 = icmp ne i64 %v0, 0827  store i64 %v0, ptr @d64828  ret i1 %v1829}830 831define i1 @shifted_mask32_testl_immediate(i64 %a) {832; CHECK-LABEL: shifted_mask32_testl_immediate:833; CHECK:       # %bb.0:834; CHECK-NEXT:    testl $66846720, %edi # encoding: [0xf7,0xc7,0x00,0x00,0xfc,0x03]835; CHECK-NEXT:    # imm = 0x3FC0000836; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]837; CHECK-NEXT:    retq # encoding: [0xc3]838  %v0 = and i64 %a, 66846720  ; 0xff << 18839  %v1 = icmp ne i64 %v0, 0840  ret i1 %v1841}842 843define i1 @shifted_mask32_extra_use_const(i64 %a) {844; CHECK-LABEL: shifted_mask32_extra_use_const:845; CHECK:       # %bb.0:846; CHECK-NEXT:    testl $66846720, %edi # encoding: [0xf7,0xc7,0x00,0x00,0xfc,0x03]847; CHECK-NEXT:    # imm = 0x3FC0000848; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]849; CHECK-NEXT:    movq $66846720, d64(%rip) # encoding: [0x48,0xc7,0x05,A,A,A,A,0x00,0x00,0xfc,0x03]850; CHECK-NEXT:    # fixup A - offset: 3, value: d64-4, kind: reloc_riprel_4byte851; CHECK-NEXT:    # imm = 0x3FC0000852; CHECK-NEXT:    retq # encoding: [0xc3]853  %v0 = and i64 %a, 66846720  ; 0xff << 18854  %v1 = icmp ne i64 %v0, 0855  store i64 66846720, ptr @d64856  ret i1 %v1857}858 859define i1 @shifted_mask32_extra_use_and(i64 %a) {860; NO-NDD-LABEL: shifted_mask32_extra_use_and:861; NO-NDD:       # %bb.0:862; NO-NDD-NEXT:    andq $66846720, %rdi # encoding: [0x48,0x81,0xe7,0x00,0x00,0xfc,0x03]863; NO-NDD-NEXT:    # imm = 0x3FC0000864; NO-NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]865; NO-NDD-NEXT:    movq %rdi, d64(%rip) # encoding: [0x48,0x89,0x3d,A,A,A,A]866; NO-NDD-NEXT:    # fixup A - offset: 3, value: d64, kind: reloc_riprel_4byte867; NO-NDD-NEXT:    retq # encoding: [0xc3]868;869; NDD-LABEL: shifted_mask32_extra_use_and:870; NDD:       # %bb.0:871; NDD-NEXT:    andq $66846720, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0x81,0xe7,0x00,0x00,0xfc,0x03]872; NDD-NEXT:    # imm = 0x3FC0000873; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]874; NDD-NEXT:    movq %rdi, d64(%rip) # encoding: [0x48,0x89,0x3d,A,A,A,A]875; NDD-NEXT:    # fixup A - offset: 3, value: d64, kind: reloc_riprel_4byte876; NDD-NEXT:    retq # encoding: [0xc3]877  %v0 = and i64 %a, 66846720  ; 0xff << 50878  %v1 = icmp ne i64 %v0, 0879  store i64 %v0, ptr @d64880  ret i1 %v1881}882 883define { i64, i64 } @pr39968(i64, i64, i32) {884; NO-NDD-LABEL: pr39968:885; NO-NDD:       # %bb.0:886; NO-NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]887; NO-NDD-NEXT:    testb $64, %dl # encoding: [0xf6,0xc2,0x40]888; NO-NDD-NEXT:    cmovneq %rdi, %rsi # encoding: [0x48,0x0f,0x45,0xf7]889; NO-NDD-NEXT:    cmovneq %rdi, %rax # encoding: [0x48,0x0f,0x45,0xc7]890; NO-NDD-NEXT:    movq %rsi, %rdx # encoding: [0x48,0x89,0xf2]891; NO-NDD-NEXT:    retq # encoding: [0xc3]892;893; NDD-LABEL: pr39968:894; NDD:       # %bb.0:895; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]896; NDD-NEXT:    testb $64, %dl # encoding: [0xf6,0xc2,0x40]897; NDD-NEXT:    cmovneq %rdi, %rsi, %rdx # encoding: [0x62,0xf4,0xec,0x18,0x45,0xf7]898; NDD-NEXT:    cmovneq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0x45,0xc7]899; NDD-NEXT:    retq # encoding: [0xc3]900  %4 = and i32 %2, 64901  %5 = icmp ne i32 %4, 0902  %6 = select i1 %5, i64 %0, i64 %1903  %7 = select i1 %5, i64 %0, i64 0904  %8 = insertvalue { i64, i64 } undef, i64 %7, 0905  %9 = insertvalue { i64, i64 } %8, i64 %6, 1906  ret { i64, i64 } %9907}908 909; Make sure we use a 32-bit comparison without an extend based on the input910; being pre-sign extended by caller.911define i32 @pr42189(i16 signext %c) {912; CHECK-LABEL: pr42189:913; CHECK:       # %bb.0: # %entry914; CHECK-NEXT:    cmpl $32767, %edi # encoding: [0x81,0xff,0xff,0x7f,0x00,0x00]915; CHECK-NEXT:    # imm = 0x7FFF916; CHECK-NEXT:    jne f@PLT # TAILCALL917; CHECK-NEXT:    # encoding: [0x75,A]918; CHECK-NEXT:    # fixup A - offset: 1, value: f@PLT, kind: FK_PCRel_1919; CHECK-NEXT:  # %bb.1: # %if.then920; CHECK-NEXT:    jmp g@PLT # TAILCALL921; CHECK-NEXT:    # encoding: [0xeb,A]922; CHECK-NEXT:    # fixup A - offset: 1, value: g@PLT, kind: FK_PCRel_1923entry:924  %cmp = icmp eq i16 %c, 32767925  br i1 %cmp, label %if.then, label %if.end926 927if.then:                                          ; preds = %entry928  %call = tail call i32 @g()929  br label %return930 931if.end:                                           ; preds = %entry932  %call2 = tail call i32 @f()933  br label %return934 935return:                                           ; preds = %if.end, %if.then936  %retval.0 = phi i32 [ %call, %if.then ], [ %call2, %if.end ]937  ret i32 %retval.0938}939 940declare i32 @g()941declare i32 @f()942 943; Make sure we fold the load+and into a test from memory.944; The store makes sure the chain result of the load is used which used to945; prevent the post isel peephole from catching this.946define i1 @fold_test_and_with_chain(ptr %x, ptr %y, i32 %z) {947; CHECK-LABEL: fold_test_and_with_chain:948; CHECK:       # %bb.0:949; CHECK-NEXT:    testl %edx, (%rdi) # encoding: [0x85,0x17]950; CHECK-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]951; CHECK-NEXT:    movl %edx, (%rsi) # encoding: [0x89,0x16]952; CHECK-NEXT:    retq # encoding: [0xc3]953  %a = load i32, ptr %x954  %b = and i32 %z, %a955  %c = icmp eq i32 %b, 0956  store i32 %z, ptr %y957  ret i1 %c958}959 960define i1 @sext_mask(i32 %a) {961; CHECK-LABEL: sext_mask:962; CHECK:       # %bb.0:963; CHECK-NEXT:    cmpl $-523, %edi # encoding: [0x81,0xff,0xf5,0xfd,0xff,0xff]964; CHECK-NEXT:    # imm = 0xFDF5965; CHECK-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]966; CHECK-NEXT:    retq # encoding: [0xc3]967  %a64 = sext i32 %a to i64968  %v1 = icmp slt i64 %a64, -523969  ret i1 %v1970}971 972define i1 @sext_i9_mask(i9 %a) {973; NO-NDD-LABEL: sext_i9_mask:974; NO-NDD:       # %bb.0:975; NO-NDD-NEXT:    # kill: def $edi killed $edi def $rdi976; NO-NDD-NEXT:    shlq $55, %rdi # encoding: [0x48,0xc1,0xe7,0x37]977; NO-NDD-NEXT:    sarq $55, %rdi # encoding: [0x48,0xc1,0xff,0x37]978; NO-NDD-NEXT:    cmpl $-522, %edi # encoding: [0x81,0xff,0xf6,0xfd,0xff,0xff]979; NO-NDD-NEXT:    # imm = 0xFDF6980; NO-NDD-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]981; NO-NDD-NEXT:    retq # encoding: [0xc3]982;983; NDD-LABEL: sext_i9_mask:984; NDD:       # %bb.0:985; NDD-NEXT:    # kill: def $edi killed $edi def $rdi986; NDD-NEXT:    shlq $55, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x37]987; NDD-NEXT:    sarq $55, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xff,0x37]988; NDD-NEXT:    cmpl $-522, %edi # encoding: [0x81,0xff,0xf6,0xfd,0xff,0xff]989; NDD-NEXT:    # imm = 0xFDF6990; NDD-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]991; NDD-NEXT:    retq # encoding: [0xc3]992  %a64 = sext i9 %a to i64993  %v1 = icmp slt i64 %a64, -522994  ret i1 %v1995}996 997define i1 @sext_i32_mask(i32 %a) {998; CHECK-LABEL: sext_i32_mask:999; CHECK:       # %bb.0:1000; CHECK-NEXT:    cmpl $-522, %edi # encoding: [0x81,0xff,0xf6,0xfd,0xff,0xff]1001; CHECK-NEXT:    # imm = 0xFDF61002; CHECK-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]1003; CHECK-NEXT:    retq # encoding: [0xc3]1004  %a64 = sext i32 %a to i641005  %v1 = icmp slt i64 %a64, -5221006  ret i1 %v11007}1008 1009define i1 @i40(i40 %a) {1010; NO-NDD-LABEL: i40:1011; NO-NDD:       # %bb.0:1012; NO-NDD-NEXT:    shlq $24, %rdi # encoding: [0x48,0xc1,0xe7,0x18]1013; NO-NDD-NEXT:    sarq $24, %rdi # encoding: [0x48,0xc1,0xff,0x18]1014; NO-NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1015; NO-NDD-NEXT:    # imm = 0xFDF71016; NO-NDD-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]1017; NO-NDD-NEXT:    retq # encoding: [0xc3]1018;1019; NDD-LABEL: i40:1020; NDD:       # %bb.0:1021; NDD-NEXT:    shlq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x18]1022; NDD-NEXT:    sarq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xff,0x18]1023; NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1024; NDD-NEXT:    # imm = 0xFDF71025; NDD-NEXT:    setl %al # encoding: [0x0f,0x9c,0xc0]1026; NDD-NEXT:    retq # encoding: [0xc3]1027  %a64 = sext i40 %a to i641028  %v1 = icmp slt i64 %a64, -5211029  ret i1 %v11030}1031 1032define i1 @sext_i9_mask_sgt(i9 %a) {1033; NO-NDD-LABEL: sext_i9_mask_sgt:1034; NO-NDD:       # %bb.0:1035; NO-NDD-NEXT:    # kill: def $edi killed $edi def $rdi1036; NO-NDD-NEXT:    shlq $55, %rdi # encoding: [0x48,0xc1,0xe7,0x37]1037; NO-NDD-NEXT:    sarq $55, %rdi # encoding: [0x48,0xc1,0xff,0x37]1038; NO-NDD-NEXT:    cmpl $-520, %edi # encoding: [0x81,0xff,0xf8,0xfd,0xff,0xff]1039; NO-NDD-NEXT:    # imm = 0xFDF81040; NO-NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]1041; NO-NDD-NEXT:    retq # encoding: [0xc3]1042;1043; NDD-LABEL: sext_i9_mask_sgt:1044; NDD:       # %bb.0:1045; NDD-NEXT:    # kill: def $edi killed $edi def $rdi1046; NDD-NEXT:    shlq $55, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x37]1047; NDD-NEXT:    sarq $55, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xff,0x37]1048; NDD-NEXT:    cmpl $-520, %edi # encoding: [0x81,0xff,0xf8,0xfd,0xff,0xff]1049; NDD-NEXT:    # imm = 0xFDF81050; NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]1051; NDD-NEXT:    retq # encoding: [0xc3]1052  %a64 = sext i9 %a to i641053  %v1 = icmp sgt i64 %a64, -5211054  ret i1 %v11055}1056 1057define i1 @sext_i32_mask_sgt(i32 %a) {1058; CHECK-LABEL: sext_i32_mask_sgt:1059; CHECK:       # %bb.0:1060; CHECK-NEXT:    cmpl $-521, %edi # encoding: [0x81,0xff,0xf7,0xfd,0xff,0xff]1061; CHECK-NEXT:    # imm = 0xFDF71062; CHECK-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]1063; CHECK-NEXT:    retq # encoding: [0xc3]1064  %a64 = sext i32 %a to i641065  %v1 = icmp sgt i64 %a64, -5221066  ret i1 %v11067}1068 1069define i1 @i40_sge(i40 %a) {1070; NO-NDD-LABEL: i40_sge:1071; NO-NDD:       # %bb.0:1072; NO-NDD-NEXT:    shlq $24, %rdi # encoding: [0x48,0xc1,0xe7,0x18]1073; NO-NDD-NEXT:    sarq $24, %rdi # encoding: [0x48,0xc1,0xff,0x18]1074; NO-NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1075; NO-NDD-NEXT:    # imm = 0xFDF71076; NO-NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]1077; NO-NDD-NEXT:    retq # encoding: [0xc3]1078;1079; NDD-LABEL: i40_sge:1080; NDD:       # %bb.0:1081; NDD-NEXT:    shlq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x18]1082; NDD-NEXT:    sarq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xff,0x18]1083; NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1084; NDD-NEXT:    # imm = 0xFDF71085; NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]1086; NDD-NEXT:    retq # encoding: [0xc3]1087  %a64 = sext i40 %a to i641088  %v1 = icmp sge i64 %a64, -5211089  ret i1 %v11090}1091 1092define i1 @i40_eq(i40 %a) {1093; NO-NDD-LABEL: i40_eq:1094; NO-NDD:       # %bb.0:1095; NO-NDD-NEXT:    movabsq $1099511627775, %rax # encoding: [0x48,0xb8,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00]1096; NO-NDD-NEXT:    # imm = 0xFFFFFFFFFF1097; NO-NDD-NEXT:    andq %rdi, %rax # encoding: [0x48,0x21,0xf8]1098; NO-NDD-NEXT:    movabsq $1099511627255, %rcx # encoding: [0x48,0xb9,0xf7,0xfd,0xff,0xff,0xff,0x00,0x00,0x00]1099; NO-NDD-NEXT:    # imm = 0xFFFFFFFDF71100; NO-NDD-NEXT:    cmpq %rcx, %rax # encoding: [0x48,0x39,0xc8]1101; NO-NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]1102; NO-NDD-NEXT:    retq # encoding: [0xc3]1103;1104; NDD-LABEL: i40_eq:1105; NDD:       # %bb.0:1106; NDD-NEXT:    movabsq $1099511627775, %rax # encoding: [0x48,0xb8,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00]1107; NDD-NEXT:    # imm = 0xFFFFFFFFFF1108; NDD-NEXT:    andq %rdi, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x21,0xf8]1109; NDD-NEXT:    movabsq $1099511627255, %rcx # encoding: [0x48,0xb9,0xf7,0xfd,0xff,0xff,0xff,0x00,0x00,0x00]1110; NDD-NEXT:    # imm = 0xFFFFFFFDF71111; NDD-NEXT:    cmpq %rcx, %rax # encoding: [0x48,0x39,0xc8]1112; NDD-NEXT:    sete %al # encoding: [0x0f,0x94,0xc0]1113; NDD-NEXT:    retq # encoding: [0xc3]1114  %a64 = sext i40 %a to i641115  %v1 = icmp eq i64 %a64, -5211116  ret i1 %v11117}1118 1119define i1 @i40_ult(i40 %a) {1120; NO-NDD-LABEL: i40_ult:1121; NO-NDD:       # %bb.0:1122; NO-NDD-NEXT:    shlq $24, %rdi # encoding: [0x48,0xc1,0xe7,0x18]1123; NO-NDD-NEXT:    sarq $24, %rdi # encoding: [0x48,0xc1,0xff,0x18]1124; NO-NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1125; NO-NDD-NEXT:    # imm = 0xFDF71126; NO-NDD-NEXT:    setb %al # encoding: [0x0f,0x92,0xc0]1127; NO-NDD-NEXT:    retq # encoding: [0xc3]1128;1129; NDD-LABEL: i40_ult:1130; NDD:       # %bb.0:1131; NDD-NEXT:    shlq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xe7,0x18]1132; NDD-NEXT:    sarq $24, %rdi # EVEX TO LEGACY Compression encoding: [0x48,0xc1,0xff,0x18]1133; NDD-NEXT:    cmpq $-521, %rdi # encoding: [0x48,0x81,0xff,0xf7,0xfd,0xff,0xff]1134; NDD-NEXT:    # imm = 0xFDF71135; NDD-NEXT:    setb %al # encoding: [0x0f,0x92,0xc0]1136; NDD-NEXT:    retq # encoding: [0xc3]1137  %a64 = sext i40 %a to i641138  %v1 = icmp ult i64 %a64, -5211139  ret i1 %v11140}1141