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