988 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+nf -verify-machineinstrs | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+ndd,+nf -verify-machineinstrs | FileCheck %s --check-prefix=NDD4 5define void @ctest8rr_zf(i8 noundef %a, i8 noundef %b) {6; CHECK-LABEL: ctest8rr_zf:7; CHECK: # %bb.0: # %entry8; CHECK-NEXT: testb %dil, %dil9; CHECK-NEXT: ctestneb {dfv=zf} %sil, %sil10; CHECK-NEXT: jne .LBB0_111; CHECK-NEXT: # %bb.2: # %if.then12; CHECK-NEXT: xorl %eax, %eax13; CHECK-NEXT: jmp foo # TAILCALL14; CHECK-NEXT: .LBB0_1: # %if.end15; CHECK-NEXT: retq16;17; NDD-LABEL: ctest8rr_zf:18; NDD: # %bb.0: # %entry19; NDD-NEXT: testb %dil, %dil20; NDD-NEXT: ctestneb {dfv=zf} %sil, %sil21; NDD-NEXT: jne .LBB0_122; NDD-NEXT: # %bb.2: # %if.then23; NDD-NEXT: xorl %eax, %eax24; NDD-NEXT: jmp foo # TAILCALL25; NDD-NEXT: .LBB0_1: # %if.end26; NDD-NEXT: retq27entry:28 %cmp = icmp eq i8 %a, 029 %cmp1 = icmp eq i8 %b, 030 %or.cond = or i1 %cmp, %cmp131 br i1 %or.cond, label %if.then, label %if.end32 33if.then: ; preds = %entry34 tail call void (...) @foo()35 br label %if.end36 37if.end: ; preds = %entry, %if.then38 ret void39}40 41define i8 @ctest8rr_zf_double(i8 %a, double %b, i8* nocapture %c) {42; CHECK-LABEL: ctest8rr_zf_double:43; CHECK: # %bb.0: # %entry44; CHECK-NEXT: xorpd %xmm1, %xmm145; CHECK-NEXT: ucomisd %xmm1, %xmm046; CHECK-NEXT: ctesteb {dfv=zf} %dil, %dil47; CHECK-NEXT: je .LBB1_248; CHECK-NEXT: # %bb.1: # %if.then49; CHECK-NEXT: movb %dil, (%rsi)50; CHECK-NEXT: .LBB1_2: # %if.end51; CHECK-NEXT: xorl %eax, %eax52; CHECK-NEXT: retq53;54; NDD-LABEL: ctest8rr_zf_double:55; NDD: # %bb.0: # %entry56; NDD-NEXT: xorpd %xmm1, %xmm157; NDD-NEXT: ucomisd %xmm1, %xmm058; NDD-NEXT: ctesteb {dfv=zf} %dil, %dil59; NDD-NEXT: je .LBB1_260; NDD-NEXT: # %bb.1: # %if.then61; NDD-NEXT: movb %dil, (%rsi)62; NDD-NEXT: .LBB1_2: # %if.end63; NDD-NEXT: xorl %eax, %eax64; NDD-NEXT: retq65entry:66 %tobool = icmp ne i8 %a, 067 %cmp = fcmp ueq double %b, 0.068 %or.cond = select i1 %tobool, i1 %cmp, i1 false69 br i1 %or.cond, label %if.then, label %if.end70 71if.then:72 store i8 %a, i8* %c, align 473 br label %if.end74 75if.end:76 ret i8 077}78 79define i8 @ctest8rr_zf_double_p(i8 %a, double %b, i8* nocapture %c) {80; CHECK-LABEL: ctest8rr_zf_double_p:81; CHECK: # %bb.0: # %entry82; CHECK-NEXT: testb %dil, %dil83; CHECK-NEXT: setne %al84; CHECK-NEXT: ucomisd %xmm0, %xmm085; CHECK-NEXT: setp %cl86; CHECK-NEXT: andb %al, %cl87; CHECK-NEXT: cmpb $1, %cl88; CHECK-NEXT: jne .LBB2_289; CHECK-NEXT: # %bb.1: # %if.then90; CHECK-NEXT: movb %dil, (%rsi)91; CHECK-NEXT: .LBB2_2: # %if.end92; CHECK-NEXT: xorl %eax, %eax93; CHECK-NEXT: retq94;95; NDD-LABEL: ctest8rr_zf_double_p:96; NDD: # %bb.0: # %entry97; NDD-NEXT: testb %dil, %dil98; NDD-NEXT: setne %al99; NDD-NEXT: ucomisd %xmm0, %xmm0100; NDD-NEXT: setp %cl101; NDD-NEXT: andb %cl, %al102; NDD-NEXT: cmpb $1, %al103; NDD-NEXT: jne .LBB2_2104; NDD-NEXT: # %bb.1: # %if.then105; NDD-NEXT: movb %dil, (%rsi)106; NDD-NEXT: .LBB2_2: # %if.end107; NDD-NEXT: xorl %eax, %eax108; NDD-NEXT: retq109entry:110 %tobool = icmp ne i8 %a, 0111 %cmp = fcmp uno double %b, 0.0112 %or.cond = select i1 %tobool, i1 %cmp, i1 false113 br i1 %or.cond, label %if.then, label %if.end114 115if.then:116 store i8 %a, i8* %c, align 4117 br label %if.end118 119if.end:120 ret i8 0121}122 123define i8 @ctest8rr_zf_double_np(i8 %a, double %b, i8* nocapture %c) {124; CHECK-LABEL: ctest8rr_zf_double_np:125; CHECK: # %bb.0: # %entry126; CHECK-NEXT: testb %dil, %dil127; CHECK-NEXT: setne %al128; CHECK-NEXT: ucomisd %xmm0, %xmm0129; CHECK-NEXT: setnp %cl130; CHECK-NEXT: andb %al, %cl131; CHECK-NEXT: cmpb $1, %cl132; CHECK-NEXT: jne .LBB3_2133; CHECK-NEXT: # %bb.1: # %if.then134; CHECK-NEXT: movb %dil, (%rsi)135; CHECK-NEXT: .LBB3_2: # %if.end136; CHECK-NEXT: xorl %eax, %eax137; CHECK-NEXT: retq138;139; NDD-LABEL: ctest8rr_zf_double_np:140; NDD: # %bb.0: # %entry141; NDD-NEXT: testb %dil, %dil142; NDD-NEXT: setne %al143; NDD-NEXT: ucomisd %xmm0, %xmm0144; NDD-NEXT: setnp %cl145; NDD-NEXT: andb %cl, %al146; NDD-NEXT: cmpb $1, %al147; NDD-NEXT: jne .LBB3_2148; NDD-NEXT: # %bb.1: # %if.then149; NDD-NEXT: movb %dil, (%rsi)150; NDD-NEXT: .LBB3_2: # %if.end151; NDD-NEXT: xorl %eax, %eax152; NDD-NEXT: retq153entry:154 %tobool = icmp ne i8 %a, 0155 %cmp = fcmp ord double %b, 0.0156 %or.cond = select i1 %tobool, i1 %cmp, i1 false157 br i1 %or.cond, label %if.then, label %if.end158 159if.then:160 store i8 %a, i8* %c, align 4161 br label %if.end162 163if.end:164 ret i8 0165}166 167define void @ctest8rr_sf(i8 noundef %a, i8 noundef %b) {168; CHECK-LABEL: ctest8rr_sf:169; CHECK: # %bb.0: # %entry170; CHECK-NEXT: testb %dil, %dil171; CHECK-NEXT: ctesteb {dfv=sf} %sil, %sil172; CHECK-NEXT: js .LBB4_1173; CHECK-NEXT: # %bb.2: # %if.then174; CHECK-NEXT: xorl %eax, %eax175; CHECK-NEXT: jmp foo # TAILCALL176; CHECK-NEXT: .LBB4_1: # %if.end177; CHECK-NEXT: retq178;179; NDD-LABEL: ctest8rr_sf:180; NDD: # %bb.0: # %entry181; NDD-NEXT: testb %dil, %dil182; NDD-NEXT: ctesteb {dfv=sf} %sil, %sil183; NDD-NEXT: js .LBB4_1184; NDD-NEXT: # %bb.2: # %if.then185; NDD-NEXT: xorl %eax, %eax186; NDD-NEXT: jmp foo # TAILCALL187; NDD-NEXT: .LBB4_1: # %if.end188; NDD-NEXT: retq189entry:190 %cmp = icmp ule i8 %a, 0191 %tobool = icmp sge i8 %b, 0192 %or.cond = and i1 %cmp, %tobool193 br i1 %or.cond, label %if.then, label %if.end194 195if.then: ; preds = %entry196 tail call void (...) @foo()197 br label %if.end198 199if.end: ; preds = %if.then, %entry200 ret void201}202 203define i8 @ctest8rr_sf_2(i8 %a, i8 %b, i8* nocapture %c) {204; CHECK-LABEL: ctest8rr_sf_2:205; CHECK: # %bb.0: # %entry206; CHECK-NEXT: testb %dil, %dil207; CHECK-NEXT: ctestleb {dfv=sf} %sil, %sil208; CHECK-NEXT: jns .LBB5_2209; CHECK-NEXT: # %bb.1: # %if.then210; CHECK-NEXT: movb %dil, (%rdx)211; CHECK-NEXT: .LBB5_2: # %if.end212; CHECK-NEXT: xorl %eax, %eax213; CHECK-NEXT: retq214;215; NDD-LABEL: ctest8rr_sf_2:216; NDD: # %bb.0: # %entry217; NDD-NEXT: testb %dil, %dil218; NDD-NEXT: ctestleb {dfv=sf} %sil, %sil219; NDD-NEXT: jns .LBB5_2220; NDD-NEXT: # %bb.1: # %if.then221; NDD-NEXT: movb %dil, (%rdx)222; NDD-NEXT: .LBB5_2: # %if.end223; NDD-NEXT: xorl %eax, %eax224; NDD-NEXT: retq225entry:226 %tobool = icmp sgt i8 %a, 0227 %cmp = icmp slt i8 %b, 0228 %or.cond = select i1 %tobool, i1 true, i1 %cmp229 br i1 %or.cond, label %if.then, label %if.end230 231if.then:232 store i8 %a, i8* %c, align 4233 br label %if.end234 235if.end:236 ret i8 0237}238 239define i8 @ctest8rr_none(i8 %a, i8 %b, i8* nocapture %c) {240; CHECK-LABEL: ctest8rr_none:241; CHECK: # %bb.0: # %entry242; CHECK-NEXT: testb %dil, %dil243; CHECK-NEXT: ctestneb {dfv=} %sil, %sil244; CHECK-NEXT: jne .LBB6_2245; CHECK-NEXT: # %bb.1: # %if.then246; CHECK-NEXT: movb %dil, (%rdx)247; CHECK-NEXT: .LBB6_2: # %if.end248; CHECK-NEXT: xorl %eax, %eax249; CHECK-NEXT: retq250;251; NDD-LABEL: ctest8rr_none:252; NDD: # %bb.0: # %entry253; NDD-NEXT: testb %dil, %dil254; NDD-NEXT: ctestneb {dfv=} %sil, %sil255; NDD-NEXT: jne .LBB6_2256; NDD-NEXT: # %bb.1: # %if.then257; NDD-NEXT: movb %dil, (%rdx)258; NDD-NEXT: .LBB6_2: # %if.end259; NDD-NEXT: xorl %eax, %eax260; NDD-NEXT: retq261entry:262 %tobool = icmp ne i8 %a, 0263 %cmp = icmp eq i8 %b, 0264 %or.cond = select i1 %tobool, i1 %cmp, i1 false265 br i1 %or.cond, label %if.then, label %if.end266 267if.then:268 store i8 %a, i8* %c, align 4269 br label %if.end270 271if.end:272 ret i8 0273}274 275define void @ctest16rr_sf(i16 noundef %a, i16 noundef %b) {276; CHECK-LABEL: ctest16rr_sf:277; CHECK: # %bb.0: # %entry278; CHECK-NEXT: testw %di, %di279; CHECK-NEXT: ctestlew {dfv=sf} %si, %si280; CHECK-NEXT: jns .LBB7_1281; CHECK-NEXT: # %bb.2: # %if.then282; CHECK-NEXT: xorl %eax, %eax283; CHECK-NEXT: jmp foo # TAILCALL284; CHECK-NEXT: .LBB7_1: # %if.end285; CHECK-NEXT: retq286;287; NDD-LABEL: ctest16rr_sf:288; NDD: # %bb.0: # %entry289; NDD-NEXT: testw %di, %di290; NDD-NEXT: ctestlew {dfv=sf} %si, %si291; NDD-NEXT: jns .LBB7_1292; NDD-NEXT: # %bb.2: # %if.then293; NDD-NEXT: xorl %eax, %eax294; NDD-NEXT: jmp foo # TAILCALL295; NDD-NEXT: .LBB7_1: # %if.end296; NDD-NEXT: retq297entry:298 %cmp = icmp sgt i16 %a, 0299 %cmp1 = icmp slt i16 %b, 0300 %or.cond = or i1 %cmp, %cmp1301 br i1 %or.cond, label %if.then, label %if.end302 303if.then: ; preds = %entry304 tail call void (...) @foo()305 br label %if.end306 307if.end: ; preds = %entry, %if.then308 ret void309}310 311define void @ctest32rr_zf(i32 noundef %a, i32 noundef %b) {312; CHECK-LABEL: ctest32rr_zf:313; CHECK: # %bb.0: # %entry314; CHECK-NEXT: testl %edi, %edi315; CHECK-NEXT: ctestsl {dfv=zf} %esi, %esi316; CHECK-NEXT: jne .LBB8_1317; CHECK-NEXT: # %bb.2: # %if.then318; CHECK-NEXT: xorl %eax, %eax319; CHECK-NEXT: jmp foo # TAILCALL320; CHECK-NEXT: .LBB8_1: # %if.end321; CHECK-NEXT: retq322;323; NDD-LABEL: ctest32rr_zf:324; NDD: # %bb.0: # %entry325; NDD-NEXT: testl %edi, %edi326; NDD-NEXT: ctestsl {dfv=zf} %esi, %esi327; NDD-NEXT: jne .LBB8_1328; NDD-NEXT: # %bb.2: # %if.then329; NDD-NEXT: xorl %eax, %eax330; NDD-NEXT: jmp foo # TAILCALL331; NDD-NEXT: .LBB8_1: # %if.end332; NDD-NEXT: retq333entry:334 %cmp = icmp sge i32 %a, 0335 %cmp1 = icmp eq i32 %b, 0336 %or.cond = or i1 %cmp, %cmp1337 br i1 %or.cond, label %if.then, label %if.end338 339if.then: ; preds = %entry340 tail call void (...) @foo()341 br label %if.end342 343if.end: ; preds = %entry, %if.then344 ret void345}346 347define void @ctest8ri_zf(i8 noundef %a, i8 noundef %b) {348; CHECK-LABEL: ctest8ri_zf:349; CHECK: # %bb.0: # %entry350; CHECK-NEXT: testb %dil, %dil351; CHECK-NEXT: ctestneb {dfv=zf} $123, %sil352; CHECK-NEXT: jne .LBB9_1353; CHECK-NEXT: # %bb.2: # %if.then354; CHECK-NEXT: xorl %eax, %eax355; CHECK-NEXT: jmp foo # TAILCALL356; CHECK-NEXT: .LBB9_1: # %if.end357; CHECK-NEXT: retq358;359; NDD-LABEL: ctest8ri_zf:360; NDD: # %bb.0: # %entry361; NDD-NEXT: testb %dil, %dil362; NDD-NEXT: ctestneb {dfv=zf} $123, %sil363; NDD-NEXT: jne .LBB9_1364; NDD-NEXT: # %bb.2: # %if.then365; NDD-NEXT: xorl %eax, %eax366; NDD-NEXT: jmp foo # TAILCALL367; NDD-NEXT: .LBB9_1: # %if.end368; NDD-NEXT: retq369entry:370 %cmp = icmp eq i8 %a, 0371 %and = and i8 %b, 123372 %cmp1 = icmp eq i8 %and, 0373 %or.cond = or i1 %cmp, %cmp1374 br i1 %or.cond, label %if.then, label %if.end375 376if.then: ; preds = %entry377 tail call void (...) @foo()378 br label %if.end379 380if.end: ; preds = %entry, %if.then381 ret void382}383 384define void @ctest16ri_zf(i16 noundef %a, i16 noundef %b) {385; CHECK-LABEL: ctest16ri_zf:386; CHECK: # %bb.0: # %entry387; CHECK-NEXT: andl $1234, %esi # imm = 0x4D2388; CHECK-NEXT: testw %di, %di389; CHECK-NEXT: ctestnew {dfv=zf} %si, %si390; CHECK-NEXT: jne .LBB10_1391; CHECK-NEXT: # %bb.2: # %if.then392; CHECK-NEXT: xorl %eax, %eax393; CHECK-NEXT: jmp foo # TAILCALL394; CHECK-NEXT: .LBB10_1: # %if.end395; CHECK-NEXT: retq396;397; NDD-LABEL: ctest16ri_zf:398; NDD: # %bb.0: # %entry399; NDD-NEXT: testw %di, %di400; NDD-NEXT: ctestnew {dfv=zf} $1234, %si # imm = 0x4D2401; NDD-NEXT: jne .LBB10_1402; NDD-NEXT: # %bb.2: # %if.then403; NDD-NEXT: xorl %eax, %eax404; NDD-NEXT: jmp foo # TAILCALL405; NDD-NEXT: .LBB10_1: # %if.end406; NDD-NEXT: retq407entry:408 %cmp = icmp eq i16 %a, 0409 %and = and i16 %b, 1234410 %cmp1 = icmp eq i16 %and, 0411 %or.cond = or i1 %cmp, %cmp1412 br i1 %or.cond, label %if.then, label %if.end413 414if.then: ; preds = %entry415 tail call void (...) @foo()416 br label %if.end417 418if.end: ; preds = %entry, %if.then419 ret void420}421 422define void @ctest32ri_zf(i32 noundef %a, i32 noundef %b) {423; CHECK-LABEL: ctest32ri_zf:424; CHECK: # %bb.0: # %entry425; CHECK-NEXT: testl %edi, %edi426; CHECK-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039427; CHECK-NEXT: jne .LBB11_1428; CHECK-NEXT: # %bb.2: # %if.then429; CHECK-NEXT: xorl %eax, %eax430; CHECK-NEXT: jmp foo # TAILCALL431; CHECK-NEXT: .LBB11_1: # %if.end432; CHECK-NEXT: retq433;434; NDD-LABEL: ctest32ri_zf:435; NDD: # %bb.0: # %entry436; NDD-NEXT: testl %edi, %edi437; NDD-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039438; NDD-NEXT: jne .LBB11_1439; NDD-NEXT: # %bb.2: # %if.then440; NDD-NEXT: xorl %eax, %eax441; NDD-NEXT: jmp foo # TAILCALL442; NDD-NEXT: .LBB11_1: # %if.end443; NDD-NEXT: retq444entry:445 %cmp = icmp eq i32 %a, 0446 %and = and i32 %b, 12345447 %cmp1 = icmp eq i32 %and, 0448 %or.cond = or i1 %cmp, %cmp1449 br i1 %or.cond, label %if.then, label %if.end450 451if.then: ; preds = %entry452 tail call void (...) @foo()453 br label %if.end454 455if.end: ; preds = %entry, %if.then456 ret void457}458 459define void @ctest64ri32_zf(i64 noundef %a, i64 noundef %b) {460; CHECK-LABEL: ctest64ri32_zf:461; CHECK: # %bb.0: # %entry462; CHECK-NEXT: testq %rdi, %rdi463; CHECK-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240464; CHECK-NEXT: jne .LBB12_1465; CHECK-NEXT: # %bb.2: # %if.then466; CHECK-NEXT: xorl %eax, %eax467; CHECK-NEXT: jmp foo # TAILCALL468; CHECK-NEXT: .LBB12_1: # %if.end469; CHECK-NEXT: retq470;471; NDD-LABEL: ctest64ri32_zf:472; NDD: # %bb.0: # %entry473; NDD-NEXT: testq %rdi, %rdi474; NDD-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240475; NDD-NEXT: jne .LBB12_1476; NDD-NEXT: # %bb.2: # %if.then477; NDD-NEXT: xorl %eax, %eax478; NDD-NEXT: jmp foo # TAILCALL479; NDD-NEXT: .LBB12_1: # %if.end480; NDD-NEXT: retq481entry:482 %cmp = icmp eq i64 %a, 0483 %and = and i64 %b, 123456484 %cmp1 = icmp eq i64 %and, 0485 %or.cond = or i1 %cmp, %cmp1486 br i1 %or.cond, label %if.then, label %if.end487 488if.then: ; preds = %entry489 tail call void (...) @foo()490 br label %if.end491 492if.end: ; preds = %entry, %if.then493 ret void494}495 496define void @ctest8mr_zf(i8 noundef %a, ptr %ptr) {497; CHECK-LABEL: ctest8mr_zf:498; CHECK: # %bb.0: # %entry499; CHECK-NEXT: movzbl (%rsi), %eax500; CHECK-NEXT: testb %dil, %dil501; CHECK-NEXT: ctestneb {dfv=zf} %al, %al502; CHECK-NEXT: jne .LBB13_1503; CHECK-NEXT: # %bb.2: # %if.then504; CHECK-NEXT: xorl %eax, %eax505; CHECK-NEXT: jmp foo # TAILCALL506; CHECK-NEXT: .LBB13_1: # %if.end507; CHECK-NEXT: retq508;509; NDD-LABEL: ctest8mr_zf:510; NDD: # %bb.0: # %entry511; NDD-NEXT: movzbl (%rsi), %eax512; NDD-NEXT: testb %dil, %dil513; NDD-NEXT: ctestneb {dfv=zf} %al, %al514; NDD-NEXT: jne .LBB13_1515; NDD-NEXT: # %bb.2: # %if.then516; NDD-NEXT: xorl %eax, %eax517; NDD-NEXT: jmp foo # TAILCALL518; NDD-NEXT: .LBB13_1: # %if.end519; NDD-NEXT: retq520entry:521 %b = load i8, ptr %ptr522 %cmp = icmp eq i8 %a, 0523 %cmp1 = icmp eq i8 %b, 0524 %or.cond = or i1 %cmp, %cmp1525 br i1 %or.cond, label %if.then, label %if.end526 527if.then: ; preds = %entry528 tail call void (...) @foo()529 br label %if.end530 531if.end: ; preds = %entry, %if.then532 ret void533}534 535define void @ctest16mr_zf(i16 noundef %a, ptr %ptr) {536; CHECK-LABEL: ctest16mr_zf:537; CHECK: # %bb.0: # %entry538; CHECK-NEXT: movzwl (%rsi), %eax539; CHECK-NEXT: testw %di, %di540; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax541; CHECK-NEXT: jne .LBB14_1542; CHECK-NEXT: # %bb.2: # %if.then543; CHECK-NEXT: xorl %eax, %eax544; CHECK-NEXT: jmp foo # TAILCALL545; CHECK-NEXT: .LBB14_1: # %if.end546; CHECK-NEXT: retq547;548; NDD-LABEL: ctest16mr_zf:549; NDD: # %bb.0: # %entry550; NDD-NEXT: movzwl (%rsi), %eax551; NDD-NEXT: testw %di, %di552; NDD-NEXT: ctestnew {dfv=zf} %ax, %ax553; NDD-NEXT: jne .LBB14_1554; NDD-NEXT: # %bb.2: # %if.then555; NDD-NEXT: xorl %eax, %eax556; NDD-NEXT: jmp foo # TAILCALL557; NDD-NEXT: .LBB14_1: # %if.end558; NDD-NEXT: retq559entry:560 %b = load i16, ptr %ptr561 %cmp = icmp eq i16 %a, 0562 %cmp1 = icmp eq i16 %b, 0563 %or.cond = or i1 %cmp, %cmp1564 br i1 %or.cond, label %if.then, label %if.end565 566if.then: ; preds = %entry567 tail call void (...) @foo()568 br label %if.end569 570if.end: ; preds = %entry, %if.then571 ret void572}573 574define void @ctest32mr_cf(i32 noundef %a, ptr %ptr) {575; CHECK-LABEL: ctest32mr_cf:576; CHECK: # %bb.0: # %entry577; CHECK-NEXT: movl (%rsi), %eax578; CHECK-NEXT: testl %edi, %edi579; CHECK-NEXT: ctestnel {dfv=zf} %eax, %eax580; CHECK-NEXT: jne .LBB15_1581; CHECK-NEXT: # %bb.2: # %if.then582; CHECK-NEXT: xorl %eax, %eax583; CHECK-NEXT: jmp foo # TAILCALL584; CHECK-NEXT: .LBB15_1: # %if.end585; CHECK-NEXT: retq586;587; NDD-LABEL: ctest32mr_cf:588; NDD: # %bb.0: # %entry589; NDD-NEXT: movl (%rsi), %eax590; NDD-NEXT: testl %edi, %edi591; NDD-NEXT: ctestnel {dfv=zf} %eax, %eax592; NDD-NEXT: jne .LBB15_1593; NDD-NEXT: # %bb.2: # %if.then594; NDD-NEXT: xorl %eax, %eax595; NDD-NEXT: jmp foo # TAILCALL596; NDD-NEXT: .LBB15_1: # %if.end597; NDD-NEXT: retq598entry:599 %b = load i32, ptr %ptr600 %cmp = icmp eq i32 %a, 0601 %cmp1 = icmp eq i32 %b, 0602 %or.cond = or i1 %cmp, %cmp1603 br i1 %or.cond, label %if.then, label %if.end604 605if.then: ; preds = %entry606 tail call void (...) @foo()607 br label %if.end608 609if.end: ; preds = %entry, %if.then610 ret void611}612 613define void @ctest64mr_zf(i64 noundef %a, ptr %ptr) {614; CHECK-LABEL: ctest64mr_zf:615; CHECK: # %bb.0: # %entry616; CHECK-NEXT: movq (%rsi), %rax617; CHECK-NEXT: testq %rdi, %rdi618; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rax619; CHECK-NEXT: jne .LBB16_1620; CHECK-NEXT: # %bb.2: # %if.then621; CHECK-NEXT: xorl %eax, %eax622; CHECK-NEXT: jmp foo # TAILCALL623; CHECK-NEXT: .LBB16_1: # %if.end624; CHECK-NEXT: retq625;626; NDD-LABEL: ctest64mr_zf:627; NDD: # %bb.0: # %entry628; NDD-NEXT: movq (%rsi), %rax629; NDD-NEXT: testq %rdi, %rdi630; NDD-NEXT: ctestneq {dfv=zf} %rax, %rax631; NDD-NEXT: jne .LBB16_1632; NDD-NEXT: # %bb.2: # %if.then633; NDD-NEXT: xorl %eax, %eax634; NDD-NEXT: jmp foo # TAILCALL635; NDD-NEXT: .LBB16_1: # %if.end636; NDD-NEXT: retq637entry:638 %b = load i64, ptr %ptr639 %cmp = icmp eq i64 %a, 0640 %cmp1 = icmp eq i64 %b, 0641 %or.cond = or i1 %cmp, %cmp1642 br i1 %or.cond, label %if.then, label %if.end643 644if.then: ; preds = %entry645 tail call void (...) @foo()646 br label %if.end647 648if.end: ; preds = %entry, %if.then649 ret void650}651 652define void @ctest8mi_zf(i8 noundef %a, ptr %ptr) {653; CHECK-LABEL: ctest8mi_zf:654; CHECK: # %bb.0: # %entry655; CHECK-NEXT: testb %dil, %dil656; CHECK-NEXT: ctestneb {dfv=zf} $123, (%rsi)657; CHECK-NEXT: jne .LBB17_1658; CHECK-NEXT: # %bb.2: # %if.then659; CHECK-NEXT: xorl %eax, %eax660; CHECK-NEXT: jmp foo # TAILCALL661; CHECK-NEXT: .LBB17_1: # %if.end662; CHECK-NEXT: retq663;664; NDD-LABEL: ctest8mi_zf:665; NDD: # %bb.0: # %entry666; NDD-NEXT: testb %dil, %dil667; NDD-NEXT: ctestneb {dfv=zf} $123, (%rsi)668; NDD-NEXT: jne .LBB17_1669; NDD-NEXT: # %bb.2: # %if.then670; NDD-NEXT: xorl %eax, %eax671; NDD-NEXT: jmp foo # TAILCALL672; NDD-NEXT: .LBB17_1: # %if.end673; NDD-NEXT: retq674entry:675 %b = load i8, ptr %ptr676 %cmp = icmp eq i8 %a, 0677 %and = and i8 %b, 123678 %cmp1 = icmp eq i8 %and, 0679 %or.cond = or i1 %cmp, %cmp1680 br i1 %or.cond, label %if.then, label %if.end681 682if.then: ; preds = %entry683 tail call void (...) @foo()684 br label %if.end685 686if.end: ; preds = %entry, %if.then687 ret void688}689 690define void @ctest16mi_zf(i16 noundef %a, ptr %ptr) {691; CHECK-LABEL: ctest16mi_zf:692; CHECK: # %bb.0: # %entry693; CHECK-NEXT: movzwl (%rsi), %eax694; CHECK-NEXT: andl $1234, %eax # imm = 0x4D2695; CHECK-NEXT: testw %di, %di696; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax697; CHECK-NEXT: jne .LBB18_1698; CHECK-NEXT: # %bb.2: # %if.then699; CHECK-NEXT: xorl %eax, %eax700; CHECK-NEXT: jmp foo # TAILCALL701; CHECK-NEXT: .LBB18_1: # %if.end702; CHECK-NEXT: retq703;704; NDD-LABEL: ctest16mi_zf:705; NDD: # %bb.0: # %entry706; NDD-NEXT: testw %di, %di707; NDD-NEXT: ctestnew {dfv=zf} $1234, (%rsi) # imm = 0x4D2708; NDD-NEXT: jne .LBB18_1709; NDD-NEXT: # %bb.2: # %if.then710; NDD-NEXT: xorl %eax, %eax711; NDD-NEXT: jmp foo # TAILCALL712; NDD-NEXT: .LBB18_1: # %if.end713; NDD-NEXT: retq714entry:715 %b = load i16, ptr %ptr716 %cmp = icmp eq i16 %a, 0717 %and = and i16 %b, 1234718 %cmp1 = icmp eq i16 %and, 0719 %or.cond = or i1 %cmp, %cmp1720 br i1 %or.cond, label %if.then, label %if.end721 722if.then: ; preds = %entry723 tail call void (...) @foo()724 br label %if.end725 726if.end: ; preds = %entry, %if.then727 ret void728}729 730define void @ctest32mi_zf(i32 noundef %a, ptr %ptr) {731; CHECK-LABEL: ctest32mi_zf:732; CHECK: # %bb.0: # %entry733; CHECK-NEXT: movzwl (%rsi), %eax734; CHECK-NEXT: andl $12345, %eax # imm = 0x3039735; CHECK-NEXT: testl %edi, %edi736; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax737; CHECK-NEXT: jne .LBB19_1738; CHECK-NEXT: # %bb.2: # %if.then739; CHECK-NEXT: xorl %eax, %eax740; CHECK-NEXT: jmp foo # TAILCALL741; CHECK-NEXT: .LBB19_1: # %if.end742; CHECK-NEXT: retq743;744; NDD-LABEL: ctest32mi_zf:745; NDD: # %bb.0: # %entry746; NDD-NEXT: testl %edi, %edi747; NDD-NEXT: ctestnew {dfv=zf} $12345, (%rsi) # imm = 0x3039748; NDD-NEXT: jne .LBB19_1749; NDD-NEXT: # %bb.2: # %if.then750; NDD-NEXT: xorl %eax, %eax751; NDD-NEXT: jmp foo # TAILCALL752; NDD-NEXT: .LBB19_1: # %if.end753; NDD-NEXT: retq754entry:755 %b = load i32, ptr %ptr756 %cmp = icmp eq i32 %a, 0757 %and = and i32 %b, 12345758 %cmp1 = icmp eq i32 %and, 0759 %or.cond = or i1 %cmp, %cmp1760 br i1 %or.cond, label %if.then, label %if.end761 762if.then: ; preds = %entry763 tail call void (...) @foo()764 br label %if.end765 766if.end: ; preds = %entry, %if.then767 ret void768}769 770define void @ctest64mi32_zf(i64 noundef %a, ptr %ptr) {771; CHECK-LABEL: ctest64mi32_zf:772; CHECK: # %bb.0: # %entry773; CHECK-NEXT: testq %rdi, %rdi774; CHECK-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240775; CHECK-NEXT: jne .LBB20_1776; CHECK-NEXT: # %bb.2: # %if.then777; CHECK-NEXT: xorl %eax, %eax778; CHECK-NEXT: jmp foo # TAILCALL779; CHECK-NEXT: .LBB20_1: # %if.end780; CHECK-NEXT: retq781;782; NDD-LABEL: ctest64mi32_zf:783; NDD: # %bb.0: # %entry784; NDD-NEXT: testq %rdi, %rdi785; NDD-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240786; NDD-NEXT: jne .LBB20_1787; NDD-NEXT: # %bb.2: # %if.then788; NDD-NEXT: xorl %eax, %eax789; NDD-NEXT: jmp foo # TAILCALL790; NDD-NEXT: .LBB20_1: # %if.end791; NDD-NEXT: retq792entry:793 %b = load i64, ptr %ptr794 %cmp = icmp eq i64 %a, 0795 %and = and i64 %b, 123456796 %cmp1 = icmp eq i64 %and, 0797 %or.cond = or i1 %cmp, %cmp1798 br i1 %or.cond, label %if.then, label %if.end799 800if.then: ; preds = %entry801 tail call void (...) @foo()802 br label %if.end803 804if.end: ; preds = %entry, %if.then805 ret void806}807 808define void @ctest_continous(i32 noundef %a, i32 noundef %b, i32 noundef %c) {809; CHECK-LABEL: ctest_continous:810; CHECK: # %bb.0: # %entry811; CHECK-NEXT: cmpl %esi, %edi812; CHECK-NEXT: ctestll {dfv=} %esi, %esi813; CHECK-NEXT: ctestnsl {dfv=sf} %edx, %edx814; CHECK-NEXT: jns .LBB21_1815; CHECK-NEXT: # %bb.2: # %if.then816; CHECK-NEXT: xorl %eax, %eax817; CHECK-NEXT: jmp foo # TAILCALL818; CHECK-NEXT: .LBB21_1: # %if.end819; CHECK-NEXT: retq820;821; NDD-LABEL: ctest_continous:822; NDD: # %bb.0: # %entry823; NDD-NEXT: cmpl %esi, %edi824; NDD-NEXT: ctestll {dfv=} %esi, %esi825; NDD-NEXT: ctestnsl {dfv=sf} %edx, %edx826; NDD-NEXT: jns .LBB21_1827; NDD-NEXT: # %bb.2: # %if.then828; NDD-NEXT: xorl %eax, %eax829; NDD-NEXT: jmp foo # TAILCALL830; NDD-NEXT: .LBB21_1: # %if.end831; NDD-NEXT: retq832entry:833 %cmp = icmp slt i32 %a, %b834 %cmp1 = icmp slt i32 %b, 0835 %or.cond = and i1 %cmp, %cmp1836 %cmp2 = icmp slt i32 %c, 0837 %or.cond3 = or i1 %or.cond, %cmp2838 br i1 %or.cond3, label %if.then, label %if.end839 840if.then: ; preds = %entry841 tail call void (...) @foo()842 br label %if.end843 844if.end: ; preds = %if.then, %entry845 ret void846}847 848define i32 @ctest_nobranch(i32 noundef %a, i32 noundef %b) {849; CHECK-LABEL: ctest_nobranch:850; CHECK: # %bb.0: # %entry851; CHECK-NEXT: testl %edi, %edi852; CHECK-NEXT: ctestlel {dfv=} %esi, %esi853; CHECK-NEXT: setg %al854; CHECK-NEXT: movzbl %al, %eax855; CHECK-NEXT: retq856;857; NDD-LABEL: ctest_nobranch:858; NDD: # %bb.0: # %entry859; NDD-NEXT: testl %edi, %edi860; NDD-NEXT: ctestlel {dfv=} %esi, %esi861; NDD-NEXT: setg %al862; NDD-NEXT: movzbl %al, %eax863; NDD-NEXT: retq864entry:865 %cmp = icmp sgt i32 %a, 0866 %cmp1 = icmp sgt i32 %b, 0867 %or.cond.not = or i1 %cmp, %cmp1868 %. = zext i1 %or.cond.not to i32869 ret i32 %.870}871 872define i32 @ctest_continous_nobranch(i32 noundef %a, i32 noundef %b, i32 noundef %c) {873; CHECK-LABEL: ctest_continous_nobranch:874; CHECK: # %bb.0: # %entry875; CHECK-NEXT: testl %edi, %edi876; CHECK-NEXT: ctestlel {dfv=sf} %esi, %esi877; CHECK-NEXT: ctestsl {dfv=zf} %edx, %edx878; CHECK-NEXT: setg %al879; CHECK-NEXT: movzbl %al, %eax880; CHECK-NEXT: retq881;882; NDD-LABEL: ctest_continous_nobranch:883; NDD: # %bb.0: # %entry884; NDD-NEXT: testl %edi, %edi885; NDD-NEXT: ctestlel {dfv=sf} %esi, %esi886; NDD-NEXT: ctestsl {dfv=zf} %edx, %edx887; NDD-NEXT: setg %al888; NDD-NEXT: movzbl %al, %eax889; NDD-NEXT: retq890entry:891 %cmp = icmp sgt i32 %a, 0892 %cmp1 = icmp slt i32 %b, 0893 %cmp2 = icmp sgt i32 %c, 0894 %or1 = or i1 %cmp, %cmp1895 %or2 = and i1 %or1, %cmp2896 %. = zext i1 %or2 to i32897 ret i32 %.898}899 900define void @ctest64ri64(i64 noundef %a, i64 noundef %b) {901; CHECK-LABEL: ctest64ri64:902; CHECK: # %bb.0: # %entry903; CHECK-NEXT: testq %rdi, %rdi904; CHECK-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF905; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rsi906; CHECK-NEXT: jne .LBB24_1907; CHECK-NEXT: # %bb.2: # %if.then908; CHECK-NEXT: xorl %eax, %eax909; CHECK-NEXT: jmp foo # TAILCALL910; CHECK-NEXT: .LBB24_1: # %if.end911; CHECK-NEXT: retq912;913; NDD-LABEL: ctest64ri64:914; NDD: # %bb.0: # %entry915; NDD-NEXT: testq %rdi, %rdi916; NDD-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF917; NDD-NEXT: ctestneq {dfv=zf} %rax, %rsi918; NDD-NEXT: jne .LBB24_1919; NDD-NEXT: # %bb.2: # %if.then920; NDD-NEXT: xorl %eax, %eax921; NDD-NEXT: jmp foo # TAILCALL922; NDD-NEXT: .LBB24_1: # %if.end923; NDD-NEXT: retq924entry:925 %cmp = icmp eq i64 %a, 0926 %and = and i64 %b, 9992147483647927 %cmp1 = icmp eq i64 %and, 0928 %or.cond = or i1 %cmp, %cmp1929 br i1 %or.cond, label %if.then, label %if.end930 931if.then: ; preds = %entry932 tail call void (...) @foo()933 br label %if.end934 935if.end: ; preds = %entry, %if.then936 ret void937}938 939define void @cmp_srem(ptr %p, i32 %a, ptr %b) {940; CHECK-LABEL: cmp_srem:941; CHECK: # %bb.0: # %bb942; CHECK-NEXT: movq %rdx, %rcx943; CHECK-NEXT: movl %esi, %eax944; CHECK-NEXT: subl $1, %eax945; CHECK-NEXT: movl (%rdi), %edi946; CHECK-NEXT: cltd947; CHECK-NEXT: {nf} idivl %edi948; CHECK-NEXT: ctestnel {dfv=} %edx, %edx949; CHECK-NEXT: sete %al950; CHECK-NEXT: cmpl $1, %esi951; CHECK-NEXT: ccmpael {dfv=zf} $1, %edi952; CHECK-NEXT: sete %dl953; CHECK-NEXT: orb %al, %dl954; CHECK-NEXT: movb %dl, (%rcx)955; CHECK-NEXT: retq956;957; NDD-LABEL: cmp_srem:958; NDD: # %bb.0: # %bb959; NDD-NEXT: movq %rdx, %rcx960; NDD-NEXT: subl $1, %esi, %eax961; NDD-NEXT: movl (%rdi), %edi962; NDD-NEXT: cltd963; NDD-NEXT: {nf} idivl %edi964; NDD-NEXT: ctestnel {dfv=} %edx, %edx965; NDD-NEXT: sete %al966; NDD-NEXT: cmpl $1, %esi967; NDD-NEXT: ccmpael {dfv=zf} $1, %edi968; NDD-NEXT: sete %dl969; NDD-NEXT: orb %dl, %al970; NDD-NEXT: movb %al, (%rcx)971; NDD-NEXT: retq972bb:973 %i = icmp eq i32 %a, 0974 %i2 = load i32, ptr %p, align 4975 %i3 = icmp eq i32 %i2, 1976 %i4 = or i1 %i, %i3977 %i5 = add i32 %a, -1978 %i6 = srem i32 %i5, %i2979 %i7 = icmp eq i32 %i6, 0980 %i8 = icmp ne i32 %a, 1981 %i9 = and i1 %i8, %i7982 %i10 = or i1 %i4, %i9983 store i1 %i10, ptr %b, align 1984 ret void985}986 987declare dso_local void @foo(...)988