2201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC3; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM4; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=athlon | FileCheck %s --check-prefix=ATHLON5; RUN: llc < %s -mtriple=i386-intel-elfiamcu | FileCheck %s --check-prefix=MCU6 7; PR57578%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, %dl14; GENERIC-NEXT: cmoveq %rsi, %rdi15; GENERIC-NEXT: movl 8(%rdi), %eax16; GENERIC-NEXT: retq17;18; ATOM-LABEL: test1:19; ATOM: ## %bb.0:20; ATOM-NEXT: testb $1, %dl21; ATOM-NEXT: cmoveq %rsi, %rdi22; ATOM-NEXT: movl 8(%rdi), %eax23; ATOM-NEXT: nop24; ATOM-NEXT: nop25; ATOM-NEXT: retq26;27; ATHLON-LABEL: test1:28; ATHLON: ## %bb.0:29; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)30; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax31; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx32; ATHLON-NEXT: cmovnel %eax, %ecx33; ATHLON-NEXT: movl (%ecx), %eax34; ATHLON-NEXT: movl 8(%eax), %eax35; ATHLON-NEXT: retl36;37; MCU-LABEL: test1:38; MCU: # %bb.0:39; MCU-NEXT: testb $1, %cl40; MCU-NEXT: jne .LBB0_241; MCU-NEXT: # %bb.1:42; MCU-NEXT: movl %edx, %eax43; MCU-NEXT: .LBB0_2:44; MCU-NEXT: movl 8(%eax), %eax45; MCU-NEXT: retl46 %t0 = load %0, ptr %p47 %t1 = load %0, ptr %q48 %t4 = select i1 %r, %0 %t0, %0 %t149 %t5 = extractvalue %0 %t4, 150 ret i32 %t551}52 53; PR213954define i32 @test2() nounwind {55; GENERIC-LABEL: test2:56; GENERIC: ## %bb.0: ## %entry57; GENERIC-NEXT: pushq %rax58; GENERIC-NEXT: callq _return_false59; GENERIC-NEXT: xorl %ecx, %ecx60; GENERIC-NEXT: testb $1, %al61; GENERIC-NEXT: movl $-3840, %eax ## imm = 0xF10062; GENERIC-NEXT: cmovnel %ecx, %eax63; GENERIC-NEXT: cmpl $32768, %eax ## imm = 0x800064; GENERIC-NEXT: jge LBB1_165; GENERIC-NEXT: ## %bb.2: ## %bb9166; GENERIC-NEXT: xorl %eax, %eax67; GENERIC-NEXT: popq %rcx68; GENERIC-NEXT: retq69; GENERIC-NEXT: LBB1_1: ## %bb9070; GENERIC-NEXT: ud271;72; ATOM-LABEL: test2:73; ATOM: ## %bb.0: ## %entry74; ATOM-NEXT: pushq %rax75; ATOM-NEXT: callq _return_false76; ATOM-NEXT: xorl %ecx, %ecx77; ATOM-NEXT: movl $-3840, %edx ## imm = 0xF10078; ATOM-NEXT: testb $1, %al79; ATOM-NEXT: cmovnel %ecx, %edx80; ATOM-NEXT: cmpl $32768, %edx ## imm = 0x800081; ATOM-NEXT: jge LBB1_182; ATOM-NEXT: ## %bb.2: ## %bb9183; ATOM-NEXT: xorl %eax, %eax84; ATOM-NEXT: popq %rcx85; ATOM-NEXT: retq86; ATOM-NEXT: LBB1_1: ## %bb9087; ATOM-NEXT: ud288;89; ATHLON-LABEL: test2:90; ATHLON: ## %bb.0: ## %entry91; ATHLON-NEXT: subl $12, %esp92; ATHLON-NEXT: calll _return_false93; ATHLON-NEXT: xorl %ecx, %ecx94; ATHLON-NEXT: testb $1, %al95; ATHLON-NEXT: movl $-3840, %eax ## imm = 0xF10096; ATHLON-NEXT: cmovnel %ecx, %eax97; ATHLON-NEXT: cmpl $32768, %eax ## imm = 0x800098; ATHLON-NEXT: jge LBB1_199; ATHLON-NEXT: ## %bb.2: ## %bb91100; ATHLON-NEXT: xorl %eax, %eax101; ATHLON-NEXT: addl $12, %esp102; ATHLON-NEXT: retl103; ATHLON-NEXT: LBB1_1: ## %bb90104; ATHLON-NEXT: ud2105;106; MCU-LABEL: test2:107; MCU: # %bb.0: # %entry108; MCU-NEXT: calll return_false@PLT109; MCU-NEXT: movzbl %al, %eax110; MCU-NEXT: andl $1, %eax111; MCU-NEXT: decl %eax112; MCU-NEXT: andl $-3840, %eax # imm = 0xF100113; MCU-NEXT: cmpl $32768, %eax # imm = 0x8000114; MCU-NEXT: jge .LBB1_1115; MCU-NEXT: # %bb.2: # %bb91116; MCU-NEXT: xorl %eax, %eax117; MCU-NEXT: retl118; MCU-NEXT: .LBB1_1: # %bb90119entry:120 %tmp73 = tail call i1 @return_false()121 %g.0 = select i1 %tmp73, i16 0, i16 -480122 %tmp7778 = sext i16 %g.0 to i32123 %tmp80 = shl i32 %tmp7778, 3124 %tmp87 = icmp sgt i32 %tmp80, 32767125 br i1 %tmp87, label %bb90, label %bb91126bb90:127 unreachable128bb91:129 ret i32 0130}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: ## %entry138; GENERIC-NEXT: xorl %eax, %eax139; GENERIC-NEXT: testl %edi, %edi140; GENERIC-NEXT: sete %al141; GENERIC-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx142; GENERIC-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero143; GENERIC-NEXT: retq144;145; ATOM-LABEL: test3:146; ATOM: ## %bb.0: ## %entry147; ATOM-NEXT: xorl %eax, %eax148; ATOM-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx149; ATOM-NEXT: testl %edi, %edi150; ATOM-NEXT: sete %al151; ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero152; ATOM-NEXT: retq153;154; ATHLON-LABEL: test3:155; ATHLON: ## %bb.0: ## %entry156; ATHLON-NEXT: xorl %eax, %eax157; ATHLON-NEXT: cmpl $0, {{[0-9]+}}(%esp)158; ATHLON-NEXT: sete %al159; ATHLON-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)160; ATHLON-NEXT: retl161;162; MCU-LABEL: test3:163; MCU: # %bb.0: # %entry164; MCU-NEXT: xorl %ecx, %ecx165; MCU-NEXT: testl %eax, %eax166; MCU-NEXT: sete %cl167; MCU-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4)168; MCU-NEXT: retl169entry:170 %0 = icmp eq i32 %x, 0171 %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01172 ret float %iftmp.0.0173}174 175define signext i8 @test4(ptr nocapture %P, double %F) nounwind readonly {176; CHECK-LABEL: test4:177; CHECK: ## %bb.0: ## %entry178; CHECK-NEXT: movsd {{.*#+}} xmm1 = [4.2E+1,0.0E+0]179; CHECK-NEXT: xorl %eax, %eax180; CHECK-NEXT: ucomisd %xmm0, %xmm1181; CHECK-NEXT: seta %al182; CHECK-NEXT: movsbl (%rdi,%rax,4), %eax183; CHECK-NEXT: retq184;185; ATHLON-LABEL: test4:186; ATHLON: ## %bb.0: ## %entry187; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax188; ATHLON-NEXT: fldl {{[0-9]+}}(%esp)189; ATHLON-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}190; ATHLON-NEXT: xorl %ecx, %ecx191; ATHLON-NEXT: fucompi %st(1), %st192; ATHLON-NEXT: fstp %st(0)193; ATHLON-NEXT: seta %cl194; ATHLON-NEXT: movsbl (%eax,%ecx,4), %eax195; ATHLON-NEXT: retl196;197; MCU-LABEL: test4:198; MCU: # %bb.0: # %entry199; MCU-NEXT: movl %eax, %ecx200; MCU-NEXT: fldl {{[0-9]+}}(%esp)201; MCU-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}202; MCU-NEXT: fucompp203; MCU-NEXT: fnstsw %ax204; MCU-NEXT: xorl %edx, %edx205; MCU-NEXT: # kill: def $ah killed $ah killed $ax206; MCU-NEXT: sahf207; MCU-NEXT: seta %dl208; MCU-NEXT: movzbl (%ecx,%edx,4), %eax209; MCU-NEXT: retl210entry:211 %0 = fcmp olt double %F, 4.200000e+01212 %iftmp.0.0 = select i1 %0, i32 4, i32 0213 %1 = getelementptr i8, ptr %P, i32 %iftmp.0.0214 %2 = load i8, ptr %1, align 1215 ret i8 %2216}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, %dil222; GENERIC-NEXT: jne LBB4_2223; GENERIC-NEXT: ## %bb.1:224; GENERIC-NEXT: movaps %xmm1, %xmm0225; GENERIC-NEXT: LBB4_2:226; GENERIC-NEXT: movss %xmm0, (%rsi)227; GENERIC-NEXT: retq228;229; ATOM-LABEL: test5:230; ATOM: ## %bb.0:231; ATOM-NEXT: testb $1, %dil232; ATOM-NEXT: jne LBB4_2233; ATOM-NEXT: ## %bb.1:234; ATOM-NEXT: movaps %xmm1, %xmm0235; ATOM-NEXT: LBB4_2:236; ATOM-NEXT: movss %xmm0, (%rsi)237; ATOM-NEXT: nop238; ATOM-NEXT: nop239; ATOM-NEXT: retq240;241; ATHLON-LABEL: test5:242; ATHLON: ## %bb.0:243; ATHLON-NEXT: pushl %esi244; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax245; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)246; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx247; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx248; ATHLON-NEXT: cmovnel %ecx, %edx249; ATHLON-NEXT: movzwl (%edx), %ecx250; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx251; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %esi252; ATHLON-NEXT: cmovnel %edx, %esi253; ATHLON-NEXT: movzwl (%esi), %edx254; ATHLON-NEXT: movw %dx, 2(%eax)255; ATHLON-NEXT: movw %cx, (%eax)256; ATHLON-NEXT: popl %esi257; ATHLON-NEXT: retl258;259; MCU-LABEL: test5:260; MCU: # %bb.0:261; MCU-NEXT: pushl %esi262; MCU-NEXT: movl {{[0-9]+}}(%esp), %esi263; MCU-NEXT: testb $1, %al264; MCU-NEXT: jne .LBB4_2265; MCU-NEXT: # %bb.1:266; MCU-NEXT: movzwl {{[0-9]+}}(%esp), %ecx267; MCU-NEXT: movzwl {{[0-9]+}}(%esp), %edx268; MCU-NEXT: .LBB4_2:269; MCU-NEXT: movw %cx, 2(%esi)270; MCU-NEXT: movw %dx, (%esi)271; MCU-NEXT: popl %esi272; MCU-NEXT: retl273 %x = select i1 %c, <2 x i16> %a, <2 x i16> %b274 store <2 x i16> %x, ptr %p275 ret void276}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, %edi283; CHECK-NEXT: je LBB5_1284; CHECK-NEXT: ## %bb.2:285; CHECK-NEXT: movaps (%rsi), %xmm0286; CHECK-NEXT: movaps %xmm0, (%rsi)287; CHECK-NEXT: retq288; CHECK-NEXT: LBB5_1:289; CHECK-NEXT: movaps (%rdx), %xmm0290; CHECK-NEXT: mulps %xmm0, %xmm0291; CHECK-NEXT: movaps %xmm0, (%rsi)292; CHECK-NEXT: retq293;294; ATHLON-LABEL: test6:295; ATHLON: ## %bb.0:296; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx297; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax298; 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), %st307; 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), %st312; 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), %st317; 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), %st322; 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: retl330;331; MCU-LABEL: test6:332; MCU: # %bb.0:333; MCU-NEXT: pushl %eax334; MCU-NEXT: flds 12(%edx)335; MCU-NEXT: fstps (%esp) # 4-byte Folded Spill336; 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, %eax350; MCU-NEXT: flds (%edx)351; MCU-NEXT: je .LBB5_2352; 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 Reload358; MCU-NEXT: fldz359; MCU-NEXT: fldz360; MCU-NEXT: fldz361; 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 %eax380; MCU-NEXT: retl381 %tmp = load <4 x float>, ptr %A382 %tmp3 = load <4 x float>, ptr %B383 %tmp9 = fmul <4 x float> %tmp3, %tmp3384 %tmp.upgrd.1 = icmp eq i32 %C, 0385 %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp386 store <4 x float> %iftmp.38.0, ptr %A387 ret void388}389 390; Select with fp80's391define x86_fp80 @test7(i32 %tmp8) nounwind {392; GENERIC-LABEL: test7:393; GENERIC: ## %bb.0:394; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi395; GENERIC-NEXT: notl %edi396; GENERIC-NEXT: shrl $27, %edi397; GENERIC-NEXT: andl $-16, %edi398; GENERIC-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rax399; GENERIC-NEXT: fldt (%rdi,%rax)400; GENERIC-NEXT: retq401;402; ATOM-LABEL: test7:403; ATOM: ## %bb.0:404; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi405; ATOM-NEXT: leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rax406; ATOM-NEXT: notl %edi407; ATOM-NEXT: shrl $27, %edi408; ATOM-NEXT: andl $-16, %edi409; ATOM-NEXT: fldt (%rdi,%rax)410; ATOM-NEXT: retq411;412; ATHLON-LABEL: test7:413; ATHLON: ## %bb.0:414; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax415; ATHLON-NEXT: notl %eax416; ATHLON-NEXT: shrl $27, %eax417; ATHLON-NEXT: andl $-16, %eax418; ATHLON-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax)419; ATHLON-NEXT: retl420;421; MCU-LABEL: test7:422; MCU: # %bb.0:423; MCU-NEXT: notl %eax424; MCU-NEXT: shrl $27, %eax425; MCU-NEXT: andl $-16, %eax426; MCU-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax)427; MCU-NEXT: retl428 %tmp9 = icmp sgt i32 %tmp8, -1429 %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000430 ret x86_fp80 %retval431}432 433; widening select v6i32 and then a sub434define 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, %dil438; GENERIC-NEXT: jne LBB7_1439; GENERIC-NEXT: ## %bb.2:440; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero441; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero442; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]443; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero444; GENERIC-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero445; 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,zero448; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero449; GENERIC-NEXT: jmp LBB7_3450; GENERIC-NEXT: LBB7_1:451; GENERIC-NEXT: movd %r9d, %xmm0452; GENERIC-NEXT: movd %r8d, %xmm1453; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]454; GENERIC-NEXT: movd %ecx, %xmm2455; GENERIC-NEXT: movd %edx, %xmm0456; 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,zero459; GENERIC-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero460; GENERIC-NEXT: LBB7_3:461; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]462; GENERIC-NEXT: pcmpeqd %xmm2, %xmm2463; GENERIC-NEXT: paddd %xmm2, %xmm0464; GENERIC-NEXT: paddd %xmm2, %xmm1465; GENERIC-NEXT: movq %xmm1, 16(%rsi)466; GENERIC-NEXT: movdqa %xmm0, (%rsi)467; GENERIC-NEXT: retq468;469; ATOM-LABEL: test8:470; ATOM: ## %bb.0:471; ATOM-NEXT: testb $1, %dil472; ATOM-NEXT: jne LBB7_1473; ATOM-NEXT: ## %bb.2:474; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero475; ATOM-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero476; ATOM-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero477; ATOM-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero478; 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,zero481; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero482; ATOM-NEXT: jmp LBB7_3483; ATOM-NEXT: LBB7_1:484; ATOM-NEXT: movd %r9d, %xmm1485; ATOM-NEXT: movd %r8d, %xmm2486; ATOM-NEXT: movd %ecx, %xmm3487; ATOM-NEXT: movd %edx, %xmm0488; 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,zero491; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero492; ATOM-NEXT: LBB7_3:493; ATOM-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]494; ATOM-NEXT: pcmpeqd %xmm2, %xmm2495; ATOM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]496; ATOM-NEXT: paddd %xmm2, %xmm0497; ATOM-NEXT: paddd %xmm2, %xmm1498; ATOM-NEXT: movq %xmm1, 16(%rsi)499; ATOM-NEXT: movdqa %xmm0, (%rsi)500; ATOM-NEXT: retq501;502; ATHLON-LABEL: test8:503; ATHLON: ## %bb.0:504; ATHLON-NEXT: pushl %ebp505; ATHLON-NEXT: pushl %ebx506; ATHLON-NEXT: pushl %edi507; ATHLON-NEXT: pushl %esi508; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)509; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax510; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ebx511; ATHLON-NEXT: cmovnel %eax, %ebx512; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax513; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edi514; ATHLON-NEXT: cmovnel %eax, %edi515; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax516; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %esi517; ATHLON-NEXT: cmovnel %eax, %esi518; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax519; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx520; ATHLON-NEXT: cmovnel %eax, %edx521; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax522; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx523; ATHLON-NEXT: cmovnel %eax, %ecx524; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ebp525; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax526; ATHLON-NEXT: cmovnel %ebp, %eax527; ATHLON-NEXT: movl (%ebx), %ebp528; ATHLON-NEXT: movl (%edi), %ebx529; ATHLON-NEXT: movl (%esi), %edi530; ATHLON-NEXT: movl (%edx), %esi531; ATHLON-NEXT: movl (%ecx), %edx532; ATHLON-NEXT: movl (%eax), %ecx533; ATHLON-NEXT: decl %ebp534; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax535; ATHLON-NEXT: movl %ebp, 20(%eax)536; ATHLON-NEXT: decl %ebx537; ATHLON-NEXT: movl %ebx, 16(%eax)538; ATHLON-NEXT: decl %edi539; ATHLON-NEXT: movl %edi, 12(%eax)540; ATHLON-NEXT: decl %esi541; ATHLON-NEXT: movl %esi, 8(%eax)542; ATHLON-NEXT: decl %edx543; ATHLON-NEXT: movl %edx, 4(%eax)544; ATHLON-NEXT: decl %ecx545; ATHLON-NEXT: movl %ecx, (%eax)546; ATHLON-NEXT: popl %esi547; ATHLON-NEXT: popl %edi548; ATHLON-NEXT: popl %ebx549; ATHLON-NEXT: popl %ebp550; ATHLON-NEXT: retl551;552; MCU-LABEL: test8:553; MCU: # %bb.0:554; MCU-NEXT: pushl %ebp555; MCU-NEXT: pushl %ebx556; MCU-NEXT: pushl %edi557; MCU-NEXT: pushl %esi558; MCU-NEXT: testb $1, %al559; MCU-NEXT: jne .LBB7_1560; MCU-NEXT: # %bb.2:561; MCU-NEXT: leal {{[0-9]+}}(%esp), %edi562; MCU-NEXT: je .LBB7_5563; MCU-NEXT: .LBB7_4:564; MCU-NEXT: leal {{[0-9]+}}(%esp), %ecx565; MCU-NEXT: je .LBB7_8566; MCU-NEXT: .LBB7_7:567; MCU-NEXT: leal {{[0-9]+}}(%esp), %esi568; MCU-NEXT: je .LBB7_11569; MCU-NEXT: .LBB7_10:570; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp571; MCU-NEXT: je .LBB7_14572; MCU-NEXT: .LBB7_13:573; MCU-NEXT: leal {{[0-9]+}}(%esp), %eax574; MCU-NEXT: jmp .LBB7_15575; MCU-NEXT: .LBB7_1:576; MCU-NEXT: leal {{[0-9]+}}(%esp), %edi577; MCU-NEXT: jne .LBB7_4578; MCU-NEXT: .LBB7_5:579; MCU-NEXT: leal {{[0-9]+}}(%esp), %ecx580; MCU-NEXT: jne .LBB7_7581; MCU-NEXT: .LBB7_8:582; MCU-NEXT: leal {{[0-9]+}}(%esp), %esi583; MCU-NEXT: jne .LBB7_10584; MCU-NEXT: .LBB7_11:585; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp586; MCU-NEXT: jne .LBB7_13587; MCU-NEXT: .LBB7_14:588; MCU-NEXT: leal {{[0-9]+}}(%esp), %eax589; MCU-NEXT: .LBB7_15:590; MCU-NEXT: movl (%edi), %ebx591; MCU-NEXT: movl (%ecx), %edi592; MCU-NEXT: movl (%esi), %esi593; MCU-NEXT: movl (%ebp), %ecx594; MCU-NEXT: movl (%eax), %eax595; MCU-NEXT: jne .LBB7_16596; MCU-NEXT: # %bb.17:597; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp598; MCU-NEXT: jmp .LBB7_18599; MCU-NEXT: .LBB7_16:600; MCU-NEXT: leal {{[0-9]+}}(%esp), %ebp601; MCU-NEXT: .LBB7_18:602; MCU-NEXT: movl (%ebp), %ebp603; MCU-NEXT: decl %ebp604; MCU-NEXT: decl %eax605; MCU-NEXT: decl %ecx606; MCU-NEXT: decl %esi607; MCU-NEXT: decl %edi608; MCU-NEXT: decl %ebx609; 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 %esi616; MCU-NEXT: popl %edi617; MCU-NEXT: popl %ebx618; MCU-NEXT: popl %ebp619; MCU-NEXT: retl620 %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2621 %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.addr623 ret void624}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, %eax633; CHECK-NEXT: cmpq $1, %rdi634; CHECK-NEXT: sbbq %rax, %rax635; CHECK-NEXT: orq %rsi, %rax636; CHECK-NEXT: retq637;638; ATHLON-LABEL: test9:639; ATHLON: ## %bb.0:640; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax641; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax642; ATHLON-NEXT: movl $-1, %eax643; ATHLON-NEXT: movl $-1, %edx644; ATHLON-NEXT: je LBB8_2645; ATHLON-NEXT: ## %bb.1:646; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax647; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx648; ATHLON-NEXT: LBB8_2:649; ATHLON-NEXT: retl650;651; MCU-LABEL: test9:652; MCU: # %bb.0:653; MCU-NEXT: orl %edx, %eax654; MCU-NEXT: jne .LBB8_1655; MCU-NEXT: # %bb.2:656; MCU-NEXT: movl $-1, %eax657; MCU-NEXT: movl $-1, %edx658; MCU-NEXT: retl659; MCU-NEXT: .LBB8_1:660; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax661; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx662; MCU-NEXT: retl663 %cmp = icmp ne i64 %x, 0664 %cond = select i1 %cmp, i64 %y, i64 -1665 ret i64 %cond666}667 668;; Same as test9669define i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone {670; CHECK-LABEL: test9a:671; CHECK: ## %bb.0:672; CHECK-NEXT: xorl %eax, %eax673; CHECK-NEXT: cmpq $1, %rdi674; CHECK-NEXT: sbbq %rax, %rax675; CHECK-NEXT: orq %rsi, %rax676; CHECK-NEXT: retq677;678; ATHLON-LABEL: test9a:679; ATHLON: ## %bb.0:680; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax681; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax682; ATHLON-NEXT: movl $-1, %eax683; ATHLON-NEXT: movl $-1, %edx684; ATHLON-NEXT: je LBB9_2685; ATHLON-NEXT: ## %bb.1:686; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax687; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx688; ATHLON-NEXT: LBB9_2:689; ATHLON-NEXT: retl690;691; MCU-LABEL: test9a:692; MCU: # %bb.0:693; MCU-NEXT: orl %edx, %eax694; MCU-NEXT: movl $-1, %eax695; MCU-NEXT: movl $-1, %edx696; MCU-NEXT: je .LBB9_2697; MCU-NEXT: # %bb.1:698; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax699; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx700; MCU-NEXT: .LBB9_2:701; MCU-NEXT: retl702 %cmp = icmp eq i64 %x, 0703 %cond = select i1 %cmp, i64 -1, i64 %y704 ret i64 %cond705}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, %eax711; CHECK-NEXT: cmpq $1, %rdi712; CHECK-NEXT: sbbq %rax, %rax713; CHECK-NEXT: orq %rsi, %rax714; CHECK-NEXT: retq715;716; ATHLON-LABEL: test9b:717; ATHLON: ## %bb.0:718; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax719; ATHLON-NEXT: xorl %edx, %edx720; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax721; ATHLON-NEXT: sete %dl722; ATHLON-NEXT: negl %edx723; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax724; ATHLON-NEXT: orl %edx, %eax725; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %edx726; ATHLON-NEXT: retl727;728; MCU-LABEL: test9b:729; MCU: # %bb.0:730; MCU-NEXT: movl %edx, %ecx731; MCU-NEXT: xorl %edx, %edx732; MCU-NEXT: orl %ecx, %eax733; MCU-NEXT: sete %dl734; MCU-NEXT: negl %edx735; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax736; MCU-NEXT: orl %edx, %eax737; MCU-NEXT: orl {{[0-9]+}}(%esp), %edx738; MCU-NEXT: retl739 %cmp = icmp eq i64 %x, 0740 %A = sext i1 %cmp to i64741 %cond = or i64 %y, %A742 ret i64 %cond743}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, %eax750; CHECK-NEXT: cmpq $1, %rdi751; CHECK-NEXT: setae %al752; CHECK-NEXT: leaq -1(%rax,%rax), %rax753; CHECK-NEXT: retq754;755; ATHLON-LABEL: test10:756; ATHLON: ## %bb.0:757; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax758; ATHLON-NEXT: xorl %edx, %edx759; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax760; ATHLON-NEXT: sete %dl761; ATHLON-NEXT: negl %edx762; ATHLON-NEXT: movl %edx, %eax763; ATHLON-NEXT: orl $1, %eax764; ATHLON-NEXT: retl765;766; MCU-LABEL: test10:767; MCU: # %bb.0:768; MCU-NEXT: movl %edx, %ecx769; MCU-NEXT: xorl %edx, %edx770; MCU-NEXT: orl %ecx, %eax771; MCU-NEXT: sete %dl772; MCU-NEXT: negl %edx773; MCU-NEXT: movl %edx, %eax774; MCU-NEXT: orl $1, %eax775; MCU-NEXT: retl776 %cmp = icmp eq i64 %x, 0777 %cond = select i1 %cmp, i64 -1, i64 1778 ret i64 %cond779}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, %eax785; CHECK-NEXT: negq %rdi786; CHECK-NEXT: sbbq %rax, %rax787; CHECK-NEXT: orq %rsi, %rax788; CHECK-NEXT: retq789;790; ATHLON-LABEL: test11:791; ATHLON: ## %bb.0:792; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax793; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax794; ATHLON-NEXT: movl $-1, %eax795; ATHLON-NEXT: movl $-1, %edx796; ATHLON-NEXT: jne LBB12_2797; ATHLON-NEXT: ## %bb.1:798; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax799; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx800; ATHLON-NEXT: LBB12_2:801; ATHLON-NEXT: retl802;803; MCU-LABEL: test11:804; MCU: # %bb.0:805; MCU-NEXT: orl %edx, %eax806; MCU-NEXT: je .LBB12_1807; MCU-NEXT: # %bb.2:808; MCU-NEXT: movl $-1, %eax809; MCU-NEXT: movl $-1, %edx810; MCU-NEXT: retl811; MCU-NEXT: .LBB12_1:812; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax813; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx814; MCU-NEXT: retl815 %cmp = icmp eq i64 %x, 0816 %cond = select i1 %cmp, i64 %y, i64 -1817 ret i64 %cond818}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, %eax824; CHECK-NEXT: negq %rdi825; CHECK-NEXT: sbbq %rax, %rax826; CHECK-NEXT: orq %rsi, %rax827; CHECK-NEXT: retq828;829; ATHLON-LABEL: test11a:830; ATHLON: ## %bb.0:831; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax832; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax833; ATHLON-NEXT: movl $-1, %eax834; ATHLON-NEXT: movl $-1, %edx835; ATHLON-NEXT: jne LBB13_2836; ATHLON-NEXT: ## %bb.1:837; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax838; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx839; ATHLON-NEXT: LBB13_2:840; ATHLON-NEXT: retl841;842; MCU-LABEL: test11a:843; MCU: # %bb.0:844; MCU-NEXT: orl %edx, %eax845; MCU-NEXT: movl $-1, %eax846; MCU-NEXT: movl $-1, %edx847; MCU-NEXT: jne .LBB13_2848; MCU-NEXT: # %bb.1:849; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax850; MCU-NEXT: movl {{[0-9]+}}(%esp), %edx851; MCU-NEXT: .LBB13_2:852; MCU-NEXT: retl853 %cmp = icmp ne i64 %x, 0854 %cond = select i1 %cmp, i64 -1, i64 %y855 ret i64 %cond856}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, %eax862; CHECK-NEXT: negl %edi863; CHECK-NEXT: sbbl %eax, %eax864; CHECK-NEXT: orl $42, %eax865; CHECK-NEXT: retq866;867; ATHLON-LABEL: eqzero_const_or_all_ones:868; ATHLON: ## %bb.0:869; ATHLON-NEXT: xorl %eax, %eax870; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax871; ATHLON-NEXT: sbbl %eax, %eax872; ATHLON-NEXT: orl $42, %eax873; ATHLON-NEXT: retl874;875; MCU-LABEL: eqzero_const_or_all_ones:876; MCU: # %bb.0:877; MCU-NEXT: xorl %ecx, %ecx878; MCU-NEXT: negl %eax879; MCU-NEXT: sbbl %ecx, %ecx880; MCU-NEXT: orl $42, %ecx881; MCU-NEXT: movl %ecx, %eax882; MCU-NEXT: retl883 %z = icmp eq i32 %x, 0884 %r = select i1 %z, i32 42, i32 -1885 ret i32 %r886}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, %eax892; CHECK-NEXT: cmpl $1, %edi893; CHECK-NEXT: sbbl %eax, %eax894; CHECK-NEXT: orl $42, %eax895; CHECK-NEXT: retq896;897; ATHLON-LABEL: nezero_const_or_all_ones:898; ATHLON: ## %bb.0:899; ATHLON-NEXT: xorl %eax, %eax900; ATHLON-NEXT: cmpl $1, {{[0-9]+}}(%esp)901; ATHLON-NEXT: sbbl %eax, %eax902; ATHLON-NEXT: orl $42, %eax903; ATHLON-NEXT: retl904;905; MCU-LABEL: nezero_const_or_all_ones:906; MCU: # %bb.0:907; MCU-NEXT: xorl %ecx, %ecx908; MCU-NEXT: cmpl $1, %eax909; MCU-NEXT: sbbl %ecx, %ecx910; MCU-NEXT: orl $42, %ecx911; MCU-NEXT: movl %ecx, %eax912; MCU-NEXT: retl913 %z = icmp ne i32 %x, 0914 %r = select i1 %z, i32 42, i32 -1915 ret i32 %r916}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, %eax922; CHECK-NEXT: cmpq $1, %rdi923; CHECK-NEXT: sbbq %rax, %rax924; CHECK-NEXT: orq $42, %rax925; CHECK-NEXT: retq926;927; ATHLON-LABEL: eqzero_all_ones_or_const:928; ATHLON: ## %bb.0:929; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax930; ATHLON-NEXT: xorl %edx, %edx931; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %eax932; ATHLON-NEXT: sete %dl933; ATHLON-NEXT: negl %edx934; ATHLON-NEXT: movl %edx, %eax935; ATHLON-NEXT: orl $42, %eax936; ATHLON-NEXT: retl937;938; MCU-LABEL: eqzero_all_ones_or_const:939; MCU: # %bb.0:940; MCU-NEXT: movl %edx, %ecx941; MCU-NEXT: xorl %edx, %edx942; MCU-NEXT: orl %ecx, %eax943; MCU-NEXT: sete %dl944; MCU-NEXT: negl %edx945; MCU-NEXT: movl %edx, %eax946; MCU-NEXT: orl $42, %eax947; MCU-NEXT: retl948 %z = icmp eq i64 %x, 0949 %r = select i1 %z, i64 -1, i64 42950 ret i64 %r951}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, %eax957; CHECK-NEXT: negb %dil958; CHECK-NEXT: sbbl %eax, %eax959; CHECK-NEXT: orb $42, %al960; CHECK-NEXT: ## kill: def $al killed $al killed $eax961; CHECK-NEXT: retq962;963; ATHLON-LABEL: nezero_all_ones_or_const:964; ATHLON: ## %bb.0:965; ATHLON-NEXT: xorl %eax, %eax966; ATHLON-NEXT: cmpb {{[0-9]+}}(%esp), %al967; ATHLON-NEXT: sbbl %eax, %eax968; ATHLON-NEXT: orb $42, %al969; ATHLON-NEXT: ## kill: def $al killed $al killed $eax970; ATHLON-NEXT: retl971;972; MCU-LABEL: nezero_all_ones_or_const:973; MCU: # %bb.0:974; MCU-NEXT: xorl %ecx, %ecx975; MCU-NEXT: negb %al976; MCU-NEXT: sbbl %ecx, %ecx977; MCU-NEXT: orb $42, %cl978; MCU-NEXT: movl %ecx, %eax979; MCU-NEXT: retl980 %z = icmp ne i8 %x, 0981 %r = select i1 %z, i8 -1, i8 42982 ret i8 %r983}984 985define i32 @PR53006(i32 %x) {986; CHECK-LABEL: PR53006:987; CHECK: ## %bb.0:988; CHECK-NEXT: xorl %eax, %eax989; CHECK-NEXT: negl %edi990; CHECK-NEXT: setae %al991; CHECK-NEXT: leal -1(%rax,%rax), %eax992; CHECK-NEXT: retq993;994; ATHLON-LABEL: PR53006:995; ATHLON: ## %bb.0:996; ATHLON-NEXT: xorl %eax, %eax997; ATHLON-NEXT: xorl %ecx, %ecx998; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax999; ATHLON-NEXT: setae %cl1000; ATHLON-NEXT: leal -1(%ecx,%ecx), %eax1001; ATHLON-NEXT: retl1002;1003; MCU-LABEL: PR53006:1004; MCU: # %bb.0:1005; MCU-NEXT: xorl %ecx, %ecx1006; MCU-NEXT: negl %eax1007; MCU-NEXT: setae %cl1008; MCU-NEXT: leal -1(%ecx,%ecx), %eax1009; MCU-NEXT: retl1010 %z = icmp eq i32 %x, 01011 %r = select i1 %z, i32 1, i32 -11012 ret i32 %r1013}1014 1015define i32 @test13(i32 %a, i32 %b) nounwind {1016; GENERIC-LABEL: test13:1017; GENERIC: ## %bb.0:1018; GENERIC-NEXT: xorl %eax, %eax1019; GENERIC-NEXT: cmpl %esi, %edi1020; GENERIC-NEXT: sbbl %eax, %eax1021; GENERIC-NEXT: retq1022;1023; ATOM-LABEL: test13:1024; ATOM: ## %bb.0:1025; ATOM-NEXT: xorl %eax, %eax1026; ATOM-NEXT: cmpl %esi, %edi1027; ATOM-NEXT: sbbl %eax, %eax1028; ATOM-NEXT: nop1029; ATOM-NEXT: nop1030; ATOM-NEXT: retq1031;1032; ATHLON-LABEL: test13:1033; ATHLON: ## %bb.0:1034; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1035; ATHLON-NEXT: xorl %eax, %eax1036; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %ecx1037; ATHLON-NEXT: sbbl %eax, %eax1038; ATHLON-NEXT: retl1039;1040; MCU-LABEL: test13:1041; MCU: # %bb.0:1042; MCU-NEXT: xorl %ecx, %ecx1043; MCU-NEXT: cmpl %edx, %eax1044; MCU-NEXT: sbbl %ecx, %ecx1045; MCU-NEXT: movl %ecx, %eax1046; MCU-NEXT: retl1047 %c = icmp ult i32 %a, %b1048 %d = sext i1 %c to i321049 ret i32 %d1050}1051 1052define i32 @test14(i32 %a, i32 %b) nounwind {1053; GENERIC-LABEL: test14:1054; GENERIC: ## %bb.0:1055; GENERIC-NEXT: xorl %eax, %eax1056; GENERIC-NEXT: cmpl %esi, %edi1057; GENERIC-NEXT: adcl $-1, %eax1058; GENERIC-NEXT: retq1059;1060; ATOM-LABEL: test14:1061; ATOM: ## %bb.0:1062; ATOM-NEXT: xorl %eax, %eax1063; ATOM-NEXT: cmpl %esi, %edi1064; ATOM-NEXT: adcl $-1, %eax1065; ATOM-NEXT: nop1066; ATOM-NEXT: nop1067; ATOM-NEXT: retq1068;1069; ATHLON-LABEL: test14:1070; ATHLON: ## %bb.0:1071; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1072; ATHLON-NEXT: xorl %eax, %eax1073; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %ecx1074; ATHLON-NEXT: adcl $-1, %eax1075; ATHLON-NEXT: retl1076;1077; MCU-LABEL: test14:1078; MCU: # %bb.0:1079; MCU-NEXT: xorl %ecx, %ecx1080; MCU-NEXT: cmpl %edx, %eax1081; MCU-NEXT: adcl $-1, %ecx1082; MCU-NEXT: movl %ecx, %eax1083; MCU-NEXT: retl1084 %c = icmp uge i32 %a, %b1085 %d = sext i1 %c to i321086 ret i32 %d1087}1088 1089; rdar://109617091090define i32 @test15(i32 %x) nounwind {1091; GENERIC-LABEL: test15:1092; GENERIC: ## %bb.0: ## %entry1093; GENERIC-NEXT: xorl %eax, %eax1094; GENERIC-NEXT: negl %edi1095; GENERIC-NEXT: sbbl %eax, %eax1096; GENERIC-NEXT: retq1097;1098; ATOM-LABEL: test15:1099; ATOM: ## %bb.0: ## %entry1100; ATOM-NEXT: xorl %eax, %eax1101; ATOM-NEXT: negl %edi1102; ATOM-NEXT: sbbl %eax, %eax1103; ATOM-NEXT: nop1104; ATOM-NEXT: nop1105; ATOM-NEXT: retq1106;1107; ATHLON-LABEL: test15:1108; ATHLON: ## %bb.0: ## %entry1109; ATHLON-NEXT: xorl %eax, %eax1110; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax1111; ATHLON-NEXT: sbbl %eax, %eax1112; ATHLON-NEXT: retl1113;1114; MCU-LABEL: test15:1115; MCU: # %bb.0: # %entry1116; MCU-NEXT: xorl %ecx, %ecx1117; MCU-NEXT: negl %eax1118; MCU-NEXT: sbbl %ecx, %ecx1119; MCU-NEXT: movl %ecx, %eax1120; MCU-NEXT: retl1121entry:1122 %cmp = icmp ne i32 %x, 01123 %sub = sext i1 %cmp to i321124 ret i32 %sub1125}1126 1127define i64 @test16(i64 %x) nounwind uwtable readnone ssp {1128; GENERIC-LABEL: test16:1129; GENERIC: ## %bb.0: ## %entry1130; GENERIC-NEXT: xorl %eax, %eax1131; GENERIC-NEXT: negq %rdi1132; GENERIC-NEXT: sbbq %rax, %rax1133; GENERIC-NEXT: retq1134;1135; ATOM-LABEL: test16:1136; ATOM: ## %bb.0: ## %entry1137; ATOM-NEXT: xorl %eax, %eax1138; ATOM-NEXT: negq %rdi1139; ATOM-NEXT: sbbq %rax, %rax1140; ATOM-NEXT: nop1141; ATOM-NEXT: nop1142; ATOM-NEXT: retq1143;1144; ATHLON-LABEL: test16:1145; ATHLON: ## %bb.0: ## %entry1146; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1147; ATHLON-NEXT: xorl %eax, %eax1148; ATHLON-NEXT: orl {{[0-9]+}}(%esp), %ecx1149; ATHLON-NEXT: setne %al1150; ATHLON-NEXT: negl %eax1151; ATHLON-NEXT: movl %eax, %edx1152; ATHLON-NEXT: retl1153;1154; MCU-LABEL: test16:1155; MCU: # %bb.0: # %entry1156; MCU-NEXT: movl %eax, %ecx1157; MCU-NEXT: xorl %eax, %eax1158; MCU-NEXT: orl %edx, %ecx1159; MCU-NEXT: setne %al1160; MCU-NEXT: negl %eax1161; MCU-NEXT: movl %eax, %edx1162; MCU-NEXT: retl1163entry:1164 %cmp = icmp ne i64 %x, 01165 %conv1 = sext i1 %cmp to i641166 ret i64 %conv11167}1168 1169define i16 @test17(i16 %x) nounwind {1170; GENERIC-LABEL: test17:1171; GENERIC: ## %bb.0: ## %entry1172; GENERIC-NEXT: xorl %eax, %eax1173; GENERIC-NEXT: negw %di1174; GENERIC-NEXT: sbbl %eax, %eax1175; GENERIC-NEXT: ## kill: def $ax killed $ax killed $eax1176; GENERIC-NEXT: retq1177;1178; ATOM-LABEL: test17:1179; ATOM: ## %bb.0: ## %entry1180; ATOM-NEXT: xorl %eax, %eax1181; ATOM-NEXT: negw %di1182; ATOM-NEXT: sbbl %eax, %eax1183; ATOM-NEXT: ## kill: def $ax killed $ax killed $eax1184; ATOM-NEXT: nop1185; ATOM-NEXT: nop1186; ATOM-NEXT: retq1187;1188; ATHLON-LABEL: test17:1189; ATHLON: ## %bb.0: ## %entry1190; ATHLON-NEXT: xorl %eax, %eax1191; ATHLON-NEXT: cmpw {{[0-9]+}}(%esp), %ax1192; ATHLON-NEXT: sbbl %eax, %eax1193; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax1194; ATHLON-NEXT: retl1195;1196; MCU-LABEL: test17:1197; MCU: # %bb.0: # %entry1198; MCU-NEXT: xorl %ecx, %ecx1199; MCU-NEXT: negw %ax1200; MCU-NEXT: sbbl %ecx, %ecx1201; MCU-NEXT: movl %ecx, %eax1202; MCU-NEXT: retl1203entry:1204 %cmp = icmp ne i16 %x, 01205 %sub = sext i1 %cmp to i161206 ret i16 %sub1207}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, %eax1213; GENERIC-NEXT: cmpl $15, %edi1214; GENERIC-NEXT: cmovgel %edx, %eax1215; GENERIC-NEXT: ## kill: def $al killed $al killed $eax1216; GENERIC-NEXT: retq1217;1218; ATOM-LABEL: test18:1219; ATOM: ## %bb.0:1220; ATOM-NEXT: movl %esi, %eax1221; ATOM-NEXT: cmpl $15, %edi1222; ATOM-NEXT: cmovgel %edx, %eax1223; ATOM-NEXT: ## kill: def $al killed $al killed $eax1224; ATOM-NEXT: nop1225; ATOM-NEXT: nop1226; ATOM-NEXT: retq1227;1228; ATHLON-LABEL: test18:1229; ATHLON: ## %bb.0:1230; ATHLON-NEXT: cmpl $15, {{[0-9]+}}(%esp)1231; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %eax1232; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx1233; ATHLON-NEXT: cmovll %eax, %ecx1234; ATHLON-NEXT: movzbl (%ecx), %eax1235; ATHLON-NEXT: retl1236;1237; MCU-LABEL: test18:1238; MCU: # %bb.0:1239; MCU-NEXT: cmpl $15, %eax1240; MCU-NEXT: jl .LBB24_21241; MCU-NEXT: # %bb.1:1242; MCU-NEXT: movl %ecx, %edx1243; MCU-NEXT: .LBB24_2:1244; MCU-NEXT: movl %edx, %eax1245; MCU-NEXT: retl1246 %cmp = icmp slt i32 %x, 151247 %sel = select i1 %cmp, i8 %a, i8 %b1248 ret i8 %sel1249}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 $rsi1255; GENERIC-NEXT: movl %edi, %eax1256; GENERIC-NEXT: leal 2(%rsi), %ecx1257; GENERIC-NEXT: ## kill: def $cl killed $cl killed $ecx1258; GENERIC-NEXT: shll %cl, %eax1259; GENERIC-NEXT: retq1260;1261; ATOM-LABEL: trunc_select_miscompile:1262; ATOM: ## %bb.0:1263; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi1264; ATOM-NEXT: leal 2(%rsi), %ecx1265; ATOM-NEXT: movl %edi, %eax1266; ATOM-NEXT: ## kill: def $cl killed $cl killed $ecx1267; ATOM-NEXT: shll %cl, %eax1268; ATOM-NEXT: nop1269; ATOM-NEXT: nop1270; ATOM-NEXT: retq1271;1272; ATHLON-LABEL: trunc_select_miscompile:1273; ATHLON: ## %bb.0:1274; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1275; ATHLON-NEXT: movzbl {{[0-9]+}}(%esp), %ecx1276; ATHLON-NEXT: orb $2, %cl1277; ATHLON-NEXT: shll %cl, %eax1278; ATHLON-NEXT: retl1279;1280; MCU-LABEL: trunc_select_miscompile:1281; MCU: # %bb.0:1282; MCU-NEXT: movl %edx, %ecx1283; MCU-NEXT: orb $2, %cl1284; MCU-NEXT: # kill: def $cl killed $cl killed $ecx1285; MCU-NEXT: shll %cl, %eax1286; MCU-NEXT: retl1287 %tmp1 = select i1 %cc, i32 3, i32 21288 %tmp2 = shl i32 %a, %tmp11289 ret i32 %tmp21290}1291 1292; reproducer for pr290021293define void @clamp_i8(i32 %src, ptr %dst) {1294; GENERIC-LABEL: clamp_i8:1295; GENERIC: ## %bb.0:1296; GENERIC-NEXT: cmpl $127, %edi1297; GENERIC-NEXT: movl $127, %eax1298; GENERIC-NEXT: cmovlel %edi, %eax1299; GENERIC-NEXT: cmpl $-128, %eax1300; GENERIC-NEXT: movl $128, %ecx1301; GENERIC-NEXT: cmovgel %eax, %ecx1302; GENERIC-NEXT: movb %cl, (%rsi)1303; GENERIC-NEXT: retq1304;1305; ATOM-LABEL: clamp_i8:1306; ATOM: ## %bb.0:1307; ATOM-NEXT: cmpl $127, %edi1308; ATOM-NEXT: movl $127, %eax1309; ATOM-NEXT: movl $128, %ecx1310; ATOM-NEXT: cmovlel %edi, %eax1311; ATOM-NEXT: cmpl $-128, %eax1312; ATOM-NEXT: cmovgel %eax, %ecx1313; ATOM-NEXT: movb %cl, (%rsi)1314; ATOM-NEXT: retq1315;1316; ATHLON-LABEL: clamp_i8:1317; ATHLON: ## %bb.0:1318; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1319; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1320; ATHLON-NEXT: cmpl $127, %ecx1321; ATHLON-NEXT: movl $127, %edx1322; ATHLON-NEXT: cmovlel %ecx, %edx1323; ATHLON-NEXT: cmpl $-128, %edx1324; ATHLON-NEXT: movl $128, %ecx1325; ATHLON-NEXT: cmovgel %edx, %ecx1326; ATHLON-NEXT: movb %cl, (%eax)1327; ATHLON-NEXT: retl1328;1329; MCU-LABEL: clamp_i8:1330; MCU: # %bb.0:1331; MCU-NEXT: cmpl $127, %eax1332; MCU-NEXT: movl $127, %ecx1333; MCU-NEXT: jg .LBB26_21334; MCU-NEXT: # %bb.1:1335; MCU-NEXT: movl %eax, %ecx1336; MCU-NEXT: .LBB26_2:1337; MCU-NEXT: cmpl $-128, %ecx1338; MCU-NEXT: movb $-128, %al1339; MCU-NEXT: jl .LBB26_41340; MCU-NEXT: # %bb.3:1341; MCU-NEXT: movl %ecx, %eax1342; MCU-NEXT: .LBB26_4:1343; MCU-NEXT: movb %al, (%edx)1344; MCU-NEXT: retl1345 %cmp = icmp sgt i32 %src, 1271346 %sel1 = select i1 %cmp, i32 127, i32 %src1347 %cmp1 = icmp slt i32 %sel1, -1281348 %sel2 = select i1 %cmp1, i32 -128, i32 %sel11349 %conv = trunc i32 %sel2 to i81350 store i8 %conv, ptr %dst, align 21351 ret void1352}1353 1354; reproducer for pr290021355define void @clamp(i32 %src, ptr %dst) {1356; GENERIC-LABEL: clamp:1357; GENERIC: ## %bb.0:1358; GENERIC-NEXT: cmpl $32768, %edi ## imm = 0x80001359; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF1360; GENERIC-NEXT: cmovll %edi, %eax1361; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x80001362; GENERIC-NEXT: movl $32768, %ecx ## imm = 0x80001363; GENERIC-NEXT: cmovgel %eax, %ecx1364; GENERIC-NEXT: movw %cx, (%rsi)1365; GENERIC-NEXT: retq1366;1367; ATOM-LABEL: clamp:1368; ATOM: ## %bb.0:1369; ATOM-NEXT: cmpl $32768, %edi ## imm = 0x80001370; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF1371; ATOM-NEXT: movl $32768, %ecx ## imm = 0x80001372; ATOM-NEXT: cmovll %edi, %eax1373; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x80001374; ATOM-NEXT: cmovgel %eax, %ecx1375; ATOM-NEXT: movw %cx, (%rsi)1376; ATOM-NEXT: retq1377;1378; ATHLON-LABEL: clamp:1379; ATHLON: ## %bb.0:1380; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1381; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1382; ATHLON-NEXT: cmpl $32768, %ecx ## imm = 0x80001383; ATHLON-NEXT: movl $32767, %edx ## imm = 0x7FFF1384; ATHLON-NEXT: cmovll %ecx, %edx1385; ATHLON-NEXT: cmpl $-32768, %edx ## imm = 0x80001386; ATHLON-NEXT: movl $32768, %ecx ## imm = 0x80001387; ATHLON-NEXT: cmovgel %edx, %ecx1388; ATHLON-NEXT: movw %cx, (%eax)1389; ATHLON-NEXT: retl1390;1391; MCU-LABEL: clamp:1392; MCU: # %bb.0:1393; MCU-NEXT: cmpl $32768, %eax # imm = 0x80001394; MCU-NEXT: movl $32767, %ecx # imm = 0x7FFF1395; MCU-NEXT: jge .LBB27_21396; MCU-NEXT: # %bb.1:1397; MCU-NEXT: movl %eax, %ecx1398; MCU-NEXT: .LBB27_2:1399; MCU-NEXT: cmpl $-32768, %ecx # imm = 0x80001400; MCU-NEXT: movl $32768, %eax # imm = 0x80001401; MCU-NEXT: jl .LBB27_41402; MCU-NEXT: # %bb.3:1403; MCU-NEXT: movl %ecx, %eax1404; MCU-NEXT: .LBB27_4:1405; MCU-NEXT: movw %ax, (%edx)1406; MCU-NEXT: retl1407 %cmp = icmp sgt i32 %src, 327671408 %sel1 = select i1 %cmp, i32 32767, i32 %src1409 %cmp1 = icmp slt i32 %sel1, -327681410 %sel2 = select i1 %cmp1, i32 -32768, i32 %sel11411 %conv = trunc i32 %sel2 to i161412 store i16 %conv, ptr %dst, align 21413 ret void1414}1415 1416define i16 @select_xor_1(i16 %A, i8 %cond) {1417; CHECK-LABEL: select_xor_1:1418; CHECK: ## %bb.0: ## %entry1419; CHECK-NEXT: movl %edi, %eax1420; CHECK-NEXT: xorl $43, %eax1421; CHECK-NEXT: testb $1, %sil1422; CHECK-NEXT: cmovel %edi, %eax1423; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax1424; CHECK-NEXT: retq1425;1426; ATHLON-LABEL: select_xor_1:1427; ATHLON: ## %bb.0: ## %entry1428; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1429; ATHLON-NEXT: movl %ecx, %eax1430; ATHLON-NEXT: xorl $43, %eax1431; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1432; ATHLON-NEXT: cmovel %ecx, %eax1433; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax1434; ATHLON-NEXT: retl1435;1436; MCU-LABEL: select_xor_1:1437; MCU: # %bb.0: # %entry1438; MCU-NEXT: andl $1, %edx1439; MCU-NEXT: negl %edx1440; MCU-NEXT: andl $43, %edx1441; MCU-NEXT: xorl %edx, %eax1442; MCU-NEXT: # kill: def $ax killed $ax killed $eax1443; MCU-NEXT: retl1444entry:1445 %and = and i8 %cond, 11446 %cmp10 = icmp eq i8 %and, 01447 %0 = xor i16 %A, 431448 %1 = select i1 %cmp10, i16 %A, i16 %01449 ret i16 %11450}1451 1452; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1453; icmp eq (and %cond, 1), 01454define i16 @select_xor_1b(i16 %A, i8 %cond) {1455; CHECK-LABEL: select_xor_1b:1456; CHECK: ## %bb.0: ## %entry1457; CHECK-NEXT: movl %edi, %eax1458; CHECK-NEXT: xorl $43, %eax1459; CHECK-NEXT: testb $1, %sil1460; CHECK-NEXT: cmovel %edi, %eax1461; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax1462; CHECK-NEXT: retq1463;1464; ATHLON-LABEL: select_xor_1b:1465; ATHLON: ## %bb.0: ## %entry1466; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1467; ATHLON-NEXT: movl %ecx, %eax1468; ATHLON-NEXT: xorl $43, %eax1469; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1470; ATHLON-NEXT: cmovel %ecx, %eax1471; ATHLON-NEXT: ## kill: def $ax killed $ax killed $eax1472; ATHLON-NEXT: retl1473;1474; MCU-LABEL: select_xor_1b:1475; MCU: # %bb.0: # %entry1476; MCU-NEXT: andl $1, %edx1477; MCU-NEXT: negl %edx1478; MCU-NEXT: andl $43, %edx1479; MCU-NEXT: xorl %edx, %eax1480; MCU-NEXT: # kill: def $ax killed $ax killed $eax1481; MCU-NEXT: retl1482entry:1483 %and = and i8 %cond, 11484 %cmp10 = icmp ne i8 %and, 11485 %0 = xor i16 %A, 431486 %1 = select i1 %cmp10, i16 %A, i16 %01487 ret i16 %11488}1489 1490define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {1491; CHECK-LABEL: select_xor_2:1492; CHECK: ## %bb.0: ## %entry1493; CHECK-NEXT: movl %esi, %eax1494; CHECK-NEXT: xorl %edi, %eax1495; CHECK-NEXT: testb $1, %dl1496; CHECK-NEXT: cmovel %edi, %eax1497; CHECK-NEXT: retq1498;1499; ATHLON-LABEL: select_xor_2:1500; ATHLON: ## %bb.0: ## %entry1501; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1502; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1503; ATHLON-NEXT: xorl %ecx, %eax1504; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1505; ATHLON-NEXT: cmovel %ecx, %eax1506; ATHLON-NEXT: retl1507;1508; MCU-LABEL: select_xor_2:1509; MCU: # %bb.0: # %entry1510; MCU-NEXT: andl $1, %ecx1511; MCU-NEXT: negl %ecx1512; MCU-NEXT: andl %edx, %ecx1513; MCU-NEXT: xorl %ecx, %eax1514; MCU-NEXT: retl1515entry:1516 %and = and i8 %cond, 11517 %cmp10 = icmp eq i8 %and, 01518 %0 = xor i32 %B, %A1519 %1 = select i1 %cmp10, i32 %A, i32 %01520 ret i32 %11521}1522 1523; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1524; icmp eq (and %cond, 1), 01525define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {1526; CHECK-LABEL: select_xor_2b:1527; CHECK: ## %bb.0: ## %entry1528; CHECK-NEXT: movl %esi, %eax1529; CHECK-NEXT: xorl %edi, %eax1530; CHECK-NEXT: testb $1, %dl1531; CHECK-NEXT: cmovel %edi, %eax1532; CHECK-NEXT: retq1533;1534; ATHLON-LABEL: select_xor_2b:1535; ATHLON: ## %bb.0: ## %entry1536; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1537; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1538; ATHLON-NEXT: xorl %ecx, %eax1539; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1540; ATHLON-NEXT: cmovel %ecx, %eax1541; ATHLON-NEXT: retl1542;1543; MCU-LABEL: select_xor_2b:1544; MCU: # %bb.0: # %entry1545; MCU-NEXT: andl $1, %ecx1546; MCU-NEXT: negl %ecx1547; MCU-NEXT: andl %edx, %ecx1548; MCU-NEXT: xorl %ecx, %eax1549; MCU-NEXT: retl1550entry:1551 %and = and i8 %cond, 11552 %cmp10 = icmp ne i8 %and, 11553 %0 = xor i32 %B, %A1554 %1 = select i1 %cmp10, i32 %A, i32 %01555 ret i32 %11556}1557 1558define i32 @select_or(i32 %A, i32 %B, i8 %cond) {1559; CHECK-LABEL: select_or:1560; CHECK: ## %bb.0: ## %entry1561; CHECK-NEXT: movl %esi, %eax1562; CHECK-NEXT: orl %edi, %eax1563; CHECK-NEXT: testb $1, %dl1564; CHECK-NEXT: cmovel %edi, %eax1565; CHECK-NEXT: retq1566;1567; ATHLON-LABEL: select_or:1568; ATHLON: ## %bb.0: ## %entry1569; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1570; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1571; ATHLON-NEXT: orl %ecx, %eax1572; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1573; ATHLON-NEXT: cmovel %ecx, %eax1574; ATHLON-NEXT: retl1575;1576; MCU-LABEL: select_or:1577; MCU: # %bb.0: # %entry1578; MCU-NEXT: andl $1, %ecx1579; MCU-NEXT: negl %ecx1580; MCU-NEXT: andl %edx, %ecx1581; MCU-NEXT: orl %ecx, %eax1582; MCU-NEXT: retl1583entry:1584 %and = and i8 %cond, 11585 %cmp10 = icmp eq i8 %and, 01586 %0 = or i32 %B, %A1587 %1 = select i1 %cmp10, i32 %A, i32 %01588 ret i32 %11589}1590 1591; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1592; icmp eq (and %cond, 1), 01593define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {1594; CHECK-LABEL: select_or_b:1595; CHECK: ## %bb.0: ## %entry1596; CHECK-NEXT: movl %esi, %eax1597; CHECK-NEXT: orl %edi, %eax1598; CHECK-NEXT: testb $1, %dl1599; CHECK-NEXT: cmovel %edi, %eax1600; CHECK-NEXT: retq1601;1602; ATHLON-LABEL: select_or_b:1603; ATHLON: ## %bb.0: ## %entry1604; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1605; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1606; ATHLON-NEXT: orl %ecx, %eax1607; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1608; ATHLON-NEXT: cmovel %ecx, %eax1609; ATHLON-NEXT: retl1610;1611; MCU-LABEL: select_or_b:1612; MCU: # %bb.0: # %entry1613; MCU-NEXT: andl $1, %ecx1614; MCU-NEXT: negl %ecx1615; MCU-NEXT: andl %edx, %ecx1616; MCU-NEXT: orl %ecx, %eax1617; MCU-NEXT: retl1618entry:1619 %and = and i8 %cond, 11620 %cmp10 = icmp ne i8 %and, 11621 %0 = or i32 %B, %A1622 %1 = select i1 %cmp10, i32 %A, i32 %01623 ret i32 %11624}1625 1626define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {1627; CHECK-LABEL: select_or_1:1628; CHECK: ## %bb.0: ## %entry1629; CHECK-NEXT: movl %esi, %eax1630; CHECK-NEXT: orl %edi, %eax1631; CHECK-NEXT: testb $1, %dl1632; CHECK-NEXT: cmovel %edi, %eax1633; CHECK-NEXT: retq1634;1635; ATHLON-LABEL: select_or_1:1636; ATHLON: ## %bb.0: ## %entry1637; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1638; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1639; ATHLON-NEXT: orl %ecx, %eax1640; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1641; ATHLON-NEXT: cmovel %ecx, %eax1642; ATHLON-NEXT: retl1643;1644; MCU-LABEL: select_or_1:1645; MCU: # %bb.0: # %entry1646; MCU-NEXT: andl $1, %ecx1647; MCU-NEXT: negl %ecx1648; MCU-NEXT: andl %edx, %ecx1649; MCU-NEXT: orl %ecx, %eax1650; MCU-NEXT: retl1651entry:1652 %and = and i32 %cond, 11653 %cmp10 = icmp eq i32 %and, 01654 %0 = or i32 %B, %A1655 %1 = select i1 %cmp10, i32 %A, i32 %01656 ret i32 %11657}1658 1659; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1660; icmp eq (and %cond, 1), 01661define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {1662; CHECK-LABEL: select_or_1b:1663; CHECK: ## %bb.0: ## %entry1664; CHECK-NEXT: movl %esi, %eax1665; CHECK-NEXT: orl %edi, %eax1666; CHECK-NEXT: testb $1, %dl1667; CHECK-NEXT: cmovel %edi, %eax1668; CHECK-NEXT: retq1669;1670; ATHLON-LABEL: select_or_1b:1671; ATHLON: ## %bb.0: ## %entry1672; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1673; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1674; ATHLON-NEXT: orl %ecx, %eax1675; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1676; ATHLON-NEXT: cmovel %ecx, %eax1677; ATHLON-NEXT: retl1678;1679; MCU-LABEL: select_or_1b:1680; MCU: # %bb.0: # %entry1681; MCU-NEXT: andl $1, %ecx1682; MCU-NEXT: negl %ecx1683; MCU-NEXT: andl %edx, %ecx1684; MCU-NEXT: orl %ecx, %eax1685; MCU-NEXT: retl1686entry:1687 %and = and i32 %cond, 11688 %cmp10 = icmp ne i32 %and, 11689 %0 = or i32 %B, %A1690 %1 = select i1 %cmp10, i32 %A, i32 %01691 ret i32 %11692}1693 1694define i32 @select_add(i32 %A, i32 %B, i8 %cond) {1695; GENERIC-LABEL: select_add:1696; GENERIC: ## %bb.0: ## %entry1697; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi1698; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi1699; GENERIC-NEXT: leal (%rsi,%rdi), %eax1700; GENERIC-NEXT: testb $1, %dl1701; GENERIC-NEXT: cmovel %edi, %eax1702; GENERIC-NEXT: retq1703;1704; ATOM-LABEL: select_add:1705; ATOM: ## %bb.0: ## %entry1706; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi1707; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi1708; ATOM-NEXT: leal (%rsi,%rdi), %eax1709; ATOM-NEXT: testb $1, %dl1710; ATOM-NEXT: cmovel %edi, %eax1711; ATOM-NEXT: nop1712; ATOM-NEXT: nop1713; ATOM-NEXT: retq1714;1715; ATHLON-LABEL: select_add:1716; ATHLON: ## %bb.0: ## %entry1717; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1718; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1719; ATHLON-NEXT: addl %ecx, %eax1720; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1721; ATHLON-NEXT: cmovel %ecx, %eax1722; ATHLON-NEXT: retl1723;1724; MCU-LABEL: select_add:1725; MCU: # %bb.0: # %entry1726; MCU-NEXT: andl $1, %ecx1727; MCU-NEXT: negl %ecx1728; MCU-NEXT: andl %edx, %ecx1729; MCU-NEXT: addl %ecx, %eax1730; MCU-NEXT: retl1731entry:1732 %and = and i8 %cond, 11733 %cmp10 = icmp eq i8 %and, 01734 %0 = add i32 %B, %A1735 %1 = select i1 %cmp10, i32 %A, i32 %01736 ret i32 %11737}1738 1739; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1740; icmp eq (and %cond, 1), 01741define i32 @select_add_b(i32 %A, i32 %B, i8 %cond) {1742; GENERIC-LABEL: select_add_b:1743; GENERIC: ## %bb.0: ## %entry1744; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi1745; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi1746; GENERIC-NEXT: leal (%rsi,%rdi), %eax1747; GENERIC-NEXT: testb $1, %dl1748; GENERIC-NEXT: cmovel %edi, %eax1749; GENERIC-NEXT: retq1750;1751; ATOM-LABEL: select_add_b:1752; ATOM: ## %bb.0: ## %entry1753; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi1754; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi1755; ATOM-NEXT: leal (%rsi,%rdi), %eax1756; ATOM-NEXT: testb $1, %dl1757; ATOM-NEXT: cmovel %edi, %eax1758; ATOM-NEXT: nop1759; ATOM-NEXT: nop1760; ATOM-NEXT: retq1761;1762; ATHLON-LABEL: select_add_b:1763; ATHLON: ## %bb.0: ## %entry1764; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1765; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1766; ATHLON-NEXT: addl %ecx, %eax1767; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1768; ATHLON-NEXT: cmovel %ecx, %eax1769; ATHLON-NEXT: retl1770;1771; MCU-LABEL: select_add_b:1772; MCU: # %bb.0: # %entry1773; MCU-NEXT: andl $1, %ecx1774; MCU-NEXT: negl %ecx1775; MCU-NEXT: andl %edx, %ecx1776; MCU-NEXT: addl %ecx, %eax1777; MCU-NEXT: retl1778entry:1779 %and = and i8 %cond, 11780 %cmp10 = icmp ne i8 %and, 11781 %0 = add i32 %B, %A1782 %1 = select i1 %cmp10, i32 %A, i32 %01783 ret i32 %11784}1785 1786define i32 @select_add_1(i32 %A, i32 %B, i32 %cond) {1787; GENERIC-LABEL: select_add_1:1788; GENERIC: ## %bb.0: ## %entry1789; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi1790; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi1791; GENERIC-NEXT: leal (%rsi,%rdi), %eax1792; GENERIC-NEXT: testb $1, %dl1793; GENERIC-NEXT: cmovel %edi, %eax1794; GENERIC-NEXT: retq1795;1796; ATOM-LABEL: select_add_1:1797; ATOM: ## %bb.0: ## %entry1798; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi1799; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi1800; ATOM-NEXT: leal (%rsi,%rdi), %eax1801; ATOM-NEXT: testb $1, %dl1802; ATOM-NEXT: cmovel %edi, %eax1803; ATOM-NEXT: nop1804; ATOM-NEXT: nop1805; ATOM-NEXT: retq1806;1807; ATHLON-LABEL: select_add_1:1808; ATHLON: ## %bb.0: ## %entry1809; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1810; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1811; ATHLON-NEXT: addl %ecx, %eax1812; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1813; ATHLON-NEXT: cmovel %ecx, %eax1814; ATHLON-NEXT: retl1815;1816; MCU-LABEL: select_add_1:1817; MCU: # %bb.0: # %entry1818; MCU-NEXT: andl $1, %ecx1819; MCU-NEXT: negl %ecx1820; MCU-NEXT: andl %edx, %ecx1821; MCU-NEXT: addl %ecx, %eax1822; MCU-NEXT: retl1823entry:1824 %and = and i32 %cond, 11825 %cmp10 = icmp eq i32 %and, 01826 %0 = add i32 %B, %A1827 %1 = select i1 %cmp10, i32 %A, i32 %01828 ret i32 %11829}1830 1831; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1832; icmp eq (and %cond, 1), 01833define i32 @select_add_1b(i32 %A, i32 %B, i32 %cond) {1834; GENERIC-LABEL: select_add_1b:1835; GENERIC: ## %bb.0: ## %entry1836; GENERIC-NEXT: ## kill: def $esi killed $esi def $rsi1837; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi1838; GENERIC-NEXT: leal (%rsi,%rdi), %eax1839; GENERIC-NEXT: testb $1, %dl1840; GENERIC-NEXT: cmovel %edi, %eax1841; GENERIC-NEXT: retq1842;1843; ATOM-LABEL: select_add_1b:1844; ATOM: ## %bb.0: ## %entry1845; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi1846; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi1847; ATOM-NEXT: leal (%rsi,%rdi), %eax1848; ATOM-NEXT: testb $1, %dl1849; ATOM-NEXT: cmovel %edi, %eax1850; ATOM-NEXT: nop1851; ATOM-NEXT: nop1852; ATOM-NEXT: retq1853;1854; ATHLON-LABEL: select_add_1b:1855; ATHLON: ## %bb.0: ## %entry1856; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1857; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax1858; ATHLON-NEXT: addl %ecx, %eax1859; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1860; ATHLON-NEXT: cmovel %ecx, %eax1861; ATHLON-NEXT: retl1862;1863; MCU-LABEL: select_add_1b:1864; MCU: # %bb.0: # %entry1865; MCU-NEXT: andl $1, %ecx1866; MCU-NEXT: negl %ecx1867; MCU-NEXT: andl %edx, %ecx1868; MCU-NEXT: addl %ecx, %eax1869; MCU-NEXT: retl1870entry:1871 %and = and i32 %cond, 11872 %cmp10 = icmp ne i32 %and, 11873 %0 = add i32 %B, %A1874 %1 = select i1 %cmp10, i32 %A, i32 %01875 ret i32 %11876}1877 1878define i32 @select_sub(i32 %A, i32 %B, i8 %cond) {1879; CHECK-LABEL: select_sub:1880; CHECK: ## %bb.0: ## %entry1881; CHECK-NEXT: movl %esi, %eax1882; CHECK-NEXT: subl %edi, %eax1883; CHECK-NEXT: testb $1, %dl1884; CHECK-NEXT: cmovel %esi, %eax1885; CHECK-NEXT: retq1886;1887; ATHLON-LABEL: select_sub:1888; ATHLON: ## %bb.0: ## %entry1889; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1890; ATHLON-NEXT: movl %ecx, %eax1891; ATHLON-NEXT: subl {{[0-9]+}}(%esp), %eax1892; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1893; ATHLON-NEXT: cmovel %ecx, %eax1894; ATHLON-NEXT: retl1895;1896; MCU-LABEL: select_sub:1897; MCU: # %bb.0: # %entry1898; MCU-NEXT: andl $1, %ecx1899; MCU-NEXT: negl %ecx1900; MCU-NEXT: andl %eax, %ecx1901; MCU-NEXT: subl %ecx, %edx1902; MCU-NEXT: movl %edx, %eax1903; MCU-NEXT: retl1904entry:1905 %and = and i8 %cond, 11906 %cmp10 = icmp eq i8 %and, 01907 %0 = sub i32 %B, %A1908 %1 = select i1 %cmp10, i32 %B, i32 %01909 ret i32 %11910}1911 1912; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1913; icmp eq (and %cond, 1), 01914define i32 @select_sub_b(i32 %A, i32 %B, i8 %cond) {1915; CHECK-LABEL: select_sub_b:1916; CHECK: ## %bb.0: ## %entry1917; CHECK-NEXT: movl %esi, %eax1918; CHECK-NEXT: subl %edi, %eax1919; CHECK-NEXT: testb $1, %dl1920; CHECK-NEXT: cmovel %esi, %eax1921; CHECK-NEXT: retq1922;1923; ATHLON-LABEL: select_sub_b:1924; ATHLON: ## %bb.0: ## %entry1925; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1926; ATHLON-NEXT: movl %ecx, %eax1927; ATHLON-NEXT: subl {{[0-9]+}}(%esp), %eax1928; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1929; ATHLON-NEXT: cmovel %ecx, %eax1930; ATHLON-NEXT: retl1931;1932; MCU-LABEL: select_sub_b:1933; MCU: # %bb.0: # %entry1934; MCU-NEXT: andl $1, %ecx1935; MCU-NEXT: negl %ecx1936; MCU-NEXT: andl %eax, %ecx1937; MCU-NEXT: subl %ecx, %edx1938; MCU-NEXT: movl %edx, %eax1939; MCU-NEXT: retl1940entry:1941 %and = and i8 %cond, 11942 %cmp10 = icmp ne i8 %and, 11943 %0 = sub i32 %B, %A1944 %1 = select i1 %cmp10, i32 %B, i32 %01945 ret i32 %11946}1947 1948define i32 @select_sub_1(i32 %A, i32 %B, i32 %cond) {1949; CHECK-LABEL: select_sub_1:1950; CHECK: ## %bb.0: ## %entry1951; CHECK-NEXT: movl %esi, %eax1952; CHECK-NEXT: subl %edi, %eax1953; CHECK-NEXT: testb $1, %dl1954; CHECK-NEXT: cmovel %esi, %eax1955; CHECK-NEXT: retq1956;1957; ATHLON-LABEL: select_sub_1:1958; ATHLON: ## %bb.0: ## %entry1959; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1960; ATHLON-NEXT: movl %ecx, %eax1961; ATHLON-NEXT: subl {{[0-9]+}}(%esp), %eax1962; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1963; ATHLON-NEXT: cmovel %ecx, %eax1964; ATHLON-NEXT: retl1965;1966; MCU-LABEL: select_sub_1:1967; MCU: # %bb.0: # %entry1968; MCU-NEXT: andl $1, %ecx1969; MCU-NEXT: negl %ecx1970; MCU-NEXT: andl %eax, %ecx1971; MCU-NEXT: subl %ecx, %edx1972; MCU-NEXT: movl %edx, %eax1973; MCU-NEXT: retl1974entry:1975 %and = and i32 %cond, 11976 %cmp10 = icmp eq i32 %and, 01977 %0 = sub i32 %B, %A1978 %1 = select i1 %cmp10, i32 %B, i32 %01979 ret i32 %11980}1981 1982; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of1983; icmp eq (and %cond, 1), 01984define i32 @select_sub_1b(i32 %A, i32 %B, i32 %cond) {1985; CHECK-LABEL: select_sub_1b:1986; CHECK: ## %bb.0: ## %entry1987; CHECK-NEXT: movl %esi, %eax1988; CHECK-NEXT: subl %edi, %eax1989; CHECK-NEXT: testb $1, %dl1990; CHECK-NEXT: cmovel %esi, %eax1991; CHECK-NEXT: retq1992;1993; ATHLON-LABEL: select_sub_1b:1994; ATHLON: ## %bb.0: ## %entry1995; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx1996; ATHLON-NEXT: movl %ecx, %eax1997; ATHLON-NEXT: subl {{[0-9]+}}(%esp), %eax1998; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)1999; ATHLON-NEXT: cmovel %ecx, %eax2000; ATHLON-NEXT: retl2001;2002; MCU-LABEL: select_sub_1b:2003; MCU: # %bb.0: # %entry2004; MCU-NEXT: andl $1, %ecx2005; MCU-NEXT: negl %ecx2006; MCU-NEXT: andl %eax, %ecx2007; MCU-NEXT: subl %ecx, %edx2008; MCU-NEXT: movl %edx, %eax2009; MCU-NEXT: retl2010entry:2011 %and = and i32 %cond, 12012 %cmp10 = icmp ne i32 %and, 12013 %0 = sub i32 %B, %A2014 %1 = select i1 %cmp10, i32 %B, i32 %02015 ret i32 %12016}2017 2018; Negative case - incorrect subtract operand2019define i32 @select_sub_neg(i32 %A, i32 %B, i8 %cond) {2020; CHECK-LABEL: select_sub_neg:2021; CHECK: ## %bb.0: ## %entry2022; CHECK-NEXT: movl %esi, %eax2023; CHECK-NEXT: subl %edi, %eax2024; CHECK-NEXT: testb $1, %dl2025; CHECK-NEXT: cmovel %edi, %eax2026; CHECK-NEXT: retq2027;2028; ATHLON-LABEL: select_sub_neg:2029; ATHLON: ## %bb.0: ## %entry2030; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx2031; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax2032; ATHLON-NEXT: subl %ecx, %eax2033; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)2034; ATHLON-NEXT: cmovel %ecx, %eax2035; ATHLON-NEXT: retl2036;2037; MCU-LABEL: select_sub_neg:2038; MCU: # %bb.0: # %entry2039; MCU-NEXT: testb $1, %cl2040; MCU-NEXT: je .LBB44_22041; MCU-NEXT: # %bb.1: # %entry2042; MCU-NEXT: subl %eax, %edx2043; MCU-NEXT: movl %edx, %eax2044; MCU-NEXT: .LBB44_2: # %entry2045; MCU-NEXT: retl2046entry:2047 %and = and i8 %cond, 12048 %cmp10 = icmp eq i8 %and, 02049 %0 = sub i32 %B, %A2050 %1 = select i1 %cmp10, i32 %A, i32 %02051 ret i32 %12052}2053 2054define i64 @PR51612(i64 %x, i64 %y) {2055; CHECK-LABEL: PR51612:2056; CHECK: ## %bb.0:2057; CHECK-NEXT: leal 1(%rsi), %eax2058; CHECK-NEXT: incq %rdi2059; CHECK-NEXT: cmovnel %edi, %eax2060; CHECK-NEXT: andl 10, %eax2061; CHECK-NEXT: retq2062;2063; ATHLON-LABEL: PR51612:2064; ATHLON: ## %bb.0:2065; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax2066; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx2067; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %edx2068; ATHLON-NEXT: incl %edx2069; ATHLON-NEXT: addl $1, %eax2070; ATHLON-NEXT: adcl $0, %ecx2071; ATHLON-NEXT: cmovbl %edx, %eax2072; ATHLON-NEXT: andl 10, %eax2073; ATHLON-NEXT: xorl %edx, %edx2074; ATHLON-NEXT: retl2075;2076; MCU-LABEL: PR51612:2077; MCU: # %bb.0:2078; MCU-NEXT: addl $1, %eax2079; MCU-NEXT: adcl $0, %edx2080; MCU-NEXT: jae .LBB45_22081; MCU-NEXT: # %bb.1:2082; MCU-NEXT: movl {{[0-9]+}}(%esp), %eax2083; MCU-NEXT: incl %eax2084; MCU-NEXT: .LBB45_2:2085; MCU-NEXT: andl 10, %eax2086; MCU-NEXT: xorl %edx, %edx2087; MCU-NEXT: retl2088 %add = add i64 %x, 12089 %inc = add i64 %y, 12090 %tobool = icmp eq i64 %add, 02091 %sel = select i1 %tobool, i64 %inc, i64 %add2092 %i = load i32, ptr inttoptr (i32 10 to ptr), align 42093 %conv = zext i32 %i to i642094 %and = and i64 %sel, %conv2095 ret i64 %and2096}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 readnone2101declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone2102 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 $rsi2107; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi2108; GENERIC-NEXT: testb $1, %cl2109; GENERIC-NEXT: cmovel %edx, %esi2110; GENERIC-NEXT: leal (%rsi,%rdi), %eax2111; GENERIC-NEXT: ## kill: def $al killed $al killed $eax2112; GENERIC-NEXT: retq2113;2114; ATOM-LABEL: select_uaddo_common_op0:2115; ATOM: ## %bb.0:2116; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi2117; ATOM-NEXT: testb $1, %cl2118; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi2119; ATOM-NEXT: cmovel %edx, %esi2120; ATOM-NEXT: leal (%rsi,%rdi), %eax2121; ATOM-NEXT: ## kill: def $al killed $al killed $eax2122; ATOM-NEXT: nop2123; ATOM-NEXT: nop2124; ATOM-NEXT: retq2125;2126; ATHLON-LABEL: select_uaddo_common_op0:2127; ATHLON: ## %bb.0:2128; ATHLON-NEXT: movzbl {{[0-9]+}}(%esp), %eax2129; ATHLON-NEXT: testb $1, {{[0-9]+}}(%esp)2130; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx2131; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %edx2132; ATHLON-NEXT: cmovnel %ecx, %edx2133; ATHLON-NEXT: addb (%edx), %al2134; ATHLON-NEXT: retl2135;2136; MCU-LABEL: select_uaddo_common_op0:2137; MCU: # %bb.0:2138; MCU-NEXT: testb $1, {{[0-9]+}}(%esp)2139; MCU-NEXT: jne .LBB46_22140; MCU-NEXT: # %bb.1:2141; MCU-NEXT: movl %ecx, %edx2142; MCU-NEXT: .LBB46_2:2143; MCU-NEXT: addb %dl, %al2144; MCU-NEXT: # kill: def $al killed $al killed $eax2145; MCU-NEXT: retl2146 %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, 02149 %ac0 = extractvalue { i8, i1 } %ac, 02150 %sel = select i1 %cond, i8 %ab0, i8 %ac02151 ret i8 %sel2152}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 $rsi2158; GENERIC-NEXT: ## kill: def $edi killed $edi def $rdi2159; GENERIC-NEXT: testb $1, %cl2160; GENERIC-NEXT: cmovel %edx, %edi2161; GENERIC-NEXT: leal (%rdi,%rsi), %eax2162; GENERIC-NEXT: retq2163;2164; ATOM-LABEL: select_uaddo_common_op1:2165; ATOM: ## %bb.0:2166; ATOM-NEXT: ## kill: def $edi killed $edi def $rdi2167; ATOM-NEXT: testb $1, %cl2168; ATOM-NEXT: ## kill: def $esi killed $esi def $rsi2169; ATOM-NEXT: cmovel %edx, %edi2170; ATOM-NEXT: leal (%rdi,%rsi), %eax2171; ATOM-NEXT: nop2172; ATOM-NEXT: nop2173; ATOM-NEXT: retq2174;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), %eax2179; ATHLON-NEXT: leal {{[0-9]+}}(%esp), %ecx2180; ATHLON-NEXT: cmovnel %eax, %ecx2181; ATHLON-NEXT: movl (%ecx), %eax2182; ATHLON-NEXT: addl {{[0-9]+}}(%esp), %eax2183; ATHLON-NEXT: retl2184;2185; MCU-LABEL: select_uaddo_common_op1:2186; MCU: # %bb.0:2187; MCU-NEXT: testb $1, {{[0-9]+}}(%esp)2188; MCU-NEXT: jne .LBB47_22189; MCU-NEXT: # %bb.1:2190; MCU-NEXT: movl %ecx, %eax2191; MCU-NEXT: .LBB47_2:2192; MCU-NEXT: addl %edx, %eax2193; MCU-NEXT: retl2194 %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, 02197 %cb0 = extractvalue { i32, i1 } %cb, 02198 %sel = select i1 %cond, i32 %ab0, i32 %cb02199 ret i32 %sel2200}2201