1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp -verify-machineinstrs | FileCheck %s 3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+ndd -verify-machineinstrs | FileCheck %s --check-prefix=NDD 4 5define void @ctest8rr_zf(i8 noundef %a, i8 noundef %b) { 6; CHECK-LABEL: ctest8rr_zf: 7; CHECK: # %bb.0: # %entry 8; CHECK-NEXT: testb %dil, %dil 9; CHECK-NEXT: ctestneb {dfv=zf} %sil, %sil 10; CHECK-NEXT: jne .LBB0_1 11; CHECK-NEXT: # %bb.2: # %if.then 12; CHECK-NEXT: xorl %eax, %eax 13; CHECK-NEXT: jmp foo # TAILCALL 14; CHECK-NEXT: .LBB0_1: # %if.end 15; CHECK-NEXT: retq 16; 17; NDD-LABEL: ctest8rr_zf: 18; NDD: # %bb.0: # %entry 19; NDD-NEXT: testb %dil, %dil 20; NDD-NEXT: ctestneb {dfv=zf} %sil, %sil 21; NDD-NEXT: jne .LBB0_1 22; NDD-NEXT: # %bb.2: # %if.then 23; NDD-NEXT: xorl %eax, %eax 24; NDD-NEXT: jmp foo # TAILCALL 25; NDD-NEXT: .LBB0_1: # %if.end 26; NDD-NEXT: retq 27entry: 28 %cmp = icmp eq i8 %a, 0 29 %cmp1 = icmp eq i8 %b, 0 30 %or.cond = or i1 %cmp, %cmp1 31 br i1 %or.cond, label %if.then, label %if.end 32 33if.then: ; preds = %entry 34 tail call void (...) @foo() 35 br label %if.end 36 37if.end: ; preds = %entry, %if.then 38 ret void 39} 40 41define i8 @ctest8rr_zf_double(i8 %a, double %b, i8* nocapture %c) { 42; CHECK-LABEL: ctest8rr_zf_double: 43; CHECK: # %bb.0: # %entry 44; CHECK-NEXT: xorpd %xmm1, %xmm1 45; CHECK-NEXT: ucomisd %xmm1, %xmm0 46; CHECK-NEXT: ctesteb {dfv=zf} %dil, %dil 47; CHECK-NEXT: je .LBB1_2 48; CHECK-NEXT: # %bb.1: # %if.then 49; CHECK-NEXT: movb %dil, (%rsi) 50; CHECK-NEXT: .LBB1_2: # %if.end 51; CHECK-NEXT: xorl %eax, %eax 52; CHECK-NEXT: retq 53; 54; NDD-LABEL: ctest8rr_zf_double: 55; NDD: # %bb.0: # %entry 56; NDD-NEXT: xorpd %xmm1, %xmm1 57; NDD-NEXT: ucomisd %xmm1, %xmm0 58; NDD-NEXT: ctesteb {dfv=zf} %dil, %dil 59; NDD-NEXT: je .LBB1_2 60; NDD-NEXT: # %bb.1: # %if.then 61; NDD-NEXT: movb %dil, (%rsi) 62; NDD-NEXT: .LBB1_2: # %if.end 63; NDD-NEXT: xorl %eax, %eax 64; NDD-NEXT: retq 65entry: 66 %tobool = icmp ne i8 %a, 0 67 %cmp = fcmp ueq double %b, 0.0 68 %or.cond = select i1 %tobool, i1 %cmp, i1 false 69 br i1 %or.cond, label %if.then, label %if.end 70 71if.then: 72 store i8 %a, i8* %c, align 4 73 br label %if.end 74 75if.end: 76 ret i8 0 77} 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: # %entry 82; CHECK-NEXT: testb %dil, %dil 83; CHECK-NEXT: setne %al 84; CHECK-NEXT: ucomisd %xmm0, %xmm0 85; CHECK-NEXT: setp %cl 86; CHECK-NEXT: andb %al, %cl 87; CHECK-NEXT: cmpb $1, %cl 88; CHECK-NEXT: jne .LBB2_2 89; CHECK-NEXT: # %bb.1: # %if.then 90; CHECK-NEXT: movb %dil, (%rsi) 91; CHECK-NEXT: .LBB2_2: # %if.end 92; CHECK-NEXT: xorl %eax, %eax 93; CHECK-NEXT: retq 94; 95; NDD-LABEL: ctest8rr_zf_double_p: 96; NDD: # %bb.0: # %entry 97; NDD-NEXT: testb %dil, %dil 98; NDD-NEXT: setne %al 99; NDD-NEXT: ucomisd %xmm0, %xmm0 100; NDD-NEXT: setp %cl 101; NDD-NEXT: andb %cl, %al 102; NDD-NEXT: cmpb $1, %al 103; NDD-NEXT: jne .LBB2_2 104; NDD-NEXT: # %bb.1: # %if.then 105; NDD-NEXT: movb %dil, (%rsi) 106; NDD-NEXT: .LBB2_2: # %if.end 107; NDD-NEXT: xorl %eax, %eax 108; NDD-NEXT: retq 109entry: 110 %tobool = icmp ne i8 %a, 0 111 %cmp = fcmp uno double %b, 0.0 112 %or.cond = select i1 %tobool, i1 %cmp, i1 false 113 br i1 %or.cond, label %if.then, label %if.end 114 115if.then: 116 store i8 %a, i8* %c, align 4 117 br label %if.end 118 119if.end: 120 ret i8 0 121} 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: # %entry 126; CHECK-NEXT: testb %dil, %dil 127; CHECK-NEXT: setne %al 128; CHECK-NEXT: ucomisd %xmm0, %xmm0 129; CHECK-NEXT: setnp %cl 130; CHECK-NEXT: andb %al, %cl 131; CHECK-NEXT: cmpb $1, %cl 132; CHECK-NEXT: jne .LBB3_2 133; CHECK-NEXT: # %bb.1: # %if.then 134; CHECK-NEXT: movb %dil, (%rsi) 135; CHECK-NEXT: .LBB3_2: # %if.end 136; CHECK-NEXT: xorl %eax, %eax 137; CHECK-NEXT: retq 138; 139; NDD-LABEL: ctest8rr_zf_double_np: 140; NDD: # %bb.0: # %entry 141; NDD-NEXT: testb %dil, %dil 142; NDD-NEXT: setne %al 143; NDD-NEXT: ucomisd %xmm0, %xmm0 144; NDD-NEXT: setnp %cl 145; NDD-NEXT: andb %cl, %al 146; NDD-NEXT: cmpb $1, %al 147; NDD-NEXT: jne .LBB3_2 148; NDD-NEXT: # %bb.1: # %if.then 149; NDD-NEXT: movb %dil, (%rsi) 150; NDD-NEXT: .LBB3_2: # %if.end 151; NDD-NEXT: xorl %eax, %eax 152; NDD-NEXT: retq 153entry: 154 %tobool = icmp ne i8 %a, 0 155 %cmp = fcmp ord double %b, 0.0 156 %or.cond = select i1 %tobool, i1 %cmp, i1 false 157 br i1 %or.cond, label %if.then, label %if.end 158 159if.then: 160 store i8 %a, i8* %c, align 4 161 br label %if.end 162 163if.end: 164 ret i8 0 165} 166 167define void @ctest8rr_sf(i8 noundef %a, i8 noundef %b) { 168; CHECK-LABEL: ctest8rr_sf: 169; CHECK: # %bb.0: # %entry 170; CHECK-NEXT: testb %dil, %dil 171; CHECK-NEXT: ctesteb {dfv=sf} %sil, %sil 172; CHECK-NEXT: js .LBB4_1 173; CHECK-NEXT: # %bb.2: # %if.then 174; CHECK-NEXT: xorl %eax, %eax 175; CHECK-NEXT: jmp foo # TAILCALL 176; CHECK-NEXT: .LBB4_1: # %if.end 177; CHECK-NEXT: retq 178; 179; NDD-LABEL: ctest8rr_sf: 180; NDD: # %bb.0: # %entry 181; NDD-NEXT: testb %dil, %dil 182; NDD-NEXT: ctesteb {dfv=sf} %sil, %sil 183; NDD-NEXT: js .LBB4_1 184; NDD-NEXT: # %bb.2: # %if.then 185; NDD-NEXT: xorl %eax, %eax 186; NDD-NEXT: jmp foo # TAILCALL 187; NDD-NEXT: .LBB4_1: # %if.end 188; NDD-NEXT: retq 189entry: 190 %cmp = icmp ule i8 %a, 0 191 %tobool = icmp sge i8 %b, 0 192 %or.cond = and i1 %cmp, %tobool 193 br i1 %or.cond, label %if.then, label %if.end 194 195if.then: ; preds = %entry 196 tail call void (...) @foo() 197 br label %if.end 198 199if.end: ; preds = %if.then, %entry 200 ret void 201} 202 203define i8 @ctest8rr_sf_2(i8 %a, i8 %b, i8* nocapture %c) { 204; CHECK-LABEL: ctest8rr_sf_2: 205; CHECK: # %bb.0: # %entry 206; CHECK-NEXT: testb %dil, %dil 207; CHECK-NEXT: ctestleb {dfv=sf} %sil, %sil 208; CHECK-NEXT: jns .LBB5_2 209; CHECK-NEXT: # %bb.1: # %if.then 210; CHECK-NEXT: movb %dil, (%rdx) 211; CHECK-NEXT: .LBB5_2: # %if.end 212; CHECK-NEXT: xorl %eax, %eax 213; CHECK-NEXT: retq 214; 215; NDD-LABEL: ctest8rr_sf_2: 216; NDD: # %bb.0: # %entry 217; NDD-NEXT: testb %dil, %dil 218; NDD-NEXT: ctestleb {dfv=sf} %sil, %sil 219; NDD-NEXT: jns .LBB5_2 220; NDD-NEXT: # %bb.1: # %if.then 221; NDD-NEXT: movb %dil, (%rdx) 222; NDD-NEXT: .LBB5_2: # %if.end 223; NDD-NEXT: xorl %eax, %eax 224; NDD-NEXT: retq 225entry: 226 %tobool = icmp sgt i8 %a, 0 227 %cmp = icmp slt i8 %b, 0 228 %or.cond = select i1 %tobool, i1 true, i1 %cmp 229 br i1 %or.cond, label %if.then, label %if.end 230 231if.then: 232 store i8 %a, i8* %c, align 4 233 br label %if.end 234 235if.end: 236 ret i8 0 237} 238 239define i8 @ctest8rr_none(i8 %a, i8 %b, i8* nocapture %c) { 240; CHECK-LABEL: ctest8rr_none: 241; CHECK: # %bb.0: # %entry 242; CHECK-NEXT: testb %dil, %dil 243; CHECK-NEXT: ctestneb {dfv=} %sil, %sil 244; CHECK-NEXT: jne .LBB6_2 245; CHECK-NEXT: # %bb.1: # %if.then 246; CHECK-NEXT: movb %dil, (%rdx) 247; CHECK-NEXT: .LBB6_2: # %if.end 248; CHECK-NEXT: xorl %eax, %eax 249; CHECK-NEXT: retq 250; 251; NDD-LABEL: ctest8rr_none: 252; NDD: # %bb.0: # %entry 253; NDD-NEXT: testb %dil, %dil 254; NDD-NEXT: ctestneb {dfv=} %sil, %sil 255; NDD-NEXT: jne .LBB6_2 256; NDD-NEXT: # %bb.1: # %if.then 257; NDD-NEXT: movb %dil, (%rdx) 258; NDD-NEXT: .LBB6_2: # %if.end 259; NDD-NEXT: xorl %eax, %eax 260; NDD-NEXT: retq 261entry: 262 %tobool = icmp ne i8 %a, 0 263 %cmp = icmp eq i8 %b, 0 264 %or.cond = select i1 %tobool, i1 %cmp, i1 false 265 br i1 %or.cond, label %if.then, label %if.end 266 267if.then: 268 store i8 %a, i8* %c, align 4 269 br label %if.end 270 271if.end: 272 ret i8 0 273} 274 275define void @ctest16rr_sf(i16 noundef %a, i16 noundef %b) { 276; CHECK-LABEL: ctest16rr_sf: 277; CHECK: # %bb.0: # %entry 278; CHECK-NEXT: testw %di, %di 279; CHECK-NEXT: ctestlew {dfv=sf} %si, %si 280; CHECK-NEXT: jns .LBB7_1 281; CHECK-NEXT: # %bb.2: # %if.then 282; CHECK-NEXT: xorl %eax, %eax 283; CHECK-NEXT: jmp foo # TAILCALL 284; CHECK-NEXT: .LBB7_1: # %if.end 285; CHECK-NEXT: retq 286; 287; NDD-LABEL: ctest16rr_sf: 288; NDD: # %bb.0: # %entry 289; NDD-NEXT: testw %di, %di 290; NDD-NEXT: ctestlew {dfv=sf} %si, %si 291; NDD-NEXT: jns .LBB7_1 292; NDD-NEXT: # %bb.2: # %if.then 293; NDD-NEXT: xorl %eax, %eax 294; NDD-NEXT: jmp foo # TAILCALL 295; NDD-NEXT: .LBB7_1: # %if.end 296; NDD-NEXT: retq 297entry: 298 %cmp = icmp sgt i16 %a, 0 299 %cmp1 = icmp slt i16 %b, 0 300 %or.cond = or i1 %cmp, %cmp1 301 br i1 %or.cond, label %if.then, label %if.end 302 303if.then: ; preds = %entry 304 tail call void (...) @foo() 305 br label %if.end 306 307if.end: ; preds = %entry, %if.then 308 ret void 309} 310 311define void @ctest32rr_zf(i32 noundef %a, i32 noundef %b) { 312; CHECK-LABEL: ctest32rr_zf: 313; CHECK: # %bb.0: # %entry 314; CHECK-NEXT: testl %edi, %edi 315; CHECK-NEXT: ctestsl {dfv=zf} %esi, %esi 316; CHECK-NEXT: jne .LBB8_1 317; CHECK-NEXT: # %bb.2: # %if.then 318; CHECK-NEXT: xorl %eax, %eax 319; CHECK-NEXT: jmp foo # TAILCALL 320; CHECK-NEXT: .LBB8_1: # %if.end 321; CHECK-NEXT: retq 322; 323; NDD-LABEL: ctest32rr_zf: 324; NDD: # %bb.0: # %entry 325; NDD-NEXT: testl %edi, %edi 326; NDD-NEXT: ctestsl {dfv=zf} %esi, %esi 327; NDD-NEXT: jne .LBB8_1 328; NDD-NEXT: # %bb.2: # %if.then 329; NDD-NEXT: xorl %eax, %eax 330; NDD-NEXT: jmp foo # TAILCALL 331; NDD-NEXT: .LBB8_1: # %if.end 332; NDD-NEXT: retq 333entry: 334 %cmp = icmp sge i32 %a, 0 335 %cmp1 = icmp eq i32 %b, 0 336 %or.cond = or i1 %cmp, %cmp1 337 br i1 %or.cond, label %if.then, label %if.end 338 339if.then: ; preds = %entry 340 tail call void (...) @foo() 341 br label %if.end 342 343if.end: ; preds = %entry, %if.then 344 ret void 345} 346 347define void @ctest8ri_zf(i8 noundef %a, i8 noundef %b) { 348; CHECK-LABEL: ctest8ri_zf: 349; CHECK: # %bb.0: # %entry 350; CHECK-NEXT: testb %dil, %dil 351; CHECK-NEXT: ctestneb {dfv=zf} $123, %sil 352; CHECK-NEXT: jne .LBB9_1 353; CHECK-NEXT: # %bb.2: # %if.then 354; CHECK-NEXT: xorl %eax, %eax 355; CHECK-NEXT: jmp foo # TAILCALL 356; CHECK-NEXT: .LBB9_1: # %if.end 357; CHECK-NEXT: retq 358; 359; NDD-LABEL: ctest8ri_zf: 360; NDD: # %bb.0: # %entry 361; NDD-NEXT: testb %dil, %dil 362; NDD-NEXT: ctestneb {dfv=zf} $123, %sil 363; NDD-NEXT: jne .LBB9_1 364; NDD-NEXT: # %bb.2: # %if.then 365; NDD-NEXT: xorl %eax, %eax 366; NDD-NEXT: jmp foo # TAILCALL 367; NDD-NEXT: .LBB9_1: # %if.end 368; NDD-NEXT: retq 369entry: 370 %cmp = icmp eq i8 %a, 0 371 %and = and i8 %b, 123 372 %cmp1 = icmp eq i8 %and, 0 373 %or.cond = or i1 %cmp, %cmp1 374 br i1 %or.cond, label %if.then, label %if.end 375 376if.then: ; preds = %entry 377 tail call void (...) @foo() 378 br label %if.end 379 380if.end: ; preds = %entry, %if.then 381 ret void 382} 383 384define void @ctest16ri_zf(i16 noundef %a, i16 noundef %b) { 385; CHECK-LABEL: ctest16ri_zf: 386; CHECK: # %bb.0: # %entry 387; CHECK-NEXT: andl $1234, %esi # imm = 0x4D2 388; CHECK-NEXT: testw %di, %di 389; CHECK-NEXT: ctestnew {dfv=zf} %si, %si 390; CHECK-NEXT: jne .LBB10_1 391; CHECK-NEXT: # %bb.2: # %if.then 392; CHECK-NEXT: xorl %eax, %eax 393; CHECK-NEXT: jmp foo # TAILCALL 394; CHECK-NEXT: .LBB10_1: # %if.end 395; CHECK-NEXT: retq 396; 397; NDD-LABEL: ctest16ri_zf: 398; NDD: # %bb.0: # %entry 399; NDD-NEXT: testw %di, %di 400; NDD-NEXT: ctestnew {dfv=zf} $1234, %si # imm = 0x4D2 401; NDD-NEXT: jne .LBB10_1 402; NDD-NEXT: # %bb.2: # %if.then 403; NDD-NEXT: xorl %eax, %eax 404; NDD-NEXT: jmp foo # TAILCALL 405; NDD-NEXT: .LBB10_1: # %if.end 406; NDD-NEXT: retq 407entry: 408 %cmp = icmp eq i16 %a, 0 409 %and = and i16 %b, 1234 410 %cmp1 = icmp eq i16 %and, 0 411 %or.cond = or i1 %cmp, %cmp1 412 br i1 %or.cond, label %if.then, label %if.end 413 414if.then: ; preds = %entry 415 tail call void (...) @foo() 416 br label %if.end 417 418if.end: ; preds = %entry, %if.then 419 ret void 420} 421 422define void @ctest32ri_zf(i32 noundef %a, i32 noundef %b) { 423; CHECK-LABEL: ctest32ri_zf: 424; CHECK: # %bb.0: # %entry 425; CHECK-NEXT: testl %edi, %edi 426; CHECK-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039 427; CHECK-NEXT: jne .LBB11_1 428; CHECK-NEXT: # %bb.2: # %if.then 429; CHECK-NEXT: xorl %eax, %eax 430; CHECK-NEXT: jmp foo # TAILCALL 431; CHECK-NEXT: .LBB11_1: # %if.end 432; CHECK-NEXT: retq 433; 434; NDD-LABEL: ctest32ri_zf: 435; NDD: # %bb.0: # %entry 436; NDD-NEXT: testl %edi, %edi 437; NDD-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039 438; NDD-NEXT: jne .LBB11_1 439; NDD-NEXT: # %bb.2: # %if.then 440; NDD-NEXT: xorl %eax, %eax 441; NDD-NEXT: jmp foo # TAILCALL 442; NDD-NEXT: .LBB11_1: # %if.end 443; NDD-NEXT: retq 444entry: 445 %cmp = icmp eq i32 %a, 0 446 %and = and i32 %b, 12345 447 %cmp1 = icmp eq i32 %and, 0 448 %or.cond = or i1 %cmp, %cmp1 449 br i1 %or.cond, label %if.then, label %if.end 450 451if.then: ; preds = %entry 452 tail call void (...) @foo() 453 br label %if.end 454 455if.end: ; preds = %entry, %if.then 456 ret void 457} 458 459define void @ctest64ri32_zf(i64 noundef %a, i64 noundef %b) { 460; CHECK-LABEL: ctest64ri32_zf: 461; CHECK: # %bb.0: # %entry 462; CHECK-NEXT: testq %rdi, %rdi 463; CHECK-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240 464; CHECK-NEXT: jne .LBB12_1 465; CHECK-NEXT: # %bb.2: # %if.then 466; CHECK-NEXT: xorl %eax, %eax 467; CHECK-NEXT: jmp foo # TAILCALL 468; CHECK-NEXT: .LBB12_1: # %if.end 469; CHECK-NEXT: retq 470; 471; NDD-LABEL: ctest64ri32_zf: 472; NDD: # %bb.0: # %entry 473; NDD-NEXT: testq %rdi, %rdi 474; NDD-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240 475; NDD-NEXT: jne .LBB12_1 476; NDD-NEXT: # %bb.2: # %if.then 477; NDD-NEXT: xorl %eax, %eax 478; NDD-NEXT: jmp foo # TAILCALL 479; NDD-NEXT: .LBB12_1: # %if.end 480; NDD-NEXT: retq 481entry: 482 %cmp = icmp eq i64 %a, 0 483 %and = and i64 %b, 123456 484 %cmp1 = icmp eq i64 %and, 0 485 %or.cond = or i1 %cmp, %cmp1 486 br i1 %or.cond, label %if.then, label %if.end 487 488if.then: ; preds = %entry 489 tail call void (...) @foo() 490 br label %if.end 491 492if.end: ; preds = %entry, %if.then 493 ret void 494} 495 496define void @ctest8mr_zf(i8 noundef %a, ptr %ptr) { 497; CHECK-LABEL: ctest8mr_zf: 498; CHECK: # %bb.0: # %entry 499; CHECK-NEXT: movzbl (%rsi), %eax 500; CHECK-NEXT: testb %dil, %dil 501; CHECK-NEXT: ctestneb {dfv=zf} %al, %al 502; CHECK-NEXT: jne .LBB13_1 503; CHECK-NEXT: # %bb.2: # %if.then 504; CHECK-NEXT: xorl %eax, %eax 505; CHECK-NEXT: jmp foo # TAILCALL 506; CHECK-NEXT: .LBB13_1: # %if.end 507; CHECK-NEXT: retq 508; 509; NDD-LABEL: ctest8mr_zf: 510; NDD: # %bb.0: # %entry 511; NDD-NEXT: movzbl (%rsi), %eax 512; NDD-NEXT: testb %dil, %dil 513; NDD-NEXT: ctestneb {dfv=zf} %al, %al 514; NDD-NEXT: jne .LBB13_1 515; NDD-NEXT: # %bb.2: # %if.then 516; NDD-NEXT: xorl %eax, %eax 517; NDD-NEXT: jmp foo # TAILCALL 518; NDD-NEXT: .LBB13_1: # %if.end 519; NDD-NEXT: retq 520entry: 521 %b = load i8, ptr %ptr 522 %cmp = icmp eq i8 %a, 0 523 %cmp1 = icmp eq i8 %b, 0 524 %or.cond = or i1 %cmp, %cmp1 525 br i1 %or.cond, label %if.then, label %if.end 526 527if.then: ; preds = %entry 528 tail call void (...) @foo() 529 br label %if.end 530 531if.end: ; preds = %entry, %if.then 532 ret void 533} 534 535define void @ctest16mr_zf(i16 noundef %a, ptr %ptr) { 536; CHECK-LABEL: ctest16mr_zf: 537; CHECK: # %bb.0: # %entry 538; CHECK-NEXT: movzwl (%rsi), %eax 539; CHECK-NEXT: testw %di, %di 540; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax 541; CHECK-NEXT: jne .LBB14_1 542; CHECK-NEXT: # %bb.2: # %if.then 543; CHECK-NEXT: xorl %eax, %eax 544; CHECK-NEXT: jmp foo # TAILCALL 545; CHECK-NEXT: .LBB14_1: # %if.end 546; CHECK-NEXT: retq 547; 548; NDD-LABEL: ctest16mr_zf: 549; NDD: # %bb.0: # %entry 550; NDD-NEXT: movzwl (%rsi), %eax 551; NDD-NEXT: testw %di, %di 552; NDD-NEXT: ctestnew {dfv=zf} %ax, %ax 553; NDD-NEXT: jne .LBB14_1 554; NDD-NEXT: # %bb.2: # %if.then 555; NDD-NEXT: xorl %eax, %eax 556; NDD-NEXT: jmp foo # TAILCALL 557; NDD-NEXT: .LBB14_1: # %if.end 558; NDD-NEXT: retq 559entry: 560 %b = load i16, ptr %ptr 561 %cmp = icmp eq i16 %a, 0 562 %cmp1 = icmp eq i16 %b, 0 563 %or.cond = or i1 %cmp, %cmp1 564 br i1 %or.cond, label %if.then, label %if.end 565 566if.then: ; preds = %entry 567 tail call void (...) @foo() 568 br label %if.end 569 570if.end: ; preds = %entry, %if.then 571 ret void 572} 573 574define void @ctest32mr_cf(i32 noundef %a, ptr %ptr) { 575; CHECK-LABEL: ctest32mr_cf: 576; CHECK: # %bb.0: # %entry 577; CHECK-NEXT: movl (%rsi), %eax 578; CHECK-NEXT: testl %edi, %edi 579; CHECK-NEXT: ctestnel {dfv=zf} %eax, %eax 580; CHECK-NEXT: jne .LBB15_1 581; CHECK-NEXT: # %bb.2: # %if.then 582; CHECK-NEXT: xorl %eax, %eax 583; CHECK-NEXT: jmp foo # TAILCALL 584; CHECK-NEXT: .LBB15_1: # %if.end 585; CHECK-NEXT: retq 586; 587; NDD-LABEL: ctest32mr_cf: 588; NDD: # %bb.0: # %entry 589; NDD-NEXT: movl (%rsi), %eax 590; NDD-NEXT: testl %edi, %edi 591; NDD-NEXT: ctestnel {dfv=zf} %eax, %eax 592; NDD-NEXT: jne .LBB15_1 593; NDD-NEXT: # %bb.2: # %if.then 594; NDD-NEXT: xorl %eax, %eax 595; NDD-NEXT: jmp foo # TAILCALL 596; NDD-NEXT: .LBB15_1: # %if.end 597; NDD-NEXT: retq 598entry: 599 %b = load i32, ptr %ptr 600 %cmp = icmp eq i32 %a, 0 601 %cmp1 = icmp eq i32 %b, 0 602 %or.cond = or i1 %cmp, %cmp1 603 br i1 %or.cond, label %if.then, label %if.end 604 605if.then: ; preds = %entry 606 tail call void (...) @foo() 607 br label %if.end 608 609if.end: ; preds = %entry, %if.then 610 ret void 611} 612 613define void @ctest64mr_zf(i64 noundef %a, ptr %ptr) { 614; CHECK-LABEL: ctest64mr_zf: 615; CHECK: # %bb.0: # %entry 616; CHECK-NEXT: movq (%rsi), %rax 617; CHECK-NEXT: testq %rdi, %rdi 618; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rax 619; CHECK-NEXT: jne .LBB16_1 620; CHECK-NEXT: # %bb.2: # %if.then 621; CHECK-NEXT: xorl %eax, %eax 622; CHECK-NEXT: jmp foo # TAILCALL 623; CHECK-NEXT: .LBB16_1: # %if.end 624; CHECK-NEXT: retq 625; 626; NDD-LABEL: ctest64mr_zf: 627; NDD: # %bb.0: # %entry 628; NDD-NEXT: movq (%rsi), %rax 629; NDD-NEXT: testq %rdi, %rdi 630; NDD-NEXT: ctestneq {dfv=zf} %rax, %rax 631; NDD-NEXT: jne .LBB16_1 632; NDD-NEXT: # %bb.2: # %if.then 633; NDD-NEXT: xorl %eax, %eax 634; NDD-NEXT: jmp foo # TAILCALL 635; NDD-NEXT: .LBB16_1: # %if.end 636; NDD-NEXT: retq 637entry: 638 %b = load i64, ptr %ptr 639 %cmp = icmp eq i64 %a, 0 640 %cmp1 = icmp eq i64 %b, 0 641 %or.cond = or i1 %cmp, %cmp1 642 br i1 %or.cond, label %if.then, label %if.end 643 644if.then: ; preds = %entry 645 tail call void (...) @foo() 646 br label %if.end 647 648if.end: ; preds = %entry, %if.then 649 ret void 650} 651 652define void @ctest8mi_zf(i8 noundef %a, ptr %ptr) { 653; CHECK-LABEL: ctest8mi_zf: 654; CHECK: # %bb.0: # %entry 655; CHECK-NEXT: testb %dil, %dil 656; CHECK-NEXT: ctestneb {dfv=zf} $123, (%rsi) 657; CHECK-NEXT: jne .LBB17_1 658; CHECK-NEXT: # %bb.2: # %if.then 659; CHECK-NEXT: xorl %eax, %eax 660; CHECK-NEXT: jmp foo # TAILCALL 661; CHECK-NEXT: .LBB17_1: # %if.end 662; CHECK-NEXT: retq 663; 664; NDD-LABEL: ctest8mi_zf: 665; NDD: # %bb.0: # %entry 666; NDD-NEXT: testb %dil, %dil 667; NDD-NEXT: ctestneb {dfv=zf} $123, (%rsi) 668; NDD-NEXT: jne .LBB17_1 669; NDD-NEXT: # %bb.2: # %if.then 670; NDD-NEXT: xorl %eax, %eax 671; NDD-NEXT: jmp foo # TAILCALL 672; NDD-NEXT: .LBB17_1: # %if.end 673; NDD-NEXT: retq 674entry: 675 %b = load i8, ptr %ptr 676 %cmp = icmp eq i8 %a, 0 677 %and = and i8 %b, 123 678 %cmp1 = icmp eq i8 %and, 0 679 %or.cond = or i1 %cmp, %cmp1 680 br i1 %or.cond, label %if.then, label %if.end 681 682if.then: ; preds = %entry 683 tail call void (...) @foo() 684 br label %if.end 685 686if.end: ; preds = %entry, %if.then 687 ret void 688} 689 690define void @ctest16mi_zf(i16 noundef %a, ptr %ptr) { 691; CHECK-LABEL: ctest16mi_zf: 692; CHECK: # %bb.0: # %entry 693; CHECK-NEXT: movzwl (%rsi), %eax 694; CHECK-NEXT: andl $1234, %eax # imm = 0x4D2 695; CHECK-NEXT: testw %di, %di 696; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax 697; CHECK-NEXT: jne .LBB18_1 698; CHECK-NEXT: # %bb.2: # %if.then 699; CHECK-NEXT: xorl %eax, %eax 700; CHECK-NEXT: jmp foo # TAILCALL 701; CHECK-NEXT: .LBB18_1: # %if.end 702; CHECK-NEXT: retq 703; 704; NDD-LABEL: ctest16mi_zf: 705; NDD: # %bb.0: # %entry 706; NDD-NEXT: testw %di, %di 707; NDD-NEXT: ctestnew {dfv=zf} $1234, (%rsi) # imm = 0x4D2 708; NDD-NEXT: jne .LBB18_1 709; NDD-NEXT: # %bb.2: # %if.then 710; NDD-NEXT: xorl %eax, %eax 711; NDD-NEXT: jmp foo # TAILCALL 712; NDD-NEXT: .LBB18_1: # %if.end 713; NDD-NEXT: retq 714entry: 715 %b = load i16, ptr %ptr 716 %cmp = icmp eq i16 %a, 0 717 %and = and i16 %b, 1234 718 %cmp1 = icmp eq i16 %and, 0 719 %or.cond = or i1 %cmp, %cmp1 720 br i1 %or.cond, label %if.then, label %if.end 721 722if.then: ; preds = %entry 723 tail call void (...) @foo() 724 br label %if.end 725 726if.end: ; preds = %entry, %if.then 727 ret void 728} 729 730define void @ctest32mi_zf(i32 noundef %a, ptr %ptr) { 731; CHECK-LABEL: ctest32mi_zf: 732; CHECK: # %bb.0: # %entry 733; CHECK-NEXT: movzwl (%rsi), %eax 734; CHECK-NEXT: andl $12345, %eax # imm = 0x3039 735; CHECK-NEXT: testl %edi, %edi 736; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax 737; CHECK-NEXT: jne .LBB19_1 738; CHECK-NEXT: # %bb.2: # %if.then 739; CHECK-NEXT: xorl %eax, %eax 740; CHECK-NEXT: jmp foo # TAILCALL 741; CHECK-NEXT: .LBB19_1: # %if.end 742; CHECK-NEXT: retq 743; 744; NDD-LABEL: ctest32mi_zf: 745; NDD: # %bb.0: # %entry 746; NDD-NEXT: testl %edi, %edi 747; NDD-NEXT: ctestnew {dfv=zf} $12345, (%rsi) # imm = 0x3039 748; NDD-NEXT: jne .LBB19_1 749; NDD-NEXT: # %bb.2: # %if.then 750; NDD-NEXT: xorl %eax, %eax 751; NDD-NEXT: jmp foo # TAILCALL 752; NDD-NEXT: .LBB19_1: # %if.end 753; NDD-NEXT: retq 754entry: 755 %b = load i32, ptr %ptr 756 %cmp = icmp eq i32 %a, 0 757 %and = and i32 %b, 12345 758 %cmp1 = icmp eq i32 %and, 0 759 %or.cond = or i1 %cmp, %cmp1 760 br i1 %or.cond, label %if.then, label %if.end 761 762if.then: ; preds = %entry 763 tail call void (...) @foo() 764 br label %if.end 765 766if.end: ; preds = %entry, %if.then 767 ret void 768} 769 770define void @ctest64mi32_zf(i64 noundef %a, ptr %ptr) { 771; CHECK-LABEL: ctest64mi32_zf: 772; CHECK: # %bb.0: # %entry 773; CHECK-NEXT: testq %rdi, %rdi 774; CHECK-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240 775; CHECK-NEXT: jne .LBB20_1 776; CHECK-NEXT: # %bb.2: # %if.then 777; CHECK-NEXT: xorl %eax, %eax 778; CHECK-NEXT: jmp foo # TAILCALL 779; CHECK-NEXT: .LBB20_1: # %if.end 780; CHECK-NEXT: retq 781; 782; NDD-LABEL: ctest64mi32_zf: 783; NDD: # %bb.0: # %entry 784; NDD-NEXT: testq %rdi, %rdi 785; NDD-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240 786; NDD-NEXT: jne .LBB20_1 787; NDD-NEXT: # %bb.2: # %if.then 788; NDD-NEXT: xorl %eax, %eax 789; NDD-NEXT: jmp foo # TAILCALL 790; NDD-NEXT: .LBB20_1: # %if.end 791; NDD-NEXT: retq 792entry: 793 %b = load i64, ptr %ptr 794 %cmp = icmp eq i64 %a, 0 795 %and = and i64 %b, 123456 796 %cmp1 = icmp eq i64 %and, 0 797 %or.cond = or i1 %cmp, %cmp1 798 br i1 %or.cond, label %if.then, label %if.end 799 800if.then: ; preds = %entry 801 tail call void (...) @foo() 802 br label %if.end 803 804if.end: ; preds = %entry, %if.then 805 ret void 806} 807 808define void @ctest_continous(i32 noundef %a, i32 noundef %b, i32 noundef %c) { 809; CHECK-LABEL: ctest_continous: 810; CHECK: # %bb.0: # %entry 811; CHECK-NEXT: cmpl %esi, %edi 812; CHECK-NEXT: ctestll {dfv=} %esi, %esi 813; CHECK-NEXT: ctestnsl {dfv=sf} %edx, %edx 814; CHECK-NEXT: jns .LBB21_1 815; CHECK-NEXT: # %bb.2: # %if.then 816; CHECK-NEXT: xorl %eax, %eax 817; CHECK-NEXT: jmp foo # TAILCALL 818; CHECK-NEXT: .LBB21_1: # %if.end 819; CHECK-NEXT: retq 820; 821; NDD-LABEL: ctest_continous: 822; NDD: # %bb.0: # %entry 823; NDD-NEXT: cmpl %esi, %edi 824; NDD-NEXT: ctestll {dfv=} %esi, %esi 825; NDD-NEXT: ctestnsl {dfv=sf} %edx, %edx 826; NDD-NEXT: jns .LBB21_1 827; NDD-NEXT: # %bb.2: # %if.then 828; NDD-NEXT: xorl %eax, %eax 829; NDD-NEXT: jmp foo # TAILCALL 830; NDD-NEXT: .LBB21_1: # %if.end 831; NDD-NEXT: retq 832entry: 833 %cmp = icmp slt i32 %a, %b 834 %cmp1 = icmp slt i32 %b, 0 835 %or.cond = and i1 %cmp, %cmp1 836 %cmp2 = icmp slt i32 %c, 0 837 %or.cond3 = or i1 %or.cond, %cmp2 838 br i1 %or.cond3, label %if.then, label %if.end 839 840if.then: ; preds = %entry 841 tail call void (...) @foo() 842 br label %if.end 843 844if.end: ; preds = %if.then, %entry 845 ret void 846} 847 848define i32 @ctest_nobranch(i32 noundef %a, i32 noundef %b) { 849; CHECK-LABEL: ctest_nobranch: 850; CHECK: # %bb.0: # %entry 851; CHECK-NEXT: testl %edi, %edi 852; CHECK-NEXT: ctestlel {dfv=} %esi, %esi 853; CHECK-NEXT: setg %al 854; CHECK-NEXT: movzbl %al, %eax 855; CHECK-NEXT: retq 856; 857; NDD-LABEL: ctest_nobranch: 858; NDD: # %bb.0: # %entry 859; NDD-NEXT: testl %edi, %edi 860; NDD-NEXT: ctestlel {dfv=} %esi, %esi 861; NDD-NEXT: setg %al 862; NDD-NEXT: movzbl %al, %eax 863; NDD-NEXT: retq 864entry: 865 %cmp = icmp sgt i32 %a, 0 866 %cmp1 = icmp sgt i32 %b, 0 867 %or.cond.not = or i1 %cmp, %cmp1 868 %. = zext i1 %or.cond.not to i32 869 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: # %entry 875; CHECK-NEXT: testl %edi, %edi 876; CHECK-NEXT: ctestlel {dfv=sf} %esi, %esi 877; CHECK-NEXT: ctestsl {dfv=zf} %edx, %edx 878; CHECK-NEXT: setg %al 879; CHECK-NEXT: movzbl %al, %eax 880; CHECK-NEXT: retq 881; 882; NDD-LABEL: ctest_continous_nobranch: 883; NDD: # %bb.0: # %entry 884; NDD-NEXT: testl %edi, %edi 885; NDD-NEXT: ctestlel {dfv=sf} %esi, %esi 886; NDD-NEXT: ctestsl {dfv=zf} %edx, %edx 887; NDD-NEXT: setg %al 888; NDD-NEXT: movzbl %al, %eax 889; NDD-NEXT: retq 890entry: 891 %cmp = icmp sgt i32 %a, 0 892 %cmp1 = icmp slt i32 %b, 0 893 %cmp2 = icmp sgt i32 %c, 0 894 %or1 = or i1 %cmp, %cmp1 895 %or2 = and i1 %or1, %cmp2 896 %. = zext i1 %or2 to i32 897 ret i32 %. 898} 899 900define void @ctest64ri64(i64 noundef %a, i64 noundef %b) { 901; CHECK-LABEL: ctest64ri64: 902; CHECK: # %bb.0: # %entry 903; CHECK-NEXT: testq %rdi, %rdi 904; CHECK-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF 905; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rsi 906; CHECK-NEXT: jne .LBB24_1 907; CHECK-NEXT: # %bb.2: # %if.then 908; CHECK-NEXT: xorl %eax, %eax 909; CHECK-NEXT: jmp foo # TAILCALL 910; CHECK-NEXT: .LBB24_1: # %if.end 911; CHECK-NEXT: retq 912; 913; NDD-LABEL: ctest64ri64: 914; NDD: # %bb.0: # %entry 915; NDD-NEXT: testq %rdi, %rdi 916; NDD-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF 917; NDD-NEXT: ctestneq {dfv=zf} %rax, %rsi 918; NDD-NEXT: jne .LBB24_1 919; NDD-NEXT: # %bb.2: # %if.then 920; NDD-NEXT: xorl %eax, %eax 921; NDD-NEXT: jmp foo # TAILCALL 922; NDD-NEXT: .LBB24_1: # %if.end 923; NDD-NEXT: retq 924entry: 925 %cmp = icmp eq i64 %a, 0 926 %and = and i64 %b, 9992147483647 927 %cmp1 = icmp eq i64 %and, 0 928 %or.cond = or i1 %cmp, %cmp1 929 br i1 %or.cond, label %if.then, label %if.end 930 931if.then: ; preds = %entry 932 tail call void (...) @foo() 933 br label %if.end 934 935if.end: ; preds = %entry, %if.then 936 ret void 937} 938 939declare dso_local void @foo(...) 940