1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=generic | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC 3; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM 4 5; PR5757 6%0 = type { i64, i32 } 7 8define i32 @test1(%0* %p, %0* %q, i1 %r) nounwind { 9; CHECK-LABEL: test1: 10; CHECK: ## BB#0: 11; CHECK-NEXT: addq $8, %rdi 12; CHECK-NEXT: addq $8, %rsi 13; CHECK-NEXT: testb $1, %dl 14; CHECK-NEXT: cmovneq %rdi, %rsi 15; CHECK-NEXT: movl (%rsi), %eax 16; CHECK-NEXT: retq 17 %t0 = load %0, %0* %p 18 %t1 = load %0, %0* %q 19 %t4 = select i1 %r, %0 %t0, %0 %t1 20 %t5 = extractvalue %0 %t4, 1 21 ret i32 %t5 22} 23 24; PR2139 25define i32 @test2() nounwind { 26; CHECK-LABEL: test2: 27; CHECK: ## BB#0: ## %entry 28; CHECK-NEXT: pushq %rax 29; CHECK-NEXT: callq _return_false 30; CHECK-NEXT: xorl %ecx, %ecx 31; CHECK-NEXT: testb $1, %al 32; CHECK-NEXT: movw $-480, %ax ## imm = 0xFE20 33; CHECK-NEXT: cmovnew %cx, %ax 34; CHECK-NEXT: cwtl 35; CHECK-NEXT: shll $3, %eax 36; CHECK-NEXT: cmpl $32768, %eax ## imm = 0x8000 37; CHECK-NEXT: jge LBB1_1 38; CHECK-NEXT: ## BB#2: ## %bb91 39; CHECK-NEXT: xorl %eax, %eax 40; CHECK-NEXT: popq %rcx 41; CHECK-NEXT: retq 42; CHECK-NEXT: LBB1_1: ## %bb90 43entry: 44 %tmp73 = tail call i1 @return_false() 45 %g.0 = select i1 %tmp73, i16 0, i16 -480 46 %tmp7778 = sext i16 %g.0 to i32 47 %tmp80 = shl i32 %tmp7778, 3 48 %tmp87 = icmp sgt i32 %tmp80, 32767 49 br i1 %tmp87, label %bb90, label %bb91 50bb90: 51 unreachable 52bb91: 53 ret i32 0 54} 55 56declare i1 @return_false() 57 58;; Select between two floating point constants. 59define float @test3(i32 %x) nounwind readnone { 60; CHECK-LABEL: test3: 61; CHECK: ## BB#0: ## %entry 62; CHECK-NEXT: xorl %eax, %eax 63; CHECK-NEXT: testl %edi, %edi 64; CHECK-NEXT: sete %al 65; CHECK-NEXT: leaq {{.*}}(%rip), %rcx 66; CHECK-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 67; CHECK-NEXT: retq 68entry: 69 %0 = icmp eq i32 %x, 0 70 %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01 71 ret float %iftmp.0.0 72} 73 74define signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly { 75; CHECK-LABEL: test4: 76; CHECK: ## BB#0: ## %entry 77; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 78; CHECK-NEXT: xorl %eax, %eax 79; CHECK-NEXT: ucomisd %xmm0, %xmm1 80; CHECK-NEXT: seta %al 81; CHECK-NEXT: movsbl (%rdi,%rax,4), %eax 82; CHECK-NEXT: retq 83entry: 84 %0 = fcmp olt double %F, 4.200000e+01 85 %iftmp.0.0 = select i1 %0, i32 4, i32 0 86 %1 = getelementptr i8, i8* %P, i32 %iftmp.0.0 87 %2 = load i8, i8* %1, align 1 88 ret i8 %2 89} 90 91define void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind { 92; CHECK-LABEL: test5: 93; CHECK: ## BB#0: 94; CHECK-NEXT: testb $1, %dil 95; CHECK-NEXT: jne LBB4_2 96; CHECK-NEXT: ## BB#1: 97; CHECK-NEXT: movdqa %xmm1, %xmm0 98; CHECK-NEXT: LBB4_2: 99; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 100; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 101; CHECK-NEXT: movd %xmm0, (%rsi) 102; CHECK-NEXT: retq 103 %x = select i1 %c, <2 x i16> %a, <2 x i16> %b 104 store <2 x i16> %x, <2 x i16>* %p 105 ret void 106} 107 108; Verify that the fmul gets sunk into the one part of the diamond where it is needed. 109define void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind { 110; CHECK-LABEL: test6: 111; CHECK: ## BB#0: 112; CHECK-NEXT: testl %edi, %edi 113; CHECK-NEXT: je LBB5_1 114; CHECK-NEXT: ## BB#2: 115; CHECK-NEXT: movaps (%rsi), %xmm0 116; CHECK-NEXT: movaps %xmm0, (%rsi) 117; CHECK-NEXT: retq 118; CHECK-NEXT: LBB5_1: 119; CHECK-NEXT: movaps (%rdx), %xmm0 120; CHECK-NEXT: mulps %xmm0, %xmm0 121; CHECK-NEXT: movaps %xmm0, (%rsi) 122; CHECK-NEXT: retq 123 %tmp = load <4 x float>, <4 x float>* %A 124 %tmp3 = load <4 x float>, <4 x float>* %B 125 %tmp9 = fmul <4 x float> %tmp3, %tmp3 126 %tmp.upgrd.1 = icmp eq i32 %C, 0 127 %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp 128 store <4 x float> %iftmp.38.0, <4 x float>* %A 129 ret void 130} 131 132; Select with fp80's 133define x86_fp80 @test7(i32 %tmp8) nounwind { 134; CHECK-LABEL: test7: 135; CHECK: ## BB#0: 136; CHECK-NEXT: xorl %eax, %eax 137; CHECK-NEXT: testl %edi, %edi 138; CHECK-NEXT: setns %al 139; CHECK-NEXT: shlq $4, %rax 140; CHECK-NEXT: leaq {{.*}}(%rip), %rcx 141; CHECK-NEXT: fldt (%rax,%rcx) 142; CHECK-NEXT: retq 143 %tmp9 = icmp sgt i32 %tmp8, -1 144 %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000 145 ret x86_fp80 %retval 146} 147 148; widening select v6i32 and then a sub 149define void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind { 150; GENERIC-LABEL: test8: 151; GENERIC: ## BB#0: 152; GENERIC-NEXT: andb $1, %dil 153; GENERIC-NEXT: jne LBB7_1 154; GENERIC-NEXT: ## BB#2: 155; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 156; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 157; GENERIC-NEXT: jmp LBB7_3 158; GENERIC-NEXT: LBB7_1: 159; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 160; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 161; GENERIC-NEXT: LBB7_3: 162; GENERIC-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 163; GENERIC-NEXT: testb %dil, %dil 164; GENERIC-NEXT: jne LBB7_4 165; GENERIC-NEXT: ## BB#5: 166; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 167; GENERIC-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 168; GENERIC-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero 169; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 170; GENERIC-NEXT: jmp LBB7_6 171; GENERIC-NEXT: LBB7_4: 172; GENERIC-NEXT: movd %r9d, %xmm2 173; GENERIC-NEXT: movd %ecx, %xmm3 174; GENERIC-NEXT: movd %r8d, %xmm4 175; GENERIC-NEXT: movd %edx, %xmm1 176; GENERIC-NEXT: LBB7_6: 177; GENERIC-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 178; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 179; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 180; GENERIC-NEXT: psubd {{.*}}(%rip), %xmm1 181; GENERIC-NEXT: psubd {{.*}}(%rip), %xmm0 182; GENERIC-NEXT: movq %xmm0, 16(%rsi) 183; GENERIC-NEXT: movdqa %xmm1, (%rsi) 184; GENERIC-NEXT: retq 185; 186; ATOM-LABEL: test8: 187; ATOM: ## BB#0: 188; ATOM-NEXT: andb $1, %dil 189; ATOM-NEXT: jne LBB7_1 190; ATOM-NEXT: ## BB#2: 191; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 192; ATOM-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 193; ATOM-NEXT: jmp LBB7_3 194; ATOM-NEXT: LBB7_1: 195; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 196; ATOM-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 197; ATOM-NEXT: LBB7_3: 198; ATOM-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 199; ATOM-NEXT: testb %dil, %dil 200; ATOM-NEXT: jne LBB7_4 201; ATOM-NEXT: ## BB#5: 202; ATOM-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 203; ATOM-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 204; ATOM-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero 205; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 206; ATOM-NEXT: jmp LBB7_6 207; ATOM-NEXT: LBB7_4: 208; ATOM-NEXT: movd %r9d, %xmm2 209; ATOM-NEXT: movd %ecx, %xmm3 210; ATOM-NEXT: movd %r8d, %xmm4 211; ATOM-NEXT: movd %edx, %xmm1 212; ATOM-NEXT: LBB7_6: 213; ATOM-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 214; ATOM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 215; ATOM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 216; ATOM-NEXT: psubd {{.*}}(%rip), %xmm0 217; ATOM-NEXT: psubd {{.*}}(%rip), %xmm1 218; ATOM-NEXT: movq %xmm0, 16(%rsi) 219; ATOM-NEXT: movdqa %xmm1, (%rsi) 220; ATOM-NEXT: retq 221 %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2 222 %val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 223 store <6 x i32> %val, <6 x i32>* %dst.addr 224 ret void 225} 226 227 228;; Test integer select between values and constants. 229 230define i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone { 231; GENERIC-LABEL: test9: 232; GENERIC: ## BB#0: 233; GENERIC-NEXT: cmpq $1, %rdi 234; GENERIC-NEXT: sbbq %rax, %rax 235; GENERIC-NEXT: orq %rsi, %rax 236; GENERIC-NEXT: retq 237; 238; ATOM-LABEL: test9: 239; ATOM: ## BB#0: 240; ATOM-NEXT: cmpq $1, %rdi 241; ATOM-NEXT: sbbq %rax, %rax 242; ATOM-NEXT: orq %rsi, %rax 243; ATOM-NEXT: nop 244; ATOM-NEXT: nop 245; ATOM-NEXT: retq 246 %cmp = icmp ne i64 %x, 0 247 %cond = select i1 %cmp, i64 %y, i64 -1 248 ret i64 %cond 249} 250 251;; Same as test9 252define i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 253; GENERIC-LABEL: test9a: 254; GENERIC: ## BB#0: 255; GENERIC-NEXT: cmpq $1, %rdi 256; GENERIC-NEXT: sbbq %rax, %rax 257; GENERIC-NEXT: orq %rsi, %rax 258; GENERIC-NEXT: retq 259; 260; ATOM-LABEL: test9a: 261; ATOM: ## BB#0: 262; ATOM-NEXT: cmpq $1, %rdi 263; ATOM-NEXT: sbbq %rax, %rax 264; ATOM-NEXT: orq %rsi, %rax 265; ATOM-NEXT: nop 266; ATOM-NEXT: nop 267; ATOM-NEXT: retq 268 %cmp = icmp eq i64 %x, 0 269 %cond = select i1 %cmp, i64 -1, i64 %y 270 ret i64 %cond 271} 272 273define i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone { 274; GENERIC-LABEL: test9b: 275; GENERIC: ## BB#0: 276; GENERIC-NEXT: cmpq $1, %rdi 277; GENERIC-NEXT: sbbq %rax, %rax 278; GENERIC-NEXT: orq %rsi, %rax 279; GENERIC-NEXT: retq 280; 281; ATOM-LABEL: test9b: 282; ATOM: ## BB#0: 283; ATOM-NEXT: cmpq $1, %rdi 284; ATOM-NEXT: sbbq %rax, %rax 285; ATOM-NEXT: orq %rsi, %rax 286; ATOM-NEXT: nop 287; ATOM-NEXT: nop 288; ATOM-NEXT: retq 289 %cmp = icmp eq i64 %x, 0 290 %A = sext i1 %cmp to i64 291 %cond = or i64 %y, %A 292 ret i64 %cond 293} 294 295;; Select between -1 and 1. 296define i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone { 297; GENERIC-LABEL: test10: 298; GENERIC: ## BB#0: 299; GENERIC-NEXT: cmpq $1, %rdi 300; GENERIC-NEXT: sbbq %rax, %rax 301; GENERIC-NEXT: orq $1, %rax 302; GENERIC-NEXT: retq 303; 304; ATOM-LABEL: test10: 305; ATOM: ## BB#0: 306; ATOM-NEXT: cmpq $1, %rdi 307; ATOM-NEXT: sbbq %rax, %rax 308; ATOM-NEXT: orq $1, %rax 309; ATOM-NEXT: nop 310; ATOM-NEXT: nop 311; ATOM-NEXT: retq 312 %cmp = icmp eq i64 %x, 0 313 %cond = select i1 %cmp, i64 -1, i64 1 314 ret i64 %cond 315} 316 317define i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone { 318; CHECK-LABEL: test11: 319; CHECK: ## BB#0: 320; CHECK-NEXT: cmpq $1, %rdi 321; CHECK-NEXT: sbbq %rax, %rax 322; CHECK-NEXT: notq %rax 323; CHECK-NEXT: orq %rsi, %rax 324; CHECK-NEXT: retq 325 %cmp = icmp eq i64 %x, 0 326 %cond = select i1 %cmp, i64 %y, i64 -1 327 ret i64 %cond 328} 329 330define i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 331; CHECK-LABEL: test11a: 332; CHECK: ## BB#0: 333; CHECK-NEXT: cmpq $1, %rdi 334; CHECK-NEXT: sbbq %rax, %rax 335; CHECK-NEXT: notq %rax 336; CHECK-NEXT: orq %rsi, %rax 337; CHECK-NEXT: retq 338 %cmp = icmp ne i64 %x, 0 339 %cond = select i1 %cmp, i64 -1, i64 %y 340 ret i64 %cond 341} 342 343 344declare noalias i8* @_Znam(i64) noredzone 345 346define noalias i8* @test12(i64 %count) nounwind ssp noredzone { 347; GENERIC-LABEL: test12: 348; GENERIC: ## BB#0: ## %entry 349; GENERIC-NEXT: movl $4, %ecx 350; GENERIC-NEXT: movq %rdi, %rax 351; GENERIC-NEXT: mulq %rcx 352; GENERIC-NEXT: movq $-1, %rdi 353; GENERIC-NEXT: cmovnoq %rax, %rdi 354; GENERIC-NEXT: jmp __Znam ## TAILCALL 355; 356; ATOM-LABEL: test12: 357; ATOM: ## BB#0: ## %entry 358; ATOM-NEXT: movq %rdi, %rax 359; ATOM-NEXT: movl $4, %ecx 360; ATOM-NEXT: mulq %rcx 361; ATOM-NEXT: movq $-1, %rdi 362; ATOM-NEXT: cmovnoq %rax, %rdi 363; ATOM-NEXT: jmp __Znam ## TAILCALL 364entry: 365 %A = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %count, i64 4) 366 %B = extractvalue { i64, i1 } %A, 1 367 %C = extractvalue { i64, i1 } %A, 0 368 %D = select i1 %B, i64 -1, i64 %C 369 %call = tail call noalias i8* @_Znam(i64 %D) nounwind noredzone 370 ret i8* %call 371} 372 373declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone 374 375define i32 @test13(i32 %a, i32 %b) nounwind { 376; GENERIC-LABEL: test13: 377; GENERIC: ## BB#0: 378; GENERIC-NEXT: cmpl %esi, %edi 379; GENERIC-NEXT: sbbl %eax, %eax 380; GENERIC-NEXT: retq 381; 382; ATOM-LABEL: test13: 383; ATOM: ## BB#0: 384; ATOM-NEXT: cmpl %esi, %edi 385; ATOM-NEXT: sbbl %eax, %eax 386; ATOM-NEXT: nop 387; ATOM-NEXT: nop 388; ATOM-NEXT: nop 389; ATOM-NEXT: nop 390; ATOM-NEXT: retq 391 %c = icmp ult i32 %a, %b 392 %d = sext i1 %c to i32 393 ret i32 %d 394} 395 396define i32 @test14(i32 %a, i32 %b) nounwind { 397; GENERIC-LABEL: test14: 398; GENERIC: ## BB#0: 399; GENERIC-NEXT: cmpl %esi, %edi 400; GENERIC-NEXT: sbbl %eax, %eax 401; GENERIC-NEXT: notl %eax 402; GENERIC-NEXT: retq 403; 404; ATOM-LABEL: test14: 405; ATOM: ## BB#0: 406; ATOM-NEXT: cmpl %esi, %edi 407; ATOM-NEXT: sbbl %eax, %eax 408; ATOM-NEXT: notl %eax 409; ATOM-NEXT: nop 410; ATOM-NEXT: nop 411; ATOM-NEXT: retq 412 %c = icmp uge i32 %a, %b 413 %d = sext i1 %c to i32 414 ret i32 %d 415} 416 417; rdar://10961709 418define i32 @test15(i32 %x) nounwind { 419; GENERIC-LABEL: test15: 420; GENERIC: ## BB#0: ## %entry 421; GENERIC-NEXT: negl %edi 422; GENERIC-NEXT: sbbl %eax, %eax 423; GENERIC-NEXT: retq 424; 425; ATOM-LABEL: test15: 426; ATOM: ## BB#0: ## %entry 427; ATOM-NEXT: negl %edi 428; ATOM-NEXT: sbbl %eax, %eax 429; ATOM-NEXT: nop 430; ATOM-NEXT: nop 431; ATOM-NEXT: nop 432; ATOM-NEXT: nop 433; ATOM-NEXT: retq 434entry: 435 %cmp = icmp ne i32 %x, 0 436 %sub = sext i1 %cmp to i32 437 ret i32 %sub 438} 439 440define i64 @test16(i64 %x) nounwind uwtable readnone ssp { 441; GENERIC-LABEL: test16: 442; GENERIC: ## BB#0: ## %entry 443; GENERIC-NEXT: negq %rdi 444; GENERIC-NEXT: sbbq %rax, %rax 445; GENERIC-NEXT: retq 446; 447; ATOM-LABEL: test16: 448; ATOM: ## BB#0: ## %entry 449; ATOM-NEXT: negq %rdi 450; ATOM-NEXT: sbbq %rax, %rax 451; ATOM-NEXT: nop 452; ATOM-NEXT: nop 453; ATOM-NEXT: nop 454; ATOM-NEXT: nop 455; ATOM-NEXT: retq 456entry: 457 %cmp = icmp ne i64 %x, 0 458 %conv1 = sext i1 %cmp to i64 459 ret i64 %conv1 460} 461 462define i16 @test17(i16 %x) nounwind { 463; GENERIC-LABEL: test17: 464; GENERIC: ## BB#0: ## %entry 465; GENERIC-NEXT: negw %di 466; GENERIC-NEXT: sbbw %ax, %ax 467; GENERIC-NEXT: retq 468; 469; ATOM-LABEL: test17: 470; ATOM: ## BB#0: ## %entry 471; ATOM-NEXT: negw %di 472; ATOM-NEXT: sbbw %ax, %ax 473; ATOM-NEXT: nop 474; ATOM-NEXT: nop 475; ATOM-NEXT: nop 476; ATOM-NEXT: nop 477; ATOM-NEXT: retq 478entry: 479 %cmp = icmp ne i16 %x, 0 480 %sub = sext i1 %cmp to i16 481 ret i16 %sub 482} 483 484define i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind { 485; GENERIC-LABEL: test18: 486; GENERIC: ## BB#0: 487; GENERIC-NEXT: cmpl $15, %edi 488; GENERIC-NEXT: cmovgel %edx, %esi 489; GENERIC-NEXT: movl %esi, %eax 490; GENERIC-NEXT: retq 491; 492; ATOM-LABEL: test18: 493; ATOM: ## BB#0: 494; ATOM-NEXT: cmpl $15, %edi 495; ATOM-NEXT: cmovgel %edx, %esi 496; ATOM-NEXT: movl %esi, %eax 497; ATOM-NEXT: nop 498; ATOM-NEXT: nop 499; ATOM-NEXT: retq 500 %cmp = icmp slt i32 %x, 15 501 %sel = select i1 %cmp, i8 %a, i8 %b 502 ret i8 %sel 503} 504 505define i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) { 506; CHECK-LABEL: trunc_select_miscompile: 507; CHECK: ## BB#0: 508; CHECK-NEXT: orb $2, %sil 509; CHECK-NEXT: movl %esi, %ecx 510; CHECK-NEXT: shll %cl, %edi 511; CHECK-NEXT: movl %edi, %eax 512; CHECK-NEXT: retq 513 %tmp1 = select i1 %cc, i32 3, i32 2 514 %tmp2 = shl i32 %a, %tmp1 515 ret i32 %tmp2 516} 517 518; reproducer for pr29002 519define void @clamp_i8(i32 %src, i8* %dst) { 520; GENERIC-LABEL: clamp_i8: 521; GENERIC: ## BB#0: 522; GENERIC-NEXT: cmpl $127, %edi 523; GENERIC-NEXT: movl $127, %eax 524; GENERIC-NEXT: cmovlel %edi, %eax 525; GENERIC-NEXT: cmpl $-128, %eax 526; GENERIC-NEXT: movb $-128, %cl 527; GENERIC-NEXT: jl LBB22_2 528; GENERIC-NEXT: ## BB#1: 529; GENERIC-NEXT: movl %eax, %ecx 530; GENERIC-NEXT: LBB22_2: 531; GENERIC-NEXT: movb %cl, (%rsi) 532; GENERIC-NEXT: retq 533; 534; ATOM-LABEL: clamp_i8: 535; ATOM: ## BB#0: 536; ATOM-NEXT: cmpl $127, %edi 537; ATOM-NEXT: movl $127, %eax 538; ATOM-NEXT: cmovlel %edi, %eax 539; ATOM-NEXT: movb $-128, %cl 540; ATOM-NEXT: cmpl $-128, %eax 541; ATOM-NEXT: jl LBB22_2 542; ATOM-NEXT: ## BB#1: 543; ATOM-NEXT: movl %eax, %ecx 544; ATOM-NEXT: LBB22_2: 545; ATOM-NEXT: movb %cl, (%rsi) 546; ATOM-NEXT: retq 547 %cmp = icmp sgt i32 %src, 127 548 %sel1 = select i1 %cmp, i32 127, i32 %src 549 %cmp1 = icmp slt i32 %sel1, -128 550 %sel2 = select i1 %cmp1, i32 -128, i32 %sel1 551 %conv = trunc i32 %sel2 to i8 552 store i8 %conv, i8* %dst, align 2 553 ret void 554} 555 556; reproducer for pr29002 557define void @clamp(i32 %src, i16* %dst) { 558; GENERIC-LABEL: clamp: 559; GENERIC: ## BB#0: 560; GENERIC-NEXT: cmpl $32767, %edi ## imm = 0x7FFF 561; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF 562; GENERIC-NEXT: cmovlel %edi, %eax 563; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x8000 564; GENERIC-NEXT: movw $-32768, %cx ## imm = 0x8000 565; GENERIC-NEXT: cmovgew %ax, %cx 566; GENERIC-NEXT: movw %cx, (%rsi) 567; GENERIC-NEXT: retq 568; 569; ATOM-LABEL: clamp: 570; ATOM: ## BB#0: 571; ATOM-NEXT: cmpl $32767, %edi ## imm = 0x7FFF 572; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF 573; ATOM-NEXT: cmovlel %edi, %eax 574; ATOM-NEXT: movw $-32768, %cx ## imm = 0x8000 575; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x8000 576; ATOM-NEXT: cmovgew %ax, %cx 577; ATOM-NEXT: movw %cx, (%rsi) 578; ATOM-NEXT: retq 579 %cmp = icmp sgt i32 %src, 32767 580 %sel1 = select i1 %cmp, i32 32767, i32 %src 581 %cmp1 = icmp slt i32 %sel1, -32768 582 %sel2 = select i1 %cmp1, i32 -32768, i32 %sel1 583 %conv = trunc i32 %sel2 to i16 584 store i16 %conv, i16* %dst, align 2 585 ret void 586} 587 588define void @test19() { 589; This is a massive reduction of an llvm-stress test case that generates 590; interesting chains feeding setcc and eventually a f32 select operation. This 591; is intended to exercise the SELECT formation in the DAG combine simplifying 592; a simplified select_cc node. If it it regresses and is no longer triggering 593; that code path, it can be deleted. 594; 595; CHECK-LABEL: test19: 596; CHECK: ## BB#0: ## %BB 597; CHECK-NEXT: movl $-1, %eax 598; CHECK-NEXT: movb $1, %cl 599; CHECK-NEXT: .p2align 4, 0x90 600; CHECK-NEXT: LBB24_1: ## %CF 601; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1 602; CHECK-NEXT: testb %cl, %cl 603; CHECK-NEXT: jne LBB24_1 604; CHECK-NEXT: ## BB#2: ## %CF250 605; CHECK-NEXT: ## in Loop: Header=BB24_1 Depth=1 606; CHECK-NEXT: jne LBB24_1 607; CHECK-NEXT: .p2align 4, 0x90 608; CHECK-NEXT: LBB24_3: ## %CF242 609; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1 610; CHECK-NEXT: cmpl %eax, %eax 611; CHECK-NEXT: ucomiss %xmm0, %xmm0 612; CHECK-NEXT: jp LBB24_3 613; CHECK-NEXT: ## BB#4: ## %CF244 614; CHECK-NEXT: retq 615BB: 616 br label %CF 617 618CF: 619 %Cmp10 = icmp ule i8 undef, undef 620 br i1 %Cmp10, label %CF, label %CF250 621 622CF250: 623 %E12 = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i32 2 624 %Cmp32 = icmp ugt i1 %Cmp10, false 625 br i1 %Cmp32, label %CF, label %CF242 626 627CF242: 628 %Cmp38 = icmp uge i32 %E12, undef 629 %FC = uitofp i1 %Cmp38 to float 630 %Sl59 = select i1 %Cmp32, float %FC, float undef 631 %Cmp60 = fcmp ugt float undef, undef 632 br i1 %Cmp60, label %CF242, label %CF244 633 634CF244: 635 %B122 = fadd float %Sl59, undef 636 ret void 637} 638