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