1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-apple-darwin10 -disable-cgp-select2branch | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %x, i32 %n, i32 %w, i32* %vp) nounwind readnone { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 7*9880d681SAndroid Build Coastguard Worker; CHECK: btl 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $12, %eax 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovael (%rcx), %eax 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %x, %n ; <i32> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 1 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker %toBool = icmp eq i32 %1, 0 ; <i1> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %vp 16*9880d681SAndroid Build Coastguard Worker %.0 = select i1 %toBool, i32 %v, i32 12 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker ret i32 %.0 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %x, i32 %n, i32 %w, i32* %vp) nounwind readnone { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 22*9880d681SAndroid Build Coastguard Worker; CHECK: btl 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $12, %eax 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovbl (%rcx), %eax 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %x, %n ; <i32> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 1 ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %toBool = icmp eq i32 %1, 0 ; <i1> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %vp 31*9880d681SAndroid Build Coastguard Worker %.0 = select i1 %toBool, i32 12, i32 %v ; <i32> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker ret i32 %.0 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; x86's 32-bit cmov doesn't clobber the high 32 bits of the destination 37*9880d681SAndroid Build Coastguard Worker; if the condition is false. An explicit zero-extend (movl) is needed 38*9880d681SAndroid Build Coastguard Worker; after the cmov. 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdeclare void @bar(i64) nounwind 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine void @test3(i64 %a, i64 %b, i1 %p) nounwind { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 44*9880d681SAndroid Build Coastguard Worker; CHECK: cmov{{n?}}el %[[R1:e..]], %[[R2:e..]] 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %[[R2]], %{{e..}} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker %c = trunc i64 %a to i32 48*9880d681SAndroid Build Coastguard Worker %d = trunc i64 %b to i32 49*9880d681SAndroid Build Coastguard Worker %e = select i1 %p, i32 %c, i32 %d 50*9880d681SAndroid Build Coastguard Worker %f = zext i32 %e to i64 51*9880d681SAndroid Build Coastguard Worker call void @bar(i64 %f) 52*9880d681SAndroid Build Coastguard Worker ret void 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CodeGen shouldn't try to do a setne after an expanded 8-bit conditional 58*9880d681SAndroid Build Coastguard Worker; move without recomputing EFLAGS, because the expansion of the conditional 59*9880d681SAndroid Build Coastguard Worker; move with control flow may clobber EFLAGS (e.g., with xor, to set the 60*9880d681SAndroid Build Coastguard Worker; register to zero). 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; The test is a little awkward; the important part is that there's a test before the 63*9880d681SAndroid Build Coastguard Worker; setne. 64*9880d681SAndroid Build Coastguard Worker; PR4814 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker@g_3 = external global i8 ; <i8*> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker@g_96 = external global i8 ; <i8*> [#uses=2] 69*9880d681SAndroid Build Coastguard Worker@g_100 = external global i8 ; <i8*> [#uses=2] 70*9880d681SAndroid Build Coastguard Worker@_2E_str = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @test4() nounwind { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* @g_3, align 1 ; <i8> [#uses=2] 75*9880d681SAndroid Build Coastguard Worker %1 = sext i8 %0 to i32 ; <i32> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker %.lobit.i = lshr i8 %0, 7 ; <i8> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker %tmp.i = zext i8 %.lobit.i to i32 ; <i32> [#uses=1] 78*9880d681SAndroid Build Coastguard Worker %tmp.not.i = xor i32 %tmp.i, 1 ; <i32> [#uses=1] 79*9880d681SAndroid Build Coastguard Worker %iftmp.17.0.i.i = ashr i32 %1, %tmp.not.i ; <i32> [#uses=1] 80*9880d681SAndroid Build Coastguard Worker %retval56.i.i = trunc i32 %iftmp.17.0.i.i to i8 ; <i8> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i8 %retval56.i.i, 0 ; <i1> [#uses=2] 82*9880d681SAndroid Build Coastguard Worker %g_96.promoted.i = load i8, i8* @g_96 ; <i8> [#uses=3] 83*9880d681SAndroid Build Coastguard Worker %3 = icmp eq i8 %g_96.promoted.i, 0 ; <i1> [#uses=2] 84*9880d681SAndroid Build Coastguard Worker br i1 %3, label %func_4.exit.i, label %bb.i.i.i 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerbb.i.i.i: ; preds = %entry 87*9880d681SAndroid Build Coastguard Worker %4 = load volatile i8, i8* @g_100, align 1 ; <i8> [#uses=0] 88*9880d681SAndroid Build Coastguard Worker br label %func_4.exit.i 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 91*9880d681SAndroid Build Coastguard Worker; CHECK: g_100 92*9880d681SAndroid Build Coastguard Worker; CHECK: testb 93*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xor 94*9880d681SAndroid Build Coastguard Worker; CHECK: setne 95*9880d681SAndroid Build Coastguard Worker; CHECK: testb 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerfunc_4.exit.i: ; preds = %bb.i.i.i, %entry 98*9880d681SAndroid Build Coastguard Worker %.not.i = xor i1 %2, true ; <i1> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker %brmerge.i = or i1 %3, %.not.i ; <i1> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker %.mux.i = select i1 %2, i8 %g_96.promoted.i, i8 0 ; <i8> [#uses=1] 101*9880d681SAndroid Build Coastguard Worker br i1 %brmerge.i, label %func_1.exit, label %bb.i.i 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerbb.i.i: ; preds = %func_4.exit.i 104*9880d681SAndroid Build Coastguard Worker %5 = load volatile i8, i8* @g_100, align 1 ; <i8> [#uses=0] 105*9880d681SAndroid Build Coastguard Worker br label %func_1.exit 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerfunc_1.exit: ; preds = %bb.i.i, %func_4.exit.i 108*9880d681SAndroid Build Coastguard Worker %g_96.tmp.0.i = phi i8 [ %g_96.promoted.i, %bb.i.i ], [ %.mux.i, %func_4.exit.i ] ; <i8> [#uses=2] 109*9880d681SAndroid Build Coastguard Worker store i8 %g_96.tmp.0.i, i8* @g_96 110*9880d681SAndroid Build Coastguard Worker %6 = zext i8 %g_96.tmp.0.i to i32 ; <i32> [#uses=1] 111*9880d681SAndroid Build Coastguard Worker %7 = tail call i32 (i8*, ...) @printf(i8* noalias getelementptr ([15 x i8], [15 x i8]* @_2E_str, i64 0, i64 0), i32 %6) nounwind ; <i32> [#uses=0] 112*9880d681SAndroid Build Coastguard Worker ret i32 0 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(i8* nocapture, ...) nounwind 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Should compile to setcc | -2. 119*9880d681SAndroid Build Coastguard Worker; rdar://6668608 120*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32* nocapture %P) nounwind readonly { 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 123*9880d681SAndroid Build Coastguard Worker; CHECK: xorl %eax, %eax 124*9880d681SAndroid Build Coastguard Worker; CHECK: setg %al 125*9880d681SAndroid Build Coastguard Worker; CHECK: orl $-2, %eax 126*9880d681SAndroid Build Coastguard Worker; CHECK: ret 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P, align 4 ; <i32> [#uses=1] 129*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %0, 41 ; <i1> [#uses=1] 130*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %1, i32 -1, i32 -2 ; <i32> [#uses=1] 131*9880d681SAndroid Build Coastguard Worker ret i32 %iftmp.0.0 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32* nocapture %P) nounwind readonly { 135*9880d681SAndroid Build Coastguard Workerentry: 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 137*9880d681SAndroid Build Coastguard Worker; CHECK: xorl %eax, %eax 138*9880d681SAndroid Build Coastguard Worker; CHECK: setl %al 139*9880d681SAndroid Build Coastguard Worker; CHECK: leal 4(%rax,%rax,8), %eax 140*9880d681SAndroid Build Coastguard Worker; CHECK: ret 141*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P, align 4 ; <i32> [#uses=1] 142*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %0, 41 ; <i1> [#uses=1] 143*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %1, i32 4, i32 13 ; <i32> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker ret i32 %iftmp.0.0 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; Don't try to use a 16-bit conditional move to do an 8-bit select, 149*9880d681SAndroid Build Coastguard Worker; because it isn't worth it. Just use a branch instead. 150*9880d681SAndroid Build Coastguard Workerdefine i8 @test7(i1 inreg %c, i8 inreg %a, i8 inreg %b) nounwind { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 152*9880d681SAndroid Build Coastguard Worker; CHECK: testb $1, %dil 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne LBB 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker %d = select i1 %c, i8 %a, i8 %b 156*9880d681SAndroid Build Coastguard Worker ret i8 %d 157*9880d681SAndroid Build Coastguard Worker} 158