1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=generic | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom | FileCheck -check-prefix=ATOM %s 3*9880d681SAndroid Build Coastguard Worker; PR5757 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%0 = type { i64, i32 } 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(%0* %p, %0* %q, i1 %r) nounwind { 8*9880d681SAndroid Build Coastguard Worker %t0 = load %0, %0* %p 9*9880d681SAndroid Build Coastguard Worker %t1 = load %0, %0* %q 10*9880d681SAndroid Build Coastguard Worker %t4 = select i1 %r, %0 %t0, %0 %t1 11*9880d681SAndroid Build Coastguard Worker %t5 = extractvalue %0 %t4, 1 12*9880d681SAndroid Build Coastguard Worker ret i32 %t5 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 14*9880d681SAndroid Build Coastguard Worker; CHECK: cmovneq %rdi, %rsi 15*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rsi), %eax 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test1: 18*9880d681SAndroid Build Coastguard Worker; ATOM: cmovneq %rdi, %rsi 19*9880d681SAndroid Build Coastguard Worker; ATOM: movl (%rsi), %eax 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; PR2139 24*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() nounwind { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker %tmp73 = tail call i1 @return_false() ; <i8> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %g.0 = select i1 %tmp73, i16 0, i16 -480 ; <i16> [#uses=2] 28*9880d681SAndroid Build Coastguard Worker %tmp7778 = sext i16 %g.0 to i32 ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %tmp80 = shl i32 %tmp7778, 3 ; <i32> [#uses=2] 30*9880d681SAndroid Build Coastguard Worker %tmp87 = icmp sgt i32 %tmp80, 32767 ; <i1> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker br i1 %tmp87, label %bb90, label %bb91 32*9880d681SAndroid Build Coastguard Workerbb90: ; preds = %bb84, %bb72 33*9880d681SAndroid Build Coastguard Worker unreachable 34*9880d681SAndroid Build Coastguard Workerbb91: ; preds = %bb84 35*9880d681SAndroid Build Coastguard Worker ret i32 0 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 37*9880d681SAndroid Build Coastguard Worker; CHECK: cmovnew 38*9880d681SAndroid Build Coastguard Worker; CHECK: cwtl 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test2: 41*9880d681SAndroid Build Coastguard Worker; ATOM: cmovnew 42*9880d681SAndroid Build Coastguard Worker; ATOM: cwtl 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdeclare i1 @return_false() 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker;; Select between two floating point constants. 49*9880d681SAndroid Build Coastguard Workerdefine float @test3(i32 %x) nounwind readnone { 50*9880d681SAndroid Build Coastguard Workerentry: 51*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %x, 0 ; <i1> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01 ; <float> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker ret float %iftmp.0.0 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 55*9880d681SAndroid Build Coastguard Worker; CHECK: movss {{.*}},4), %xmm0 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test3: 58*9880d681SAndroid Build Coastguard Worker; ATOM: movss {{.*}},4), %xmm0 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker %0 = fcmp olt double %F, 4.200000e+01 ; <i1> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %iftmp.0.0 = select i1 %0, i32 4, i32 0 ; <i32> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker %1 = getelementptr i8, i8* %P, i32 %iftmp.0.0 ; <i8*> [#uses=1] 66*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %1, align 1 ; <i8> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker ret i8 %2 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 69*9880d681SAndroid Build Coastguard Worker; CHECK: movsbl ({{.*}},4), %eax 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test4: 72*9880d681SAndroid Build Coastguard Worker; ATOM: movsbl ({{.*}},4), %eax 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind { 76*9880d681SAndroid Build Coastguard Worker %x = select i1 %c, <2 x i16> %a, <2 x i16> %b 77*9880d681SAndroid Build Coastguard Worker store <2 x i16> %x, <2 x i16>* %p 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test5: 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind { 85*9880d681SAndroid Build Coastguard Worker %tmp = load <4 x float>, <4 x float>* %A ; <<4 x float>> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %tmp3 = load <4 x float>, <4 x float>* %B ; <<4 x float>> [#uses=2] 87*9880d681SAndroid Build Coastguard Worker %tmp9 = fmul <4 x float> %tmp3, %tmp3 ; <<4 x float>> [#uses=1] 88*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.1 = icmp eq i32 %C, 0 ; <i1> [#uses=1] 89*9880d681SAndroid Build Coastguard Worker %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp ; <<4 x float>> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker store <4 x float> %iftmp.38.0, <4 x float>* %A 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker; Verify that the fmul gets sunk into the one part of the diamond where it is 93*9880d681SAndroid Build Coastguard Worker; needed. 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 95*9880d681SAndroid Build Coastguard Worker; CHECK: je 96*9880d681SAndroid Build Coastguard Worker; CHECK: ret 97*9880d681SAndroid Build Coastguard Worker; CHECK: mulps 98*9880d681SAndroid Build Coastguard Worker; CHECK: ret 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test6: 101*9880d681SAndroid Build Coastguard Worker; ATOM: je 102*9880d681SAndroid Build Coastguard Worker; ATOM: ret 103*9880d681SAndroid Build Coastguard Worker; ATOM: mulps 104*9880d681SAndroid Build Coastguard Worker; ATOM: ret 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; Select with fp80's 108*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @test7(i32 %tmp8) nounwind { 109*9880d681SAndroid Build Coastguard Worker %tmp9 = icmp sgt i32 %tmp8, -1 ; <i1> [#uses=1] 110*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000 111*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %retval 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 113*9880d681SAndroid Build Coastguard Worker; CHECK: leaq 114*9880d681SAndroid Build Coastguard Worker; CHECK: fldt (%r{{.}}x,%r{{.}}x) 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test7: 117*9880d681SAndroid Build Coastguard Worker; ATOM: leaq 118*9880d681SAndroid Build Coastguard Worker; ATOM: fldt (%r{{.}}x,%r{{.}}x) 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; widening select v6i32 and then a sub 122*9880d681SAndroid Build Coastguard Workerdefine void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind { 123*9880d681SAndroid Build Coastguard Worker %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2 124*9880d681SAndroid Build Coastguard Worker %val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 125*9880d681SAndroid Build Coastguard Worker store <6 x i32> %val, <6 x i32>* %dst.addr 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test8: 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker;; Test integer select between values and constants. 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone { 137*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i64 %x, 0 138*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i64 %y, i64 -1 139*9880d681SAndroid Build Coastguard Worker ret i64 %cond 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 141*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 142*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 143*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 144*9880d681SAndroid Build Coastguard Worker; CHECK: ret 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9: 147*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 148*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 149*9880d681SAndroid Build Coastguard Worker; ATOM: orq %rsi, %rax 150*9880d681SAndroid Build Coastguard Worker; ATOM: ret 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker;; Same as test9 154*9880d681SAndroid Build Coastguard Workerdefine i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 155*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %x, 0 156*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i64 -1, i64 %y 157*9880d681SAndroid Build Coastguard Worker ret i64 %cond 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9a: 159*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 160*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 161*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 162*9880d681SAndroid Build Coastguard Worker; CHECK: ret 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9a: 165*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 166*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 167*9880d681SAndroid Build Coastguard Worker; ATOM: orq %rsi, %rax 168*9880d681SAndroid Build Coastguard Worker; ATOM: ret 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone { 172*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %x, 0 173*9880d681SAndroid Build Coastguard Worker %A = sext i1 %cmp to i64 174*9880d681SAndroid Build Coastguard Worker %cond = or i64 %y, %A 175*9880d681SAndroid Build Coastguard Worker ret i64 %cond 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9b: 177*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 178*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 179*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 180*9880d681SAndroid Build Coastguard Worker; CHECK: ret 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9b: 183*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 184*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 185*9880d681SAndroid Build Coastguard Worker; ATOM: orq %rsi, %rax 186*9880d681SAndroid Build Coastguard Worker; ATOM: ret 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker;; Select between -1 and 1. 190*9880d681SAndroid Build Coastguard Workerdefine i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone { 191*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %x, 0 192*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i64 -1, i64 1 193*9880d681SAndroid Build Coastguard Worker ret i64 %cond 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 195*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 196*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 197*9880d681SAndroid Build Coastguard Worker; CHECK: orq $1, %rax 198*9880d681SAndroid Build Coastguard Worker; CHECK: ret 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test10: 201*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 202*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 203*9880d681SAndroid Build Coastguard Worker; ATOM: orq $1, %rax 204*9880d681SAndroid Build Coastguard Worker; ATOM: ret 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone { 210*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %x, 0 211*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i64 %y, i64 -1 212*9880d681SAndroid Build Coastguard Worker ret i64 %cond 213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 214*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 215*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 216*9880d681SAndroid Build Coastguard Worker; CHECK: notq %rax 217*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 218*9880d681SAndroid Build Coastguard Worker; CHECK: ret 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test11: 221*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 222*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 223*9880d681SAndroid Build Coastguard Worker; ATOM: notq %rax 224*9880d681SAndroid Build Coastguard Worker; ATOM: orq %rsi, %rax 225*9880d681SAndroid Build Coastguard Worker; ATOM: ret 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Workerdefine i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone { 229*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i64 %x, 0 230*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i64 -1, i64 %y 231*9880d681SAndroid Build Coastguard Worker ret i64 %cond 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11a: 233*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq $1, %rdi 234*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq %rax, %rax 235*9880d681SAndroid Build Coastguard Worker; CHECK: notq %rax 236*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 237*9880d681SAndroid Build Coastguard Worker; CHECK: ret 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test11a: 240*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq $1, %rdi 241*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq %rax, %rax 242*9880d681SAndroid Build Coastguard Worker; ATOM: notq %rax 243*9880d681SAndroid Build Coastguard Worker; ATOM: orq %rsi, %rax 244*9880d681SAndroid Build Coastguard Worker; ATOM: ret 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znam(i64) noredzone 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdefine noalias i8* @test12(i64 %count) nounwind ssp noredzone { 251*9880d681SAndroid Build Coastguard Workerentry: 252*9880d681SAndroid Build Coastguard Worker %A = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %count, i64 4) 253*9880d681SAndroid Build Coastguard Worker %B = extractvalue { i64, i1 } %A, 1 254*9880d681SAndroid Build Coastguard Worker %C = extractvalue { i64, i1 } %A, 0 255*9880d681SAndroid Build Coastguard Worker %D = select i1 %B, i64 -1, i64 %C 256*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_Znam(i64 %D) nounwind noredzone 257*9880d681SAndroid Build Coastguard Worker ret i8* %call 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 259*9880d681SAndroid Build Coastguard Worker; CHECK: mulq 260*9880d681SAndroid Build Coastguard Worker; CHECK: movq $-1, %[[R:r..]] 261*9880d681SAndroid Build Coastguard Worker; CHECK: cmovnoq %rax, %[[R]] 262*9880d681SAndroid Build Coastguard Worker; CHECK: jmp __Znam 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test12: 265*9880d681SAndroid Build Coastguard Worker; ATOM: mulq 266*9880d681SAndroid Build Coastguard Worker; ATOM: movq $-1, %rdi 267*9880d681SAndroid Build Coastguard Worker; ATOM: cmovnoq %rax, %rdi 268*9880d681SAndroid Build Coastguard Worker; ATOM: jmp __Znam 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdeclare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %a, i32 %b) nounwind { 274*9880d681SAndroid Build Coastguard Worker %c = icmp ult i32 %a, %b 275*9880d681SAndroid Build Coastguard Worker %d = sext i1 %c to i32 276*9880d681SAndroid Build Coastguard Worker ret i32 %d 277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 278*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl 279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbl 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test13: 283*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl 284*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: sbbl 285*9880d681SAndroid Build Coastguard Worker; ATOM: ret 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %a, i32 %b) nounwind { 289*9880d681SAndroid Build Coastguard Worker %c = icmp uge i32 %a, %b 290*9880d681SAndroid Build Coastguard Worker %d = sext i1 %c to i32 291*9880d681SAndroid Build Coastguard Worker ret i32 %d 292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14: 293*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbl 295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: notl 296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test14: 299*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl 300*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: sbbl 301*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: notl 302*9880d681SAndroid Build Coastguard Worker; ATOM: ret 303*9880d681SAndroid Build Coastguard Worker} 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker; rdar://10961709 306*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %x) nounwind { 307*9880d681SAndroid Build Coastguard Workerentry: 308*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %x, 0 309*9880d681SAndroid Build Coastguard Worker %sub = sext i1 %cmp to i32 310*9880d681SAndroid Build Coastguard Worker ret i32 %sub 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15: 312*9880d681SAndroid Build Coastguard Worker; CHECK: negl 313*9880d681SAndroid Build Coastguard Worker; CHECK: sbbl 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test15: 316*9880d681SAndroid Build Coastguard Worker; ATOM: negl 317*9880d681SAndroid Build Coastguard Worker; ATOM: sbbl 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerdefine i64 @test16(i64 %x) nounwind uwtable readnone ssp { 321*9880d681SAndroid Build Coastguard Workerentry: 322*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i64 %x, 0 323*9880d681SAndroid Build Coastguard Worker %conv1 = sext i1 %cmp to i64 324*9880d681SAndroid Build Coastguard Worker ret i64 %conv1 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16: 326*9880d681SAndroid Build Coastguard Worker; CHECK: negq 327*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test16: 330*9880d681SAndroid Build Coastguard Worker; ATOM: negq 331*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerdefine i16 @test17(i16 %x) nounwind { 335*9880d681SAndroid Build Coastguard Workerentry: 336*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i16 %x, 0 337*9880d681SAndroid Build Coastguard Worker %sub = sext i1 %cmp to i16 338*9880d681SAndroid Build Coastguard Worker ret i16 %sub 339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17: 340*9880d681SAndroid Build Coastguard Worker; CHECK: negw 341*9880d681SAndroid Build Coastguard Worker; CHECK: sbbw 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test17: 344*9880d681SAndroid Build Coastguard Worker; ATOM: negw 345*9880d681SAndroid Build Coastguard Worker; ATOM: sbbw 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerdefine i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind { 349*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %x, 15 350*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i8 %a, i8 %b 351*9880d681SAndroid Build Coastguard Worker ret i8 %sel 352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18: 353*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $15, %edi 354*9880d681SAndroid Build Coastguard Worker; CHECK: cmovgel %edx 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test18: 357*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl $15, %edi 358*9880d681SAndroid Build Coastguard Worker; ATOM: cmovgel %edx 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @trunc_select_miscompile 362*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sarb 363*9880d681SAndroid Build Coastguard Workerdefine i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) { 364*9880d681SAndroid Build Coastguard Worker %tmp1 = select i1 %cc, i32 3, i32 2 365*9880d681SAndroid Build Coastguard Worker %tmp2 = shl i32 %a, %tmp1 366*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 367*9880d681SAndroid Build Coastguard Worker} 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerdefine void @test19() { 370*9880d681SAndroid Build Coastguard Worker; This is a massive reduction of an llvm-stress test case that generates 371*9880d681SAndroid Build Coastguard Worker; interesting chains feeding setcc and eventually a f32 select operation. This 372*9880d681SAndroid Build Coastguard Worker; is intended to exercise the SELECT formation in the DAG combine simplifying 373*9880d681SAndroid Build Coastguard Worker; a simplified select_cc node. If it it regresses and is no longer triggering 374*9880d681SAndroid Build Coastguard Worker; that code path, it can be deleted. 375*9880d681SAndroid Build Coastguard Worker; 376*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19 377*9880d681SAndroid Build Coastguard Worker; CHECK: testb 378*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl 379*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard WorkerBB: 382*9880d681SAndroid Build Coastguard Worker br label %CF 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard WorkerCF: 385*9880d681SAndroid Build Coastguard Worker %Cmp10 = icmp ule i8 undef, undef 386*9880d681SAndroid Build Coastguard Worker br i1 %Cmp10, label %CF, label %CF250 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard WorkerCF250: 389*9880d681SAndroid Build Coastguard Worker %E12 = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i32 2 390*9880d681SAndroid Build Coastguard Worker %Cmp32 = icmp ugt i1 %Cmp10, false 391*9880d681SAndroid Build Coastguard Worker br i1 %Cmp32, label %CF, label %CF242 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard WorkerCF242: 394*9880d681SAndroid Build Coastguard Worker %Cmp38 = icmp uge i32 %E12, undef 395*9880d681SAndroid Build Coastguard Worker %FC = uitofp i1 %Cmp38 to float 396*9880d681SAndroid Build Coastguard Worker %Sl59 = select i1 %Cmp32, float %FC, float undef 397*9880d681SAndroid Build Coastguard Worker %Cmp60 = fcmp ugt float undef, undef 398*9880d681SAndroid Build Coastguard Worker br i1 %Cmp60, label %CF242, label %CF244 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard WorkerCF244: 401*9880d681SAndroid Build Coastguard Worker %B122 = fadd float %Sl59, undef 402*9880d681SAndroid Build Coastguard Worker ret void 403*9880d681SAndroid Build Coastguard Worker} 404