1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | 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; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=athlon | FileCheck %s --check-prefix=ATHLON 5; RUN: llc < %s -mtriple=i386-intel-elfiamcu | FileCheck %s --check-prefix=MCU 6 7; PR5757 8%0 = type { i64, i32 } 9 10define i32 @test1(%0* %p, %0* %q, i1 %r) nounwind { 11; GENERIC-LABEL: test1: 12; GENERIC: ## %bb.0: 13; GENERIC-NEXT: testb $1, %dl 14; GENERIC-NEXT: cmoveq %rsi, %rdi 15; GENERIC-NEXT: movl 8(%rdi), %eax 16; GENERIC-NEXT: retq 17; 18; ATOM-LABEL: test1: 19; ATOM: ## %bb.0: 20; ATOM-NEXT: testb $1, %dl 21; ATOM-NEXT: cmoveq %rsi, %rdi 22; ATOM-NEXT: movl 8(%rdi), %eax 23; ATOM-NEXT: nop 24; ATOM-NEXT: nop 25; ATOM-NEXT: retq 26; 27; ATHLON-LABEL: test1: 28; ATHLON: ## %bb.0: 29; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 30; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax 31; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 32; ATHLON-NEXT: cmovnel %eax, %ecx 33; ATHLON-NEXT: movl (%ecx), %eax 34; ATHLON-NEXT: movl 8(%eax), %eax 35; ATHLON-NEXT: retl 36; 37; MCU-LABEL: test1: 38; MCU: # %bb.0: 39; MCU-NEXT: testb $1, %cl 40; MCU-NEXT: jne .LBB0_2 41; MCU-NEXT: # %bb.1: 42; MCU-NEXT: movl %edx, %eax 43; MCU-NEXT: .LBB0_2: 44; MCU-NEXT: movl 8(%eax), %eax 45; MCU-NEXT: retl 46 %t0 = load %0, %0* %p 47 %t1 = load %0, %0* %q 48 %t4 = select i1 %r, %0 %t0, %0 %t1 49 %t5 = extractvalue %0 %t4, 1 50 ret i32 %t5 51} 52 53; PR2139 54define i32 @test2() nounwind { 55; GENERIC-LABEL: test2: 56; GENERIC: ## %bb.0: ## %entry 57; GENERIC-NEXT: pushq %rax 58; GENERIC-NEXT: callq _return_false 59; GENERIC-NEXT: xorl %ecx, %ecx 60; GENERIC-NEXT: testb $1, %al 61; GENERIC-NEXT: movl $-3840, %eax ## imm = 0xF100 62; GENERIC-NEXT: cmovnel %ecx, %eax 63; GENERIC-NEXT: cmpl $32768, %eax ## imm = 0x8000 64; GENERIC-NEXT: jge LBB1_1 65; GENERIC-NEXT: ## %bb.2: ## %bb91 66; GENERIC-NEXT: xorl %eax, %eax 67; GENERIC-NEXT: popq %rcx 68; GENERIC-NEXT: retq 69; GENERIC-NEXT: LBB1_1: ## %bb90 70; GENERIC-NEXT: ud2 71; 72; ATOM-LABEL: test2: 73; ATOM: ## %bb.0: ## %entry 74; ATOM-NEXT: pushq %rax 75; ATOM-NEXT: callq _return_false 76; ATOM-NEXT: xorl %ecx, %ecx 77; ATOM-NEXT: movl $-3840, %edx ## imm = 0xF100 78; ATOM-NEXT: testb $1, %al 79; ATOM-NEXT: cmovnel %ecx, %edx 80; ATOM-NEXT: cmpl $32768, %edx ## imm = 0x8000 81; ATOM-NEXT: jge LBB1_1 82; ATOM-NEXT: ## %bb.2: ## %bb91 83; ATOM-NEXT: xorl %eax, %eax 84; ATOM-NEXT: popq %rcx 85; ATOM-NEXT: retq 86; ATOM-NEXT: LBB1_1: ## %bb90 87; ATOM-NEXT: ud2 88; 89; ATHLON-LABEL: test2: 90; ATHLON: ## %bb.0: ## %entry 91; ATHLON-NEXT: subl $12, %esp 92; ATHLON-NEXT: calll _return_false 93; ATHLON-NEXT: xorl %ecx, %ecx 94; ATHLON-NEXT: testb $1, %al 95; ATHLON-NEXT: movl $-3840, %eax ## imm = 0xF100 96; ATHLON-NEXT: cmovnel %ecx, %eax 97; ATHLON-NEXT: cmpl $32768, %eax ## imm = 0x8000 98; ATHLON-NEXT: jge LBB1_1 99; ATHLON-NEXT: ## %bb.2: ## %bb91 100; ATHLON-NEXT: xorl %eax, %eax 101; ATHLON-NEXT: addl $12, %esp 102; ATHLON-NEXT: retl 103; ATHLON-NEXT: LBB1_1: ## %bb90 104; ATHLON-NEXT: ud2 105; 106; MCU-LABEL: test2: 107; MCU: # %bb.0: # %entry 108; MCU-NEXT: calll return_false@PLT 109; MCU-NEXT: xorl %ecx, %ecx 110; MCU-NEXT: testb $1, %al 111; MCU-NEXT: jne .LBB1_2 112; MCU-NEXT: # %bb.1: # %entry 113; MCU-NEXT: movl $-3840, %ecx # imm = 0xF100 114; MCU-NEXT: .LBB1_2: # %entry 115; MCU-NEXT: cmpl $32768, %ecx # imm = 0x8000 116; MCU-NEXT: jge .LBB1_3 117; MCU-NEXT: # %bb.4: # %bb91 118; MCU-NEXT: xorl %eax, %eax 119; MCU-NEXT: retl 120; MCU-NEXT: .LBB1_3: # %bb90 121entry: 122 %tmp73 = tail call i1 @return_false() 123 %g.0 = select i1 %tmp73, i16 0, i16 -480 124 %tmp7778 = sext i16 %g.0 to i32 125 %tmp80 = shl i32 %tmp7778, 3 126 %tmp87 = icmp sgt i32 %tmp80, 32767 127 br i1 %tmp87, label %bb90, label %bb91 128bb90: 129 unreachable 130bb91: 131 ret i32 0 132} 133 134declare i1 @return_false() 135 136;; Select between two floating point constants. 137define float @test3(i32 %x) nounwind readnone { 138; GENERIC-LABEL: test3: 139; GENERIC: ## %bb.0: ## %entry 140; GENERIC-NEXT: xorl %eax, %eax 141; GENERIC-NEXT: testl %edi, %edi 142; GENERIC-NEXT: sete %al 143; GENERIC-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx 144; GENERIC-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 145; GENERIC-NEXT: retq 146; 147; ATOM-LABEL: test3: 148; ATOM: ## %bb.0: ## %entry 149; ATOM-NEXT: xorl %eax, %eax 150; ATOM-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx 151; ATOM-NEXT: testl %edi, %edi 152; ATOM-NEXT: sete %al 153; ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 154; ATOM-NEXT: retq 155; 156; ATHLON-LABEL: test3: 157; ATHLON: ## %bb.0: ## %entry 158; ATHLON-NEXT: xorl %eax, %eax 159; ATHLON-NEXT: cmpl $0, {{[0-9]+}}(%esp) 160; ATHLON-NEXT: sete %al 161; ATHLON-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4) 162; ATHLON-NEXT: retl 163; 164; MCU-LABEL: test3: 165; MCU: # %bb.0: # %entry 166; MCU-NEXT: xorl %ecx, %ecx 167; MCU-NEXT: testl %eax, %eax 168; MCU-NEXT: sete %cl 169; MCU-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 170; MCU-NEXT: retl 171entry: 172 %0 = icmp eq i32 %x, 0 173 %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01 174 ret float %iftmp.0.0 175} 176 177define signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly { 178; CHECK-LABEL: test4: 179; CHECK: ## %bb.0: ## %entry 180; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 181; CHECK-NEXT: xorl %eax, %eax 182; CHECK-NEXT: ucomisd %xmm0, %xmm1 183; CHECK-NEXT: seta %al 184; CHECK-NEXT: movsbl (%rdi,%rax,4), %eax 185; CHECK-NEXT: retq 186; 187; ATHLON-LABEL: test4: 188; ATHLON: ## %bb.0: ## %entry 189; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 190; ATHLON-NEXT: fldl {{[0-9]+}}(%esp) 191; ATHLON-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 192; ATHLON-NEXT: xorl %ecx, %ecx 193; ATHLON-NEXT: fucompi %st(1), %st 194; ATHLON-NEXT: fstp %st(0) 195; ATHLON-NEXT: seta %cl 196; ATHLON-NEXT: movsbl (%eax,%ecx,4), %eax 197; ATHLON-NEXT: retl 198; 199; MCU-LABEL: test4: 200; MCU: # %bb.0: # %entry 201; MCU-NEXT: movl %eax, %ecx 202; MCU-NEXT: fldl {{[0-9]+}}(%esp) 203; MCU-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 204; MCU-NEXT: fucompp 205; MCU-NEXT: fnstsw %ax 206; MCU-NEXT: xorl %edx, %edx 207; MCU-NEXT: # kill: def $ah killed $ah killed $ax 208; MCU-NEXT: sahf 209; MCU-NEXT: seta %dl 210; MCU-NEXT: movb (%ecx,%edx,4), %al 211; MCU-NEXT: retl 212entry: 213 %0 = fcmp olt double %F, 4.200000e+01 214 %iftmp.0.0 = select i1 %0, i32 4, i32 0 215 %1 = getelementptr i8, i8* %P, i32 %iftmp.0.0 216 %2 = load i8, i8* %1, align 1 217 ret i8 %2 218} 219 220define void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind { 221; GENERIC-LABEL: test5: 222; GENERIC: ## %bb.0: 223; GENERIC-NEXT: testb $1, %dil 224; GENERIC-NEXT: jne LBB4_2 225; GENERIC-NEXT: ## %bb.1: 226; GENERIC-NEXT: movaps %xmm1, %xmm0 227; GENERIC-NEXT: LBB4_2: 228; GENERIC-NEXT: movss %xmm0, (%rsi) 229; GENERIC-NEXT: retq 230; 231; ATOM-LABEL: test5: 232; ATOM: ## %bb.0: 233; ATOM-NEXT: testb $1, %dil 234; ATOM-NEXT: jne LBB4_2 235; ATOM-NEXT: ## %bb.1: 236; ATOM-NEXT: movaps %xmm1, %xmm0 237; ATOM-NEXT: LBB4_2: 238; ATOM-NEXT: movss %xmm0, (%rsi) 239; ATOM-NEXT: nop 240; ATOM-NEXT: nop 241; ATOM-NEXT: retq 242; 243; ATHLON-LABEL: test5: 244; ATHLON: ## %bb.0: 245; ATHLON-NEXT: pushl %esi 246; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 247; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 248; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 249; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 250; ATHLON-NEXT: cmovnel %ecx, %edx 251; ATHLON-NEXT: movzwl (%edx), %ecx 252; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 253; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %esi 254; ATHLON-NEXT: cmovnel %edx, %esi 255; ATHLON-NEXT: movzwl (%esi), %edx 256; ATHLON-NEXT: movw %dx, 2(%eax) 257; ATHLON-NEXT: movw %cx, (%eax) 258; ATHLON-NEXT: popl %esi 259; ATHLON-NEXT: retl 260; 261; MCU-LABEL: test5: 262; MCU: # %bb.0: 263; MCU-NEXT: pushl %esi 264; MCU-NEXT: movl {{[0-9]+}}(%esp), %esi 265; MCU-NEXT: testb $1, %al 266; MCU-NEXT: jne .LBB4_2 267; MCU-NEXT: # %bb.1: 268; MCU-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 269; MCU-NEXT: movzwl {{[0-9]+}}(%esp), %edx 270; MCU-NEXT: .LBB4_2: 271; MCU-NEXT: movw %cx, 2(%esi) 272; MCU-NEXT: movw %dx, (%esi) 273; MCU-NEXT: popl %esi 274; MCU-NEXT: retl 275 %x = select i1 %c, <2 x i16> %a, <2 x i16> %b 276 store <2 x i16> %x, <2 x i16>* %p 277 ret void 278} 279 280; Verify that the fmul gets sunk into the one part of the diamond where it is needed. 281define void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind { 282; CHECK-LABEL: test6: 283; CHECK: ## %bb.0: 284; CHECK-NEXT: testl %edi, %edi 285; CHECK-NEXT: je LBB5_1 286; CHECK-NEXT: ## %bb.2: 287; CHECK-NEXT: movaps (%rsi), %xmm0 288; CHECK-NEXT: movaps %xmm0, (%rsi) 289; CHECK-NEXT: retq 290; CHECK-NEXT: LBB5_1: 291; CHECK-NEXT: movaps (%rdx), %xmm0 292; CHECK-NEXT: mulps %xmm0, %xmm0 293; CHECK-NEXT: movaps %xmm0, (%rsi) 294; CHECK-NEXT: retq 295; 296; ATHLON-LABEL: test6: 297; ATHLON: ## %bb.0: 298; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 299; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 300; ATHLON-NEXT: flds 12(%eax) 301; ATHLON-NEXT: flds 8(%eax) 302; ATHLON-NEXT: flds 4(%eax) 303; ATHLON-NEXT: flds (%eax) 304; ATHLON-NEXT: flds (%ecx) 305; ATHLON-NEXT: fmul %st, %st(0) 306; ATHLON-NEXT: cmpl $0, {{[0-9]+}}(%esp) 307; ATHLON-NEXT: fxch %st(1) 308; ATHLON-NEXT: fcmove %st(1), %st 309; ATHLON-NEXT: fstp %st(1) 310; ATHLON-NEXT: flds 4(%ecx) 311; ATHLON-NEXT: fmul %st, %st(0) 312; ATHLON-NEXT: fxch %st(2) 313; ATHLON-NEXT: fcmove %st(2), %st 314; ATHLON-NEXT: fstp %st(2) 315; ATHLON-NEXT: flds 8(%ecx) 316; ATHLON-NEXT: fmul %st, %st(0) 317; ATHLON-NEXT: fxch %st(3) 318; ATHLON-NEXT: fcmove %st(3), %st 319; ATHLON-NEXT: fstp %st(3) 320; ATHLON-NEXT: flds 12(%ecx) 321; ATHLON-NEXT: fmul %st, %st(0) 322; ATHLON-NEXT: fxch %st(4) 323; ATHLON-NEXT: fcmove %st(4), %st 324; ATHLON-NEXT: fstp %st(4) 325; ATHLON-NEXT: fxch %st(3) 326; ATHLON-NEXT: fstps 12(%eax) 327; ATHLON-NEXT: fxch %st(1) 328; ATHLON-NEXT: fstps 8(%eax) 329; ATHLON-NEXT: fstps 4(%eax) 330; ATHLON-NEXT: fstps (%eax) 331; ATHLON-NEXT: retl 332; 333; MCU-LABEL: test6: 334; MCU: # %bb.0: 335; MCU-NEXT: pushl %eax 336; MCU-NEXT: flds 12(%edx) 337; MCU-NEXT: fstps (%esp) # 4-byte Folded Spill 338; MCU-NEXT: flds 8(%edx) 339; MCU-NEXT: flds 4(%edx) 340; MCU-NEXT: flds (%ecx) 341; MCU-NEXT: flds 4(%ecx) 342; MCU-NEXT: flds 8(%ecx) 343; MCU-NEXT: flds 12(%ecx) 344; MCU-NEXT: fmul %st, %st(0) 345; MCU-NEXT: fxch %st(1) 346; MCU-NEXT: fmul %st, %st(0) 347; MCU-NEXT: fxch %st(2) 348; MCU-NEXT: fmul %st, %st(0) 349; MCU-NEXT: fxch %st(3) 350; MCU-NEXT: fmul %st, %st(0) 351; MCU-NEXT: testl %eax, %eax 352; MCU-NEXT: flds (%edx) 353; MCU-NEXT: je .LBB5_2 354; MCU-NEXT: # %bb.1: 355; MCU-NEXT: fstp %st(1) 356; MCU-NEXT: fstp %st(3) 357; MCU-NEXT: fstp %st(1) 358; MCU-NEXT: fstp %st(0) 359; MCU-NEXT: flds (%esp) # 4-byte Folded Reload 360; MCU-NEXT: fldz 361; MCU-NEXT: fldz 362; MCU-NEXT: fldz 363; MCU-NEXT: fxch %st(1) 364; MCU-NEXT: fxch %st(6) 365; MCU-NEXT: fxch %st(1) 366; MCU-NEXT: fxch %st(5) 367; MCU-NEXT: fxch %st(4) 368; MCU-NEXT: fxch %st(1) 369; MCU-NEXT: fxch %st(3) 370; MCU-NEXT: fxch %st(2) 371; MCU-NEXT: .LBB5_2: 372; MCU-NEXT: fstp %st(0) 373; MCU-NEXT: fstp %st(5) 374; MCU-NEXT: fstp %st(3) 375; MCU-NEXT: fxch %st(2) 376; MCU-NEXT: fstps 12(%edx) 377; MCU-NEXT: fxch %st(1) 378; MCU-NEXT: fstps 8(%edx) 379; MCU-NEXT: fstps 4(%edx) 380; MCU-NEXT: fstps (%edx) 381; MCU-NEXT: popl %eax 382; MCU-NEXT: retl 383 %tmp = load <4 x float>, <4 x float>* %A 384 %tmp3 = load <4 x float>, <4 x float>* %B 385 %tmp9 = fmul <4 x float> %tmp3, %tmp3 386 %tmp.upgrd.1 = icmp eq i32 %C, 0 387 %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp 388 store <4 x float> %iftmp.38.0, <4 x float>* %A 389 ret void 390} 391 392; Select with fp80's 393define x86_fp80 @test7(i32 %tmp8) nounwind { 394; GENERIC-LABEL: test7: 395; GENERIC: ## %bb.0: 396; GENERIC-NEXT: xorl %eax, %eax 397; GENERIC-NEXT: testl %edi, %edi 398; GENERIC-NEXT: setns %al 399; GENERIC-NEXT: shlq $4, %rax 400; GENERIC-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx 401; GENERIC-NEXT: fldt (%rax,%rcx) 402; GENERIC-NEXT: retq 403; 404; ATOM-LABEL: test7: 405; ATOM: ## %bb.0: 406; ATOM-NEXT: xorl %eax, %eax 407; ATOM-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx 408; ATOM-NEXT: testl %edi, %edi 409; ATOM-NEXT: setns %al 410; ATOM-NEXT: shlq $4, %rax 411; ATOM-NEXT: fldt (%rax,%rcx) 412; ATOM-NEXT: retq 413; 414; ATHLON-LABEL: test7: 415; ATHLON: ## %bb.0: 416; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 417; ATHLON-NEXT: notl %eax 418; ATHLON-NEXT: shrl $27, %eax 419; ATHLON-NEXT: andl $-16, %eax 420; ATHLON-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax) 421; ATHLON-NEXT: retl 422; 423; MCU-LABEL: test7: 424; MCU: # %bb.0: 425; MCU-NEXT: notl %eax 426; MCU-NEXT: shrl $27, %eax 427; MCU-NEXT: andl $-16, %eax 428; MCU-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax) 429; MCU-NEXT: retl 430 %tmp9 = icmp sgt i32 %tmp8, -1 431 %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000 432 ret x86_fp80 %retval 433} 434 435; widening select v6i32 and then a sub 436define void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind { 437; GENERIC-LABEL: test8: 438; GENERIC: ## %bb.0: 439; GENERIC-NEXT: testb $1, %dil 440; GENERIC-NEXT: jne LBB7_1 441; GENERIC-NEXT: ## %bb.2: 442; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 443; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 444; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 445; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 446; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 447; GENERIC-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 448; GENERIC-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 449; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 450; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 451; GENERIC-NEXT: jmp LBB7_3 452; GENERIC-NEXT: LBB7_1: 453; GENERIC-NEXT: movd %r9d, %xmm0 454; GENERIC-NEXT: movd %r8d, %xmm1 455; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 456; GENERIC-NEXT: movd %ecx, %xmm2 457; GENERIC-NEXT: movd %edx, %xmm0 458; GENERIC-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 459; GENERIC-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 460; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 461; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 462; GENERIC-NEXT: LBB7_3: 463; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 464; GENERIC-NEXT: pcmpeqd %xmm2, %xmm2 465; GENERIC-NEXT: paddd %xmm2, %xmm0 466; GENERIC-NEXT: paddd %xmm2, %xmm1 467; GENERIC-NEXT: movq %xmm1, 16(%rsi) 468; GENERIC-NEXT: movdqa %xmm0, (%rsi) 469; GENERIC-NEXT: retq 470; 471; ATOM-LABEL: test8: 472; ATOM: ## %bb.0: 473; ATOM-NEXT: testb $1, %dil 474; ATOM-NEXT: jne LBB7_1 475; ATOM-NEXT: ## %bb.2: 476; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 477; ATOM-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 478; ATOM-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 479; ATOM-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 480; ATOM-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 481; ATOM-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 482; ATOM-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 483; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 484; ATOM-NEXT: jmp LBB7_3 485; ATOM-NEXT: LBB7_1: 486; ATOM-NEXT: movd %r9d, %xmm1 487; ATOM-NEXT: movd %r8d, %xmm2 488; ATOM-NEXT: movd %ecx, %xmm3 489; ATOM-NEXT: movd %edx, %xmm0 490; ATOM-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 491; ATOM-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 492; ATOM-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 493; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 494; ATOM-NEXT: LBB7_3: 495; ATOM-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 496; ATOM-NEXT: pcmpeqd %xmm2, %xmm2 497; ATOM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 498; ATOM-NEXT: paddd %xmm2, %xmm0 499; ATOM-NEXT: paddd %xmm2, %xmm1 500; ATOM-NEXT: movq %xmm1, 16(%rsi) 501; ATOM-NEXT: movdqa %xmm0, (%rsi) 502; ATOM-NEXT: retq 503; 504; ATHLON-LABEL: test8: 505; ATHLON: ## %bb.0: 506; ATHLON-NEXT: pushl %ebp 507; ATHLON-NEXT: pushl %ebx 508; ATHLON-NEXT: pushl %edi 509; ATHLON-NEXT: pushl %esi 510; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 511; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 512; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax 513; ATHLON-NEXT: cmovnel %ecx, %eax 514; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 515; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 516; ATHLON-NEXT: cmovnel %edx, %ecx 517; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 518; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %esi 519; ATHLON-NEXT: cmovnel %edx, %esi 520; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 521; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edi 522; ATHLON-NEXT: cmovnel %edx, %edi 523; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 524; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ebx 525; ATHLON-NEXT: cmovnel %edx, %ebx 526; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 527; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ebp 528; ATHLON-NEXT: cmovnel %edx, %ebp 529; ATHLON-NEXT: movl (%eax), %eax 530; ATHLON-NEXT: movl (%ecx), %ecx 531; ATHLON-NEXT: movl (%esi), %edx 532; ATHLON-NEXT: movl (%edi), %esi 533; ATHLON-NEXT: movl (%ebx), %ebx 534; ATHLON-NEXT: movl (%ebp), %edi 535; ATHLON-NEXT: decl %eax 536; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ebp 537; ATHLON-NEXT: movl %eax, 20(%ebp) 538; ATHLON-NEXT: decl %ecx 539; ATHLON-NEXT: movl %ecx, 16(%ebp) 540; ATHLON-NEXT: decl %edx 541; ATHLON-NEXT: movl %edx, 12(%ebp) 542; ATHLON-NEXT: decl %esi 543; ATHLON-NEXT: movl %esi, 8(%ebp) 544; ATHLON-NEXT: decl %ebx 545; ATHLON-NEXT: movl %ebx, 4(%ebp) 546; ATHLON-NEXT: decl %edi 547; ATHLON-NEXT: movl %edi, (%ebp) 548; ATHLON-NEXT: popl %esi 549; ATHLON-NEXT: popl %edi 550; ATHLON-NEXT: popl %ebx 551; ATHLON-NEXT: popl %ebp 552; ATHLON-NEXT: retl 553; 554; MCU-LABEL: test8: 555; MCU: # %bb.0: 556; MCU-NEXT: pushl %ebp 557; MCU-NEXT: pushl %ebx 558; MCU-NEXT: pushl %edi 559; MCU-NEXT: pushl %esi 560; MCU-NEXT: testb $1, %al 561; MCU-NEXT: jne .LBB7_1 562; MCU-NEXT: # %bb.2: 563; MCU-NEXT: leal {{[0-9]+}}(%esp), %edi 564; MCU-NEXT: je .LBB7_5 565; MCU-NEXT: .LBB7_4: 566; MCU-NEXT: leal {{[0-9]+}}(%esp), %ecx 567; MCU-NEXT: je .LBB7_8 568; MCU-NEXT: .LBB7_7: 569; MCU-NEXT: leal {{[0-9]+}}(%esp), %esi 570; MCU-NEXT: je .LBB7_11 571; MCU-NEXT: .LBB7_10: 572; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp 573; MCU-NEXT: je .LBB7_14 574; MCU-NEXT: .LBB7_13: 575; MCU-NEXT: leal {{[0-9]+}}(%esp), %eax 576; MCU-NEXT: jmp .LBB7_15 577; MCU-NEXT: .LBB7_1: 578; MCU-NEXT: leal {{[0-9]+}}(%esp), %edi 579; MCU-NEXT: jne .LBB7_4 580; MCU-NEXT: .LBB7_5: 581; MCU-NEXT: leal {{[0-9]+}}(%esp), %ecx 582; MCU-NEXT: jne .LBB7_7 583; MCU-NEXT: .LBB7_8: 584; MCU-NEXT: leal {{[0-9]+}}(%esp), %esi 585; MCU-NEXT: jne .LBB7_10 586; MCU-NEXT: .LBB7_11: 587; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp 588; MCU-NEXT: jne .LBB7_13 589; MCU-NEXT: .LBB7_14: 590; MCU-NEXT: leal {{[0-9]+}}(%esp), %eax 591; MCU-NEXT: .LBB7_15: 592; MCU-NEXT: movl (%edi), %ebx 593; MCU-NEXT: movl (%ecx), %edi 594; MCU-NEXT: movl (%esi), %esi 595; MCU-NEXT: movl (%ebp), %ecx 596; MCU-NEXT: movl (%eax), %eax 597; MCU-NEXT: jne .LBB7_16 598; MCU-NEXT: # %bb.17: 599; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp 600; MCU-NEXT: jmp .LBB7_18 601; MCU-NEXT: .LBB7_16: 602; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp 603; MCU-NEXT: .LBB7_18: 604; MCU-NEXT: movl (%ebp), %ebp 605; MCU-NEXT: decl %ebp 606; MCU-NEXT: decl %eax 607; MCU-NEXT: decl %ecx 608; MCU-NEXT: decl %esi 609; MCU-NEXT: decl %edi 610; MCU-NEXT: decl %ebx 611; MCU-NEXT: movl %ebx, 20(%edx) 612; MCU-NEXT: movl %edi, 16(%edx) 613; MCU-NEXT: movl %esi, 12(%edx) 614; MCU-NEXT: movl %ecx, 8(%edx) 615; MCU-NEXT: movl %eax, 4(%edx) 616; MCU-NEXT: movl %ebp, (%edx) 617; MCU-NEXT: popl %esi 618; MCU-NEXT: popl %edi 619; MCU-NEXT: popl %ebx 620; MCU-NEXT: popl %ebp 621; MCU-NEXT: retl 622 %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2 623 %val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 624 store <6 x i32> %val, <6 x i32>* %dst.addr 625 ret void 626} 627 628 629;; Test integer select between values and constants. 630 631define i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone { 632; GENERIC-LABEL: test9: 633; GENERIC: ## %bb.0: 634; GENERIC-NEXT: cmpq $1, %rdi 635; GENERIC-NEXT: sbbq %rax, %rax 636; GENERIC-NEXT: orq %rsi, %rax 637; GENERIC-NEXT: retq 638; 639; ATOM-LABEL: test9: 640; ATOM: ## %bb.0: 641; ATOM-NEXT: cmpq $1, %rdi 642; ATOM-NEXT: sbbq %rax, %rax 643; ATOM-NEXT: orq %rsi, %rax 644; ATOM-NEXT: nop 645; ATOM-NEXT: nop 646; ATOM-NEXT: retq 647; 648; ATHLON-LABEL: test9: 649; ATHLON: ## %bb.0: 650; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 651; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 652; ATHLON-NEXT: movl $-1, %eax 653; ATHLON-NEXT: movl $-1, %edx 654; ATHLON-NEXT: je LBB8_2 655; ATHLON-NEXT: ## %bb.1: 656; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 657; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx 658; ATHLON-NEXT: LBB8_2: 659; ATHLON-NEXT: retl 660; 661; MCU-LABEL: test9: 662; MCU: # %bb.0: 663; MCU-NEXT: orl %edx, %eax 664; MCU-NEXT: jne .LBB8_1 665; MCU-NEXT: # %bb.2: 666; MCU-NEXT: movl $-1, %eax 667; MCU-NEXT: movl $-1, %edx 668; MCU-NEXT: retl 669; MCU-NEXT: .LBB8_1: 670; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 671; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx 672; MCU-NEXT: retl 673 %cmp = icmp ne i64 %x, 0 674 %cond = select i1 %cmp, i64 %y, i64 -1 675 ret i64 %cond 676} 677 678;; Same as test9 679define i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 680; GENERIC-LABEL: test9a: 681; GENERIC: ## %bb.0: 682; GENERIC-NEXT: cmpq $1, %rdi 683; GENERIC-NEXT: sbbq %rax, %rax 684; GENERIC-NEXT: orq %rsi, %rax 685; GENERIC-NEXT: retq 686; 687; ATOM-LABEL: test9a: 688; ATOM: ## %bb.0: 689; ATOM-NEXT: cmpq $1, %rdi 690; ATOM-NEXT: sbbq %rax, %rax 691; ATOM-NEXT: orq %rsi, %rax 692; ATOM-NEXT: nop 693; ATOM-NEXT: nop 694; ATOM-NEXT: retq 695; 696; ATHLON-LABEL: test9a: 697; ATHLON: ## %bb.0: 698; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 699; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 700; ATHLON-NEXT: movl $-1, %eax 701; ATHLON-NEXT: movl $-1, %edx 702; ATHLON-NEXT: je LBB9_2 703; ATHLON-NEXT: ## %bb.1: 704; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 705; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx 706; ATHLON-NEXT: LBB9_2: 707; ATHLON-NEXT: retl 708; 709; MCU-LABEL: test9a: 710; MCU: # %bb.0: 711; MCU-NEXT: orl %edx, %eax 712; MCU-NEXT: movl $-1, %eax 713; MCU-NEXT: movl $-1, %edx 714; MCU-NEXT: je .LBB9_2 715; MCU-NEXT: # %bb.1: 716; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 717; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx 718; MCU-NEXT: .LBB9_2: 719; MCU-NEXT: retl 720 %cmp = icmp eq i64 %x, 0 721 %cond = select i1 %cmp, i64 -1, i64 %y 722 ret i64 %cond 723} 724 725define i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone { 726; GENERIC-LABEL: test9b: 727; GENERIC: ## %bb.0: 728; GENERIC-NEXT: cmpq $1, %rdi 729; GENERIC-NEXT: sbbq %rax, %rax 730; GENERIC-NEXT: orq %rsi, %rax 731; GENERIC-NEXT: retq 732; 733; ATOM-LABEL: test9b: 734; ATOM: ## %bb.0: 735; ATOM-NEXT: cmpq $1, %rdi 736; ATOM-NEXT: sbbq %rax, %rax 737; ATOM-NEXT: orq %rsi, %rax 738; ATOM-NEXT: nop 739; ATOM-NEXT: nop 740; ATOM-NEXT: retq 741; 742; ATHLON-LABEL: test9b: 743; ATHLON: ## %bb.0: 744; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 745; ATHLON-NEXT: xorl %edx, %edx 746; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 747; ATHLON-NEXT: sete %dl 748; ATHLON-NEXT: negl %edx 749; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 750; ATHLON-NEXT: orl %edx, %eax 751; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %edx 752; ATHLON-NEXT: retl 753; 754; MCU-LABEL: test9b: 755; MCU: # %bb.0: 756; MCU-NEXT: movl %edx, %ecx 757; MCU-NEXT: xorl %edx, %edx 758; MCU-NEXT: orl %ecx, %eax 759; MCU-NEXT: sete %dl 760; MCU-NEXT: negl %edx 761; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 762; MCU-NEXT: orl %edx, %eax 763; MCU-NEXT: orl {{[0-9]+}}(%esp), %edx 764; MCU-NEXT: retl 765 %cmp = icmp eq i64 %x, 0 766 %A = sext i1 %cmp to i64 767 %cond = or i64 %y, %A 768 ret i64 %cond 769} 770 771;; Select between -1 and 1. 772define i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone { 773; GENERIC-LABEL: test10: 774; GENERIC: ## %bb.0: 775; GENERIC-NEXT: cmpq $1, %rdi 776; GENERIC-NEXT: sbbq %rax, %rax 777; GENERIC-NEXT: orq $1, %rax 778; GENERIC-NEXT: retq 779; 780; ATOM-LABEL: test10: 781; ATOM: ## %bb.0: 782; ATOM-NEXT: cmpq $1, %rdi 783; ATOM-NEXT: sbbq %rax, %rax 784; ATOM-NEXT: orq $1, %rax 785; ATOM-NEXT: nop 786; ATOM-NEXT: nop 787; ATOM-NEXT: retq 788; 789; ATHLON-LABEL: test10: 790; ATHLON: ## %bb.0: 791; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 792; ATHLON-NEXT: xorl %edx, %edx 793; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 794; ATHLON-NEXT: movl $-1, %ecx 795; ATHLON-NEXT: movl $1, %eax 796; ATHLON-NEXT: cmovel %ecx, %eax 797; ATHLON-NEXT: cmovel %ecx, %edx 798; ATHLON-NEXT: retl 799; 800; MCU-LABEL: test10: 801; MCU: # %bb.0: 802; MCU-NEXT: orl %edx, %eax 803; MCU-NEXT: movl $-1, %eax 804; MCU-NEXT: movl $-1, %edx 805; MCU-NEXT: je .LBB11_2 806; MCU-NEXT: # %bb.1: 807; MCU-NEXT: xorl %edx, %edx 808; MCU-NEXT: movl $1, %eax 809; MCU-NEXT: .LBB11_2: 810; MCU-NEXT: retl 811 %cmp = icmp eq i64 %x, 0 812 %cond = select i1 %cmp, i64 -1, i64 1 813 ret i64 %cond 814} 815 816define i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone { 817; GENERIC-LABEL: test11: 818; GENERIC: ## %bb.0: 819; GENERIC-NEXT: negq %rdi 820; GENERIC-NEXT: sbbq %rax, %rax 821; GENERIC-NEXT: orq %rsi, %rax 822; GENERIC-NEXT: retq 823; 824; ATOM-LABEL: test11: 825; ATOM: ## %bb.0: 826; ATOM-NEXT: negq %rdi 827; ATOM-NEXT: sbbq %rax, %rax 828; ATOM-NEXT: orq %rsi, %rax 829; ATOM-NEXT: nop 830; ATOM-NEXT: nop 831; ATOM-NEXT: retq 832; 833; ATHLON-LABEL: test11: 834; ATHLON: ## %bb.0: 835; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 836; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 837; ATHLON-NEXT: movl $-1, %eax 838; ATHLON-NEXT: movl $-1, %edx 839; ATHLON-NEXT: jne LBB12_2 840; ATHLON-NEXT: ## %bb.1: 841; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 842; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx 843; ATHLON-NEXT: LBB12_2: 844; ATHLON-NEXT: retl 845; 846; MCU-LABEL: test11: 847; MCU: # %bb.0: 848; MCU-NEXT: orl %edx, %eax 849; MCU-NEXT: je .LBB12_1 850; MCU-NEXT: # %bb.2: 851; MCU-NEXT: movl $-1, %eax 852; MCU-NEXT: movl $-1, %edx 853; MCU-NEXT: retl 854; MCU-NEXT: .LBB12_1: 855; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 856; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx 857; MCU-NEXT: retl 858 %cmp = icmp eq i64 %x, 0 859 %cond = select i1 %cmp, i64 %y, i64 -1 860 ret i64 %cond 861} 862 863define i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 864; GENERIC-LABEL: test11a: 865; GENERIC: ## %bb.0: 866; GENERIC-NEXT: negq %rdi 867; GENERIC-NEXT: sbbq %rax, %rax 868; GENERIC-NEXT: orq %rsi, %rax 869; GENERIC-NEXT: retq 870; 871; ATOM-LABEL: test11a: 872; ATOM: ## %bb.0: 873; ATOM-NEXT: negq %rdi 874; ATOM-NEXT: sbbq %rax, %rax 875; ATOM-NEXT: orq %rsi, %rax 876; ATOM-NEXT: nop 877; ATOM-NEXT: nop 878; ATOM-NEXT: retq 879; 880; ATHLON-LABEL: test11a: 881; ATHLON: ## %bb.0: 882; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 883; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 884; ATHLON-NEXT: movl $-1, %eax 885; ATHLON-NEXT: movl $-1, %edx 886; ATHLON-NEXT: jne LBB13_2 887; ATHLON-NEXT: ## %bb.1: 888; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 889; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx 890; ATHLON-NEXT: LBB13_2: 891; ATHLON-NEXT: retl 892; 893; MCU-LABEL: test11a: 894; MCU: # %bb.0: 895; MCU-NEXT: orl %edx, %eax 896; MCU-NEXT: movl $-1, %eax 897; MCU-NEXT: movl $-1, %edx 898; MCU-NEXT: jne .LBB13_2 899; MCU-NEXT: # %bb.1: 900; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 901; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx 902; MCU-NEXT: .LBB13_2: 903; MCU-NEXT: retl 904 %cmp = icmp ne i64 %x, 0 905 %cond = select i1 %cmp, i64 -1, i64 %y 906 ret i64 %cond 907} 908 909define i32 @eqzero_const_or_all_ones(i32 %x) { 910; GENERIC-LABEL: eqzero_const_or_all_ones: 911; GENERIC: ## %bb.0: 912; GENERIC-NEXT: negl %edi 913; GENERIC-NEXT: sbbl %eax, %eax 914; GENERIC-NEXT: orl $42, %eax 915; GENERIC-NEXT: retq 916; 917; ATOM-LABEL: eqzero_const_or_all_ones: 918; ATOM: ## %bb.0: 919; ATOM-NEXT: negl %edi 920; ATOM-NEXT: sbbl %eax, %eax 921; ATOM-NEXT: orl $42, %eax 922; ATOM-NEXT: nop 923; ATOM-NEXT: nop 924; ATOM-NEXT: retq 925; 926; ATHLON-LABEL: eqzero_const_or_all_ones: 927; ATHLON: ## %bb.0: 928; ATHLON-NEXT: xorl %eax, %eax 929; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax 930; ATHLON-NEXT: sbbl %eax, %eax 931; ATHLON-NEXT: orl $42, %eax 932; ATHLON-NEXT: retl 933; 934; MCU-LABEL: eqzero_const_or_all_ones: 935; MCU: # %bb.0: 936; MCU-NEXT: negl %eax 937; MCU-NEXT: sbbl %eax, %eax 938; MCU-NEXT: orl $42, %eax 939; MCU-NEXT: retl 940 %z = icmp eq i32 %x, 0 941 %r = select i1 %z, i32 42, i32 -1 942 ret i32 %r 943} 944 945define i32 @nezero_const_or_all_ones(i32 %x) { 946; GENERIC-LABEL: nezero_const_or_all_ones: 947; GENERIC: ## %bb.0: 948; GENERIC-NEXT: cmpl $1, %edi 949; GENERIC-NEXT: sbbl %eax, %eax 950; GENERIC-NEXT: orl $42, %eax 951; GENERIC-NEXT: retq 952; 953; ATOM-LABEL: nezero_const_or_all_ones: 954; ATOM: ## %bb.0: 955; ATOM-NEXT: cmpl $1, %edi 956; ATOM-NEXT: sbbl %eax, %eax 957; ATOM-NEXT: orl $42, %eax 958; ATOM-NEXT: nop 959; ATOM-NEXT: nop 960; ATOM-NEXT: retq 961; 962; ATHLON-LABEL: nezero_const_or_all_ones: 963; ATHLON: ## %bb.0: 964; ATHLON-NEXT: cmpl $1, {{[0-9]+}}(%esp) 965; ATHLON-NEXT: sbbl %eax, %eax 966; ATHLON-NEXT: orl $42, %eax 967; ATHLON-NEXT: retl 968; 969; MCU-LABEL: nezero_const_or_all_ones: 970; MCU: # %bb.0: 971; MCU-NEXT: cmpl $1, %eax 972; MCU-NEXT: sbbl %eax, %eax 973; MCU-NEXT: orl $42, %eax 974; MCU-NEXT: retl 975 %z = icmp ne i32 %x, 0 976 %r = select i1 %z, i32 42, i32 -1 977 ret i32 %r 978} 979 980define i64 @eqzero_all_ones_or_const(i64 %x) { 981; GENERIC-LABEL: eqzero_all_ones_or_const: 982; GENERIC: ## %bb.0: 983; GENERIC-NEXT: cmpq $1, %rdi 984; GENERIC-NEXT: sbbq %rax, %rax 985; GENERIC-NEXT: orq $42, %rax 986; GENERIC-NEXT: retq 987; 988; ATOM-LABEL: eqzero_all_ones_or_const: 989; ATOM: ## %bb.0: 990; ATOM-NEXT: cmpq $1, %rdi 991; ATOM-NEXT: sbbq %rax, %rax 992; ATOM-NEXT: orq $42, %rax 993; ATOM-NEXT: nop 994; ATOM-NEXT: nop 995; ATOM-NEXT: retq 996; 997; ATHLON-LABEL: eqzero_all_ones_or_const: 998; ATHLON: ## %bb.0: 999; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1000; ATHLON-NEXT: xorl %edx, %edx 1001; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax 1002; ATHLON-NEXT: movl $-1, %ecx 1003; ATHLON-NEXT: movl $42, %eax 1004; ATHLON-NEXT: cmovel %ecx, %eax 1005; ATHLON-NEXT: cmovel %ecx, %edx 1006; ATHLON-NEXT: retl 1007; 1008; MCU-LABEL: eqzero_all_ones_or_const: 1009; MCU: # %bb.0: 1010; MCU-NEXT: orl %edx, %eax 1011; MCU-NEXT: movl $-1, %eax 1012; MCU-NEXT: movl $-1, %edx 1013; MCU-NEXT: je .LBB16_2 1014; MCU-NEXT: # %bb.1: 1015; MCU-NEXT: xorl %edx, %edx 1016; MCU-NEXT: movl $42, %eax 1017; MCU-NEXT: .LBB16_2: 1018; MCU-NEXT: retl 1019 %z = icmp eq i64 %x, 0 1020 %r = select i1 %z, i64 -1, i64 42 1021 ret i64 %r 1022} 1023 1024define i8 @nezero_all_ones_or_const(i8 %x) { 1025; GENERIC-LABEL: nezero_all_ones_or_const: 1026; GENERIC: ## %bb.0: 1027; GENERIC-NEXT: negb %dil 1028; GENERIC-NEXT: sbbl %eax, %eax 1029; GENERIC-NEXT: orb $42, %al 1030; GENERIC-NEXT: ## kill: def $al killed $al killed $eax 1031; GENERIC-NEXT: retq 1032; 1033; ATOM-LABEL: nezero_all_ones_or_const: 1034; ATOM: ## %bb.0: 1035; ATOM-NEXT: negb %dil 1036; ATOM-NEXT: sbbl %eax, %eax 1037; ATOM-NEXT: orb $42, %al 1038; ATOM-NEXT: ## kill: def $al killed $al killed $eax 1039; ATOM-NEXT: nop 1040; ATOM-NEXT: nop 1041; ATOM-NEXT: retq 1042; 1043; ATHLON-LABEL: nezero_all_ones_or_const: 1044; ATHLON: ## %bb.0: 1045; ATHLON-NEXT: xorl %eax, %eax 1046; ATHLON-NEXT: cmpb {{[0-9]+}}(%esp), %al 1047; ATHLON-NEXT: sbbl %eax, %eax 1048; ATHLON-NEXT: orb $42, %al 1049; ATHLON-NEXT: ## kill: def $al killed $al killed $eax 1050; ATHLON-NEXT: retl 1051; 1052; MCU-LABEL: nezero_all_ones_or_const: 1053; MCU: # %bb.0: 1054; MCU-NEXT: negb %al 1055; MCU-NEXT: sbbl %eax, %eax 1056; MCU-NEXT: orb $42, %al 1057; MCU-NEXT: # kill: def $al killed $al killed $eax 1058; MCU-NEXT: retl 1059 %z = icmp ne i8 %x, 0 1060 %r = select i1 %z, i8 -1, i8 42 1061 ret i8 %r 1062} 1063 1064define i32 @PR53006(i32 %x) { 1065; GENERIC-LABEL: PR53006: 1066; GENERIC: ## %bb.0: 1067; GENERIC-NEXT: negl %edi 1068; GENERIC-NEXT: sbbl %eax, %eax 1069; GENERIC-NEXT: orl $1, %eax 1070; GENERIC-NEXT: retq 1071; 1072; ATOM-LABEL: PR53006: 1073; ATOM: ## %bb.0: 1074; ATOM-NEXT: negl %edi 1075; ATOM-NEXT: sbbl %eax, %eax 1076; ATOM-NEXT: orl $1, %eax 1077; ATOM-NEXT: nop 1078; ATOM-NEXT: nop 1079; ATOM-NEXT: retq 1080; 1081; ATHLON-LABEL: PR53006: 1082; ATHLON: ## %bb.0: 1083; ATHLON-NEXT: xorl %eax, %eax 1084; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax 1085; ATHLON-NEXT: sbbl %eax, %eax 1086; ATHLON-NEXT: orl $1, %eax 1087; ATHLON-NEXT: retl 1088; 1089; MCU-LABEL: PR53006: 1090; MCU: # %bb.0: 1091; MCU-NEXT: negl %eax 1092; MCU-NEXT: sbbl %eax, %eax 1093; MCU-NEXT: orl $1, %eax 1094; MCU-NEXT: retl 1095 %z = icmp eq i32 %x, 0 1096 %r = select i1 %z, i32 1, i32 -1 1097 ret i32 %r 1098} 1099 1100define i32 @test13(i32 %a, i32 %b) nounwind { 1101; GENERIC-LABEL: test13: 1102; GENERIC: ## %bb.0: 1103; GENERIC-NEXT: cmpl %esi, %edi 1104; GENERIC-NEXT: sbbl %eax, %eax 1105; GENERIC-NEXT: retq 1106; 1107; ATOM-LABEL: test13: 1108; ATOM: ## %bb.0: 1109; ATOM-NEXT: cmpl %esi, %edi 1110; ATOM-NEXT: sbbl %eax, %eax 1111; ATOM-NEXT: nop 1112; ATOM-NEXT: nop 1113; ATOM-NEXT: nop 1114; ATOM-NEXT: nop 1115; ATOM-NEXT: retq 1116; 1117; ATHLON-LABEL: test13: 1118; ATHLON: ## %bb.0: 1119; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1120; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax 1121; ATHLON-NEXT: sbbl %eax, %eax 1122; ATHLON-NEXT: retl 1123; 1124; MCU-LABEL: test13: 1125; MCU: # %bb.0: 1126; MCU-NEXT: cmpl %edx, %eax 1127; MCU-NEXT: sbbl %eax, %eax 1128; MCU-NEXT: retl 1129 %c = icmp ult i32 %a, %b 1130 %d = sext i1 %c to i32 1131 ret i32 %d 1132} 1133 1134define i32 @test14(i32 %a, i32 %b) nounwind { 1135; GENERIC-LABEL: test14: 1136; GENERIC: ## %bb.0: 1137; GENERIC-NEXT: xorl %eax, %eax 1138; GENERIC-NEXT: cmpl %esi, %edi 1139; GENERIC-NEXT: adcl $-1, %eax 1140; GENERIC-NEXT: retq 1141; 1142; ATOM-LABEL: test14: 1143; ATOM: ## %bb.0: 1144; ATOM-NEXT: xorl %eax, %eax 1145; ATOM-NEXT: cmpl %esi, %edi 1146; ATOM-NEXT: adcl $-1, %eax 1147; ATOM-NEXT: nop 1148; ATOM-NEXT: nop 1149; ATOM-NEXT: retq 1150; 1151; ATHLON-LABEL: test14: 1152; ATHLON: ## %bb.0: 1153; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1154; ATHLON-NEXT: xorl %eax, %eax 1155; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %ecx 1156; ATHLON-NEXT: adcl $-1, %eax 1157; ATHLON-NEXT: retl 1158; 1159; MCU-LABEL: test14: 1160; MCU: # %bb.0: 1161; MCU-NEXT: xorl %ecx, %ecx 1162; MCU-NEXT: cmpl %edx, %eax 1163; MCU-NEXT: adcl $-1, %ecx 1164; MCU-NEXT: movl %ecx, %eax 1165; MCU-NEXT: retl 1166 %c = icmp uge i32 %a, %b 1167 %d = sext i1 %c to i32 1168 ret i32 %d 1169} 1170 1171; rdar://10961709 1172define i32 @test15(i32 %x) nounwind { 1173; GENERIC-LABEL: test15: 1174; GENERIC: ## %bb.0: ## %entry 1175; GENERIC-NEXT: negl %edi 1176; GENERIC-NEXT: sbbl %eax, %eax 1177; GENERIC-NEXT: retq 1178; 1179; ATOM-LABEL: test15: 1180; ATOM: ## %bb.0: ## %entry 1181; ATOM-NEXT: negl %edi 1182; ATOM-NEXT: sbbl %eax, %eax 1183; ATOM-NEXT: nop 1184; ATOM-NEXT: nop 1185; ATOM-NEXT: nop 1186; ATOM-NEXT: nop 1187; ATOM-NEXT: retq 1188; 1189; ATHLON-LABEL: test15: 1190; ATHLON: ## %bb.0: ## %entry 1191; ATHLON-NEXT: xorl %eax, %eax 1192; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax 1193; ATHLON-NEXT: sbbl %eax, %eax 1194; ATHLON-NEXT: retl 1195; 1196; MCU-LABEL: test15: 1197; MCU: # %bb.0: # %entry 1198; MCU-NEXT: negl %eax 1199; MCU-NEXT: sbbl %eax, %eax 1200; MCU-NEXT: retl 1201entry: 1202 %cmp = icmp ne i32 %x, 0 1203 %sub = sext i1 %cmp to i32 1204 ret i32 %sub 1205} 1206 1207define i64 @test16(i64 %x) nounwind uwtable readnone ssp { 1208; GENERIC-LABEL: test16: 1209; GENERIC: ## %bb.0: ## %entry 1210; GENERIC-NEXT: negq %rdi 1211; GENERIC-NEXT: sbbq %rax, %rax 1212; GENERIC-NEXT: retq 1213; 1214; ATOM-LABEL: test16: 1215; ATOM: ## %bb.0: ## %entry 1216; ATOM-NEXT: negq %rdi 1217; ATOM-NEXT: sbbq %rax, %rax 1218; ATOM-NEXT: nop 1219; ATOM-NEXT: nop 1220; ATOM-NEXT: nop 1221; ATOM-NEXT: nop 1222; ATOM-NEXT: retq 1223; 1224; ATHLON-LABEL: test16: 1225; ATHLON: ## %bb.0: ## %entry 1226; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1227; ATHLON-NEXT: xorl %eax, %eax 1228; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %ecx 1229; ATHLON-NEXT: setne %al 1230; ATHLON-NEXT: negl %eax 1231; ATHLON-NEXT: movl %eax, %edx 1232; ATHLON-NEXT: retl 1233; 1234; MCU-LABEL: test16: 1235; MCU: # %bb.0: # %entry 1236; MCU-NEXT: movl %eax, %ecx 1237; MCU-NEXT: xorl %eax, %eax 1238; MCU-NEXT: orl %edx, %ecx 1239; MCU-NEXT: setne %al 1240; MCU-NEXT: negl %eax 1241; MCU-NEXT: movl %eax, %edx 1242; MCU-NEXT: retl 1243entry: 1244 %cmp = icmp ne i64 %x, 0 1245 %conv1 = sext i1 %cmp to i64 1246 ret i64 %conv1 1247} 1248 1249define i16 @test17(i16 %x) nounwind { 1250; GENERIC-LABEL: test17: 1251; GENERIC: ## %bb.0: ## %entry 1252; GENERIC-NEXT: negw %di 1253; GENERIC-NEXT: sbbl %eax, %eax 1254; GENERIC-NEXT: ## kill: def $ax killed $ax killed $eax 1255; GENERIC-NEXT: retq 1256; 1257; ATOM-LABEL: test17: 1258; ATOM: ## %bb.0: ## %entry 1259; ATOM-NEXT: negw %di 1260; ATOM-NEXT: sbbl %eax, %eax 1261; ATOM-NEXT: ## kill: def $ax killed $ax killed $eax 1262; ATOM-NEXT: nop 1263; ATOM-NEXT: nop 1264; ATOM-NEXT: nop 1265; ATOM-NEXT: nop 1266; ATOM-NEXT: retq 1267; 1268; ATHLON-LABEL: test17: 1269; ATHLON: ## %bb.0: ## %entry 1270; ATHLON-NEXT: xorl %eax, %eax 1271; ATHLON-NEXT: cmpw {{[0-9]+}}(%esp), %ax 1272; ATHLON-NEXT: sbbl %eax, %eax 1273; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax 1274; ATHLON-NEXT: retl 1275; 1276; MCU-LABEL: test17: 1277; MCU: # %bb.0: # %entry 1278; MCU-NEXT: negw %ax 1279; MCU-NEXT: sbbl %eax, %eax 1280; MCU-NEXT: # kill: def $ax killed $ax killed $eax 1281; MCU-NEXT: retl 1282entry: 1283 %cmp = icmp ne i16 %x, 0 1284 %sub = sext i1 %cmp to i16 1285 ret i16 %sub 1286} 1287 1288define i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind { 1289; GENERIC-LABEL: test18: 1290; GENERIC: ## %bb.0: 1291; GENERIC-NEXT: movl %esi, %eax 1292; GENERIC-NEXT: cmpl $15, %edi 1293; GENERIC-NEXT: cmovgel %edx, %eax 1294; GENERIC-NEXT: ## kill: def $al killed $al killed $eax 1295; GENERIC-NEXT: retq 1296; 1297; ATOM-LABEL: test18: 1298; ATOM: ## %bb.0: 1299; ATOM-NEXT: movl %esi, %eax 1300; ATOM-NEXT: cmpl $15, %edi 1301; ATOM-NEXT: cmovgel %edx, %eax 1302; ATOM-NEXT: ## kill: def $al killed $al killed $eax 1303; ATOM-NEXT: nop 1304; ATOM-NEXT: nop 1305; ATOM-NEXT: retq 1306; 1307; ATHLON-LABEL: test18: 1308; ATHLON: ## %bb.0: 1309; ATHLON-NEXT: cmpl $15, {{[0-9]+}}(%esp) 1310; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax 1311; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 1312; ATHLON-NEXT: cmovll %eax, %ecx 1313; ATHLON-NEXT: movb (%ecx), %al 1314; ATHLON-NEXT: retl 1315; 1316; MCU-LABEL: test18: 1317; MCU: # %bb.0: 1318; MCU-NEXT: cmpl $15, %eax 1319; MCU-NEXT: jl .LBB24_2 1320; MCU-NEXT: # %bb.1: 1321; MCU-NEXT: movl %ecx, %edx 1322; MCU-NEXT: .LBB24_2: 1323; MCU-NEXT: movl %edx, %eax 1324; MCU-NEXT: retl 1325 %cmp = icmp slt i32 %x, 15 1326 %sel = select i1 %cmp, i8 %a, i8 %b 1327 ret i8 %sel 1328} 1329 1330define i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) { 1331; GENERIC-LABEL: trunc_select_miscompile: 1332; GENERIC: ## %bb.0: 1333; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi 1334; GENERIC-NEXT: movl %edi, %eax 1335; GENERIC-NEXT: leal 2(%rsi), %ecx 1336; GENERIC-NEXT: ## kill: def $cl killed $cl killed $ecx 1337; GENERIC-NEXT: shll %cl, %eax 1338; GENERIC-NEXT: retq 1339; 1340; ATOM-LABEL: trunc_select_miscompile: 1341; ATOM: ## %bb.0: 1342; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi 1343; ATOM-NEXT: leal 2(%rsi), %ecx 1344; ATOM-NEXT: movl %edi, %eax 1345; ATOM-NEXT: ## kill: def $cl killed $cl killed $ecx 1346; ATOM-NEXT: shll %cl, %eax 1347; ATOM-NEXT: nop 1348; ATOM-NEXT: nop 1349; ATOM-NEXT: retq 1350; 1351; ATHLON-LABEL: trunc_select_miscompile: 1352; ATHLON: ## %bb.0: 1353; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1354; ATHLON-NEXT: movb {{[0-9]+}}(%esp), %cl 1355; ATHLON-NEXT: orb $2, %cl 1356; ATHLON-NEXT: shll %cl, %eax 1357; ATHLON-NEXT: retl 1358; 1359; MCU-LABEL: trunc_select_miscompile: 1360; MCU: # %bb.0: 1361; MCU-NEXT: movl %edx, %ecx 1362; MCU-NEXT: orb $2, %cl 1363; MCU-NEXT: # kill: def $cl killed $cl killed $ecx 1364; MCU-NEXT: shll %cl, %eax 1365; MCU-NEXT: retl 1366 %tmp1 = select i1 %cc, i32 3, i32 2 1367 %tmp2 = shl i32 %a, %tmp1 1368 ret i32 %tmp2 1369} 1370 1371; reproducer for pr29002 1372define void @clamp_i8(i32 %src, i8* %dst) { 1373; GENERIC-LABEL: clamp_i8: 1374; GENERIC: ## %bb.0: 1375; GENERIC-NEXT: cmpl $127, %edi 1376; GENERIC-NEXT: movl $127, %eax 1377; GENERIC-NEXT: cmovlel %edi, %eax 1378; GENERIC-NEXT: cmpl $-128, %eax 1379; GENERIC-NEXT: movl $128, %ecx 1380; GENERIC-NEXT: cmovgel %eax, %ecx 1381; GENERIC-NEXT: movb %cl, (%rsi) 1382; GENERIC-NEXT: retq 1383; 1384; ATOM-LABEL: clamp_i8: 1385; ATOM: ## %bb.0: 1386; ATOM-NEXT: cmpl $127, %edi 1387; ATOM-NEXT: movl $127, %eax 1388; ATOM-NEXT: movl $128, %ecx 1389; ATOM-NEXT: cmovlel %edi, %eax 1390; ATOM-NEXT: cmpl $-128, %eax 1391; ATOM-NEXT: cmovgel %eax, %ecx 1392; ATOM-NEXT: movb %cl, (%rsi) 1393; ATOM-NEXT: retq 1394; 1395; ATHLON-LABEL: clamp_i8: 1396; ATHLON: ## %bb.0: 1397; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1398; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1399; ATHLON-NEXT: cmpl $127, %ecx 1400; ATHLON-NEXT: movl $127, %edx 1401; ATHLON-NEXT: cmovlel %ecx, %edx 1402; ATHLON-NEXT: cmpl $-128, %edx 1403; ATHLON-NEXT: movl $128, %ecx 1404; ATHLON-NEXT: cmovgel %edx, %ecx 1405; ATHLON-NEXT: movb %cl, (%eax) 1406; ATHLON-NEXT: retl 1407; 1408; MCU-LABEL: clamp_i8: 1409; MCU: # %bb.0: 1410; MCU-NEXT: cmpl $127, %eax 1411; MCU-NEXT: movl $127, %ecx 1412; MCU-NEXT: jg .LBB26_2 1413; MCU-NEXT: # %bb.1: 1414; MCU-NEXT: movl %eax, %ecx 1415; MCU-NEXT: .LBB26_2: 1416; MCU-NEXT: cmpl $-128, %ecx 1417; MCU-NEXT: movb $-128, %al 1418; MCU-NEXT: jl .LBB26_4 1419; MCU-NEXT: # %bb.3: 1420; MCU-NEXT: movl %ecx, %eax 1421; MCU-NEXT: .LBB26_4: 1422; MCU-NEXT: movb %al, (%edx) 1423; MCU-NEXT: retl 1424 %cmp = icmp sgt i32 %src, 127 1425 %sel1 = select i1 %cmp, i32 127, i32 %src 1426 %cmp1 = icmp slt i32 %sel1, -128 1427 %sel2 = select i1 %cmp1, i32 -128, i32 %sel1 1428 %conv = trunc i32 %sel2 to i8 1429 store i8 %conv, i8* %dst, align 2 1430 ret void 1431} 1432 1433; reproducer for pr29002 1434define void @clamp(i32 %src, i16* %dst) { 1435; GENERIC-LABEL: clamp: 1436; GENERIC: ## %bb.0: 1437; GENERIC-NEXT: cmpl $32768, %edi ## imm = 0x8000 1438; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF 1439; GENERIC-NEXT: cmovll %edi, %eax 1440; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x8000 1441; GENERIC-NEXT: movl $32768, %ecx ## imm = 0x8000 1442; GENERIC-NEXT: cmovgel %eax, %ecx 1443; GENERIC-NEXT: movw %cx, (%rsi) 1444; GENERIC-NEXT: retq 1445; 1446; ATOM-LABEL: clamp: 1447; ATOM: ## %bb.0: 1448; ATOM-NEXT: cmpl $32768, %edi ## imm = 0x8000 1449; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF 1450; ATOM-NEXT: movl $32768, %ecx ## imm = 0x8000 1451; ATOM-NEXT: cmovll %edi, %eax 1452; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x8000 1453; ATOM-NEXT: cmovgel %eax, %ecx 1454; ATOM-NEXT: movw %cx, (%rsi) 1455; ATOM-NEXT: retq 1456; 1457; ATHLON-LABEL: clamp: 1458; ATHLON: ## %bb.0: 1459; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1460; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1461; ATHLON-NEXT: cmpl $32768, %ecx ## imm = 0x8000 1462; ATHLON-NEXT: movl $32767, %edx ## imm = 0x7FFF 1463; ATHLON-NEXT: cmovll %ecx, %edx 1464; ATHLON-NEXT: cmpl $-32768, %edx ## imm = 0x8000 1465; ATHLON-NEXT: movl $32768, %ecx ## imm = 0x8000 1466; ATHLON-NEXT: cmovgel %edx, %ecx 1467; ATHLON-NEXT: movw %cx, (%eax) 1468; ATHLON-NEXT: retl 1469; 1470; MCU-LABEL: clamp: 1471; MCU: # %bb.0: 1472; MCU-NEXT: cmpl $32768, %eax # imm = 0x8000 1473; MCU-NEXT: movl $32767, %ecx # imm = 0x7FFF 1474; MCU-NEXT: jge .LBB27_2 1475; MCU-NEXT: # %bb.1: 1476; MCU-NEXT: movl %eax, %ecx 1477; MCU-NEXT: .LBB27_2: 1478; MCU-NEXT: cmpl $-32768, %ecx # imm = 0x8000 1479; MCU-NEXT: movl $32768, %eax # imm = 0x8000 1480; MCU-NEXT: jl .LBB27_4 1481; MCU-NEXT: # %bb.3: 1482; MCU-NEXT: movl %ecx, %eax 1483; MCU-NEXT: .LBB27_4: 1484; MCU-NEXT: movw %ax, (%edx) 1485; MCU-NEXT: retl 1486 %cmp = icmp sgt i32 %src, 32767 1487 %sel1 = select i1 %cmp, i32 32767, i32 %src 1488 %cmp1 = icmp slt i32 %sel1, -32768 1489 %sel2 = select i1 %cmp1, i32 -32768, i32 %sel1 1490 %conv = trunc i32 %sel2 to i16 1491 store i16 %conv, i16* %dst, align 2 1492 ret void 1493} 1494 1495define i16 @select_xor_1(i16 %A, i8 %cond) { 1496; CHECK-LABEL: select_xor_1: 1497; CHECK: ## %bb.0: ## %entry 1498; CHECK-NEXT: movl %edi, %eax 1499; CHECK-NEXT: xorl $43, %eax 1500; CHECK-NEXT: testb $1, %sil 1501; CHECK-NEXT: cmovel %edi, %eax 1502; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 1503; CHECK-NEXT: retq 1504; 1505; ATHLON-LABEL: select_xor_1: 1506; ATHLON: ## %bb.0: ## %entry 1507; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1508; ATHLON-NEXT: movl %ecx, %eax 1509; ATHLON-NEXT: xorl $43, %eax 1510; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1511; ATHLON-NEXT: cmovel %ecx, %eax 1512; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax 1513; ATHLON-NEXT: retl 1514; 1515; MCU-LABEL: select_xor_1: 1516; MCU: # %bb.0: # %entry 1517; MCU-NEXT: andl $1, %edx 1518; MCU-NEXT: negl %edx 1519; MCU-NEXT: andl $43, %edx 1520; MCU-NEXT: xorl %edx, %eax 1521; MCU-NEXT: # kill: def $ax killed $ax killed $eax 1522; MCU-NEXT: retl 1523entry: 1524 %and = and i8 %cond, 1 1525 %cmp10 = icmp eq i8 %and, 0 1526 %0 = xor i16 %A, 43 1527 %1 = select i1 %cmp10, i16 %A, i16 %0 1528 ret i16 %1 1529} 1530 1531; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 1532; icmp eq (and %cond, 1), 0 1533define i16 @select_xor_1b(i16 %A, i8 %cond) { 1534; CHECK-LABEL: select_xor_1b: 1535; CHECK: ## %bb.0: ## %entry 1536; CHECK-NEXT: movl %edi, %eax 1537; CHECK-NEXT: xorl $43, %eax 1538; CHECK-NEXT: testb $1, %sil 1539; CHECK-NEXT: cmovel %edi, %eax 1540; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 1541; CHECK-NEXT: retq 1542; 1543; ATHLON-LABEL: select_xor_1b: 1544; ATHLON: ## %bb.0: ## %entry 1545; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1546; ATHLON-NEXT: movl %ecx, %eax 1547; ATHLON-NEXT: xorl $43, %eax 1548; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1549; ATHLON-NEXT: cmovel %ecx, %eax 1550; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax 1551; ATHLON-NEXT: retl 1552; 1553; MCU-LABEL: select_xor_1b: 1554; MCU: # %bb.0: # %entry 1555; MCU-NEXT: testb $1, %dl 1556; MCU-NEXT: je .LBB29_2 1557; MCU-NEXT: # %bb.1: 1558; MCU-NEXT: xorl $43, %eax 1559; MCU-NEXT: .LBB29_2: # %entry 1560; MCU-NEXT: # kill: def $ax killed $ax killed $eax 1561; MCU-NEXT: retl 1562entry: 1563 %and = and i8 %cond, 1 1564 %cmp10 = icmp ne i8 %and, 1 1565 %0 = xor i16 %A, 43 1566 %1 = select i1 %cmp10, i16 %A, i16 %0 1567 ret i16 %1 1568} 1569 1570define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) { 1571; CHECK-LABEL: select_xor_2: 1572; CHECK: ## %bb.0: ## %entry 1573; CHECK-NEXT: movl %esi, %eax 1574; CHECK-NEXT: xorl %edi, %eax 1575; CHECK-NEXT: testb $1, %dl 1576; CHECK-NEXT: cmovel %edi, %eax 1577; CHECK-NEXT: retq 1578; 1579; ATHLON-LABEL: select_xor_2: 1580; ATHLON: ## %bb.0: ## %entry 1581; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1582; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1583; ATHLON-NEXT: xorl %ecx, %eax 1584; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1585; ATHLON-NEXT: cmovel %ecx, %eax 1586; ATHLON-NEXT: retl 1587; 1588; MCU-LABEL: select_xor_2: 1589; MCU: # %bb.0: # %entry 1590; MCU-NEXT: andl $1, %ecx 1591; MCU-NEXT: negl %ecx 1592; MCU-NEXT: andl %edx, %ecx 1593; MCU-NEXT: xorl %ecx, %eax 1594; MCU-NEXT: retl 1595entry: 1596 %and = and i8 %cond, 1 1597 %cmp10 = icmp eq i8 %and, 0 1598 %0 = xor i32 %B, %A 1599 %1 = select i1 %cmp10, i32 %A, i32 %0 1600 ret i32 %1 1601} 1602 1603; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 1604; icmp eq (and %cond, 1), 0 1605define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) { 1606; CHECK-LABEL: select_xor_2b: 1607; CHECK: ## %bb.0: ## %entry 1608; CHECK-NEXT: movl %esi, %eax 1609; CHECK-NEXT: xorl %edi, %eax 1610; CHECK-NEXT: testb $1, %dl 1611; CHECK-NEXT: cmovel %edi, %eax 1612; CHECK-NEXT: retq 1613; 1614; ATHLON-LABEL: select_xor_2b: 1615; ATHLON: ## %bb.0: ## %entry 1616; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1617; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1618; ATHLON-NEXT: xorl %ecx, %eax 1619; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1620; ATHLON-NEXT: cmovel %ecx, %eax 1621; ATHLON-NEXT: retl 1622; 1623; MCU-LABEL: select_xor_2b: 1624; MCU: # %bb.0: # %entry 1625; MCU-NEXT: testb $1, %cl 1626; MCU-NEXT: je .LBB31_2 1627; MCU-NEXT: # %bb.1: 1628; MCU-NEXT: xorl %edx, %eax 1629; MCU-NEXT: .LBB31_2: # %entry 1630; MCU-NEXT: retl 1631entry: 1632 %and = and i8 %cond, 1 1633 %cmp10 = icmp ne i8 %and, 1 1634 %0 = xor i32 %B, %A 1635 %1 = select i1 %cmp10, i32 %A, i32 %0 1636 ret i32 %1 1637} 1638 1639define i32 @select_or(i32 %A, i32 %B, i8 %cond) { 1640; CHECK-LABEL: select_or: 1641; CHECK: ## %bb.0: ## %entry 1642; CHECK-NEXT: movl %esi, %eax 1643; CHECK-NEXT: orl %edi, %eax 1644; CHECK-NEXT: testb $1, %dl 1645; CHECK-NEXT: cmovel %edi, %eax 1646; CHECK-NEXT: retq 1647; 1648; ATHLON-LABEL: select_or: 1649; ATHLON: ## %bb.0: ## %entry 1650; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1651; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1652; ATHLON-NEXT: orl %ecx, %eax 1653; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1654; ATHLON-NEXT: cmovel %ecx, %eax 1655; ATHLON-NEXT: retl 1656; 1657; MCU-LABEL: select_or: 1658; MCU: # %bb.0: # %entry 1659; MCU-NEXT: andl $1, %ecx 1660; MCU-NEXT: negl %ecx 1661; MCU-NEXT: andl %edx, %ecx 1662; MCU-NEXT: orl %ecx, %eax 1663; MCU-NEXT: retl 1664entry: 1665 %and = and i8 %cond, 1 1666 %cmp10 = icmp eq i8 %and, 0 1667 %0 = or i32 %B, %A 1668 %1 = select i1 %cmp10, i32 %A, i32 %0 1669 ret i32 %1 1670} 1671 1672; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 1673; icmp eq (and %cond, 1), 0 1674define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) { 1675; CHECK-LABEL: select_or_b: 1676; CHECK: ## %bb.0: ## %entry 1677; CHECK-NEXT: movl %esi, %eax 1678; CHECK-NEXT: orl %edi, %eax 1679; CHECK-NEXT: testb $1, %dl 1680; CHECK-NEXT: cmovel %edi, %eax 1681; CHECK-NEXT: retq 1682; 1683; ATHLON-LABEL: select_or_b: 1684; ATHLON: ## %bb.0: ## %entry 1685; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1686; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1687; ATHLON-NEXT: orl %ecx, %eax 1688; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1689; ATHLON-NEXT: cmovel %ecx, %eax 1690; ATHLON-NEXT: retl 1691; 1692; MCU-LABEL: select_or_b: 1693; MCU: # %bb.0: # %entry 1694; MCU-NEXT: testb $1, %cl 1695; MCU-NEXT: je .LBB33_2 1696; MCU-NEXT: # %bb.1: 1697; MCU-NEXT: orl %edx, %eax 1698; MCU-NEXT: .LBB33_2: # %entry 1699; MCU-NEXT: retl 1700entry: 1701 %and = and i8 %cond, 1 1702 %cmp10 = icmp ne i8 %and, 1 1703 %0 = or i32 %B, %A 1704 %1 = select i1 %cmp10, i32 %A, i32 %0 1705 ret i32 %1 1706} 1707 1708define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) { 1709; CHECK-LABEL: select_or_1: 1710; CHECK: ## %bb.0: ## %entry 1711; CHECK-NEXT: movl %esi, %eax 1712; CHECK-NEXT: orl %edi, %eax 1713; CHECK-NEXT: testb $1, %dl 1714; CHECK-NEXT: cmovel %edi, %eax 1715; CHECK-NEXT: retq 1716; 1717; ATHLON-LABEL: select_or_1: 1718; ATHLON: ## %bb.0: ## %entry 1719; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1720; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1721; ATHLON-NEXT: orl %ecx, %eax 1722; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1723; ATHLON-NEXT: cmovel %ecx, %eax 1724; ATHLON-NEXT: retl 1725; 1726; MCU-LABEL: select_or_1: 1727; MCU: # %bb.0: # %entry 1728; MCU-NEXT: andl $1, %ecx 1729; MCU-NEXT: negl %ecx 1730; MCU-NEXT: andl %edx, %ecx 1731; MCU-NEXT: orl %ecx, %eax 1732; MCU-NEXT: retl 1733entry: 1734 %and = and i32 %cond, 1 1735 %cmp10 = icmp eq i32 %and, 0 1736 %0 = or i32 %B, %A 1737 %1 = select i1 %cmp10, i32 %A, i32 %0 1738 ret i32 %1 1739} 1740 1741; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 1742; icmp eq (and %cond, 1), 0 1743define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) { 1744; CHECK-LABEL: select_or_1b: 1745; CHECK: ## %bb.0: ## %entry 1746; CHECK-NEXT: movl %esi, %eax 1747; CHECK-NEXT: orl %edi, %eax 1748; CHECK-NEXT: testb $1, %dl 1749; CHECK-NEXT: cmovel %edi, %eax 1750; CHECK-NEXT: retq 1751; 1752; ATHLON-LABEL: select_or_1b: 1753; ATHLON: ## %bb.0: ## %entry 1754; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1755; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1756; ATHLON-NEXT: orl %ecx, %eax 1757; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1758; ATHLON-NEXT: cmovel %ecx, %eax 1759; ATHLON-NEXT: retl 1760; 1761; MCU-LABEL: select_or_1b: 1762; MCU: # %bb.0: # %entry 1763; MCU-NEXT: testb $1, %cl 1764; MCU-NEXT: je .LBB35_2 1765; MCU-NEXT: # %bb.1: 1766; MCU-NEXT: orl %edx, %eax 1767; MCU-NEXT: .LBB35_2: # %entry 1768; MCU-NEXT: retl 1769entry: 1770 %and = and i32 %cond, 1 1771 %cmp10 = icmp ne i32 %and, 1 1772 %0 = or i32 %B, %A 1773 %1 = select i1 %cmp10, i32 %A, i32 %0 1774 ret i32 %1 1775} 1776 1777define i64 @PR51612(i64 %x, i64 %y) { 1778; CHECK-LABEL: PR51612: 1779; CHECK: ## %bb.0: 1780; CHECK-NEXT: leal 1(%rsi), %eax 1781; CHECK-NEXT: incq %rdi 1782; CHECK-NEXT: cmovnel %edi, %eax 1783; CHECK-NEXT: andl 10, %eax 1784; CHECK-NEXT: retq 1785; 1786; ATHLON-LABEL: PR51612: 1787; ATHLON: ## %bb.0: 1788; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax 1789; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx 1790; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx 1791; ATHLON-NEXT: incl %edx 1792; ATHLON-NEXT: addl $1, %eax 1793; ATHLON-NEXT: adcl $0, %ecx 1794; ATHLON-NEXT: cmovbl %edx, %eax 1795; ATHLON-NEXT: andl 10, %eax 1796; ATHLON-NEXT: xorl %edx, %edx 1797; ATHLON-NEXT: retl 1798; 1799; MCU-LABEL: PR51612: 1800; MCU: # %bb.0: 1801; MCU-NEXT: addl $1, %eax 1802; MCU-NEXT: adcl $0, %edx 1803; MCU-NEXT: jae .LBB36_2 1804; MCU-NEXT: # %bb.1: 1805; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax 1806; MCU-NEXT: incl %eax 1807; MCU-NEXT: .LBB36_2: 1808; MCU-NEXT: andl 10, %eax 1809; MCU-NEXT: xorl %edx, %edx 1810; MCU-NEXT: retl 1811 %add = add i64 %x, 1 1812 %inc = add i64 %y, 1 1813 %tobool = icmp eq i64 %add, 0 1814 %sel = select i1 %tobool, i64 %inc, i64 %add 1815 %i = load i32, i32* inttoptr (i32 10 to i32*), align 4 1816 %conv = zext i32 %i to i64 1817 %and = and i64 %sel, %conv 1818 ret i64 %and 1819} 1820 1821; The next 2 tests are for additional bugs based on PR51612. 1822 1823declare { i8, i1 } @llvm.uadd.with.overflow.i8(i8, i8) nounwind readnone 1824declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone 1825 1826define i8 @select_uaddo_common_op0(i8 %a, i8 %b, i8 %c, i1 %cond) { 1827; GENERIC-LABEL: select_uaddo_common_op0: 1828; GENERIC: ## %bb.0: 1829; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi 1830; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi 1831; GENERIC-NEXT: testb $1, %cl 1832; GENERIC-NEXT: cmovel %edx, %esi 1833; GENERIC-NEXT: leal (%rsi,%rdi), %eax 1834; GENERIC-NEXT: ## kill: def $al killed $al killed $eax 1835; GENERIC-NEXT: retq 1836; 1837; ATOM-LABEL: select_uaddo_common_op0: 1838; ATOM: ## %bb.0: 1839; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi 1840; ATOM-NEXT: testb $1, %cl 1841; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi 1842; ATOM-NEXT: cmovel %edx, %esi 1843; ATOM-NEXT: leal (%rsi,%rdi), %eax 1844; ATOM-NEXT: ## kill: def $al killed $al killed $eax 1845; ATOM-NEXT: nop 1846; ATOM-NEXT: nop 1847; ATOM-NEXT: retq 1848; 1849; ATHLON-LABEL: select_uaddo_common_op0: 1850; ATHLON: ## %bb.0: 1851; ATHLON-NEXT: movb {{[0-9]+}}(%esp), %al 1852; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1853; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 1854; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx 1855; ATHLON-NEXT: cmovnel %ecx, %edx 1856; ATHLON-NEXT: addb (%edx), %al 1857; ATHLON-NEXT: retl 1858; 1859; MCU-LABEL: select_uaddo_common_op0: 1860; MCU: # %bb.0: 1861; MCU-NEXT: testb $1, {{[0-9]+}}(%esp) 1862; MCU-NEXT: jne .LBB37_2 1863; MCU-NEXT: # %bb.1: 1864; MCU-NEXT: movl %ecx, %edx 1865; MCU-NEXT: .LBB37_2: 1866; MCU-NEXT: addb %dl, %al 1867; MCU-NEXT: # kill: def $al killed $al killed $eax 1868; MCU-NEXT: retl 1869 %ab = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %a, i8 %b) 1870 %ac = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %a, i8 %c) 1871 %ab0 = extractvalue { i8, i1 } %ab, 0 1872 %ac0 = extractvalue { i8, i1 } %ac, 0 1873 %sel = select i1 %cond, i8 %ab0, i8 %ac0 1874 ret i8 %sel 1875} 1876 1877define i32 @select_uaddo_common_op1(i32 %a, i32 %b, i32 %c, i1 %cond) { 1878; GENERIC-LABEL: select_uaddo_common_op1: 1879; GENERIC: ## %bb.0: 1880; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi 1881; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi 1882; GENERIC-NEXT: testb $1, %cl 1883; GENERIC-NEXT: cmovel %edx, %edi 1884; GENERIC-NEXT: leal (%rdi,%rsi), %eax 1885; GENERIC-NEXT: retq 1886; 1887; ATOM-LABEL: select_uaddo_common_op1: 1888; ATOM: ## %bb.0: 1889; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi 1890; ATOM-NEXT: testb $1, %cl 1891; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi 1892; ATOM-NEXT: cmovel %edx, %edi 1893; ATOM-NEXT: leal (%rdi,%rsi), %eax 1894; ATOM-NEXT: nop 1895; ATOM-NEXT: nop 1896; ATOM-NEXT: retq 1897; 1898; ATHLON-LABEL: select_uaddo_common_op1: 1899; ATHLON: ## %bb.0: 1900; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp) 1901; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax 1902; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx 1903; ATHLON-NEXT: cmovnel %eax, %ecx 1904; ATHLON-NEXT: movl (%ecx), %eax 1905; ATHLON-NEXT: addl {{[0-9]+}}(%esp), %eax 1906; ATHLON-NEXT: retl 1907; 1908; MCU-LABEL: select_uaddo_common_op1: 1909; MCU: # %bb.0: 1910; MCU-NEXT: testb $1, {{[0-9]+}}(%esp) 1911; MCU-NEXT: jne .LBB38_2 1912; MCU-NEXT: # %bb.1: 1913; MCU-NEXT: movl %ecx, %eax 1914; MCU-NEXT: .LBB38_2: 1915; MCU-NEXT: addl %edx, %eax 1916; MCU-NEXT: retl 1917 %ab = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) 1918 %cb = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %c, i32 %b) 1919 %ab0 = extractvalue { i32, i1 } %ab, 0 1920 %cb0 = extractvalue { i32, i1 } %cb, 0 1921 %sel = select i1 %cond, i32 %ab0, i32 %cb0 1922 ret i32 %sel 1923} 1924