brintos

brintos / llvm-project-archived public Read only

0
0
Text · 63.7 KiB · 4e31b48 Raw
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