1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=penryn | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; rdar://7475489 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %a, i32 %b) nounwind ssp { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: xorb 9*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andb 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: shrb 11*9880d681SAndroid Build Coastguard Worker; CHECK: testb $64 12*9880d681SAndroid Build Coastguard Worker %0 = and i32 %a, 16384 13*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i32 %0, 0 14*9880d681SAndroid Build Coastguard Worker %2 = and i32 %b, 16384 15*9880d681SAndroid Build Coastguard Worker %3 = icmp ne i32 %2, 0 16*9880d681SAndroid Build Coastguard Worker %4 = xor i1 %1, %3 17*9880d681SAndroid Build Coastguard Worker br i1 %4, label %bb1, label %bb 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 20*9880d681SAndroid Build Coastguard Worker %5 = tail call i32 (...) @foo() nounwind ; <i32> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker ret i32 %5 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 24*9880d681SAndroid Build Coastguard Worker %6 = tail call i32 (...) @bar() nounwind ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker ret i32 %6 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(...) 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(...) 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0 35*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %P, i32* %Q) nounwind ssp { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker %a = icmp eq i32* %P, null ; <i1> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker %b = icmp eq i32* %Q, null ; <i1> [#uses=1] 39*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 40*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb1, label %return 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 43*9880d681SAndroid Build Coastguard Worker ret i32 4 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 46*9880d681SAndroid Build Coastguard Worker ret i32 192 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 48*9880d681SAndroid Build Coastguard Worker; CHECK: movl 4(%esp), %eax 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl 8(%esp), %eax 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne LBB1_2 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0 54*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* %P, i32* %Q) nounwind ssp { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %a = icmp ne i32* %P, null ; <i1> [#uses=1] 57*9880d681SAndroid Build Coastguard Worker %b = icmp ne i32* %Q, null ; <i1> [#uses=1] 58*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b 59*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb1, label %return 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 62*9880d681SAndroid Build Coastguard Worker ret i32 4 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 65*9880d681SAndroid Build Coastguard Worker ret i32 192 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 67*9880d681SAndroid Build Coastguard Worker; CHECK: movl 4(%esp), %eax 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl 8(%esp), %eax 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je LBB2_2 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; <rdar://problem/7598384>: 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker; jCC L1 75*9880d681SAndroid Build Coastguard Worker; jmp L2 76*9880d681SAndroid Build Coastguard Worker; L1: 77*9880d681SAndroid Build Coastguard Worker; ... 78*9880d681SAndroid Build Coastguard Worker; L2: 79*9880d681SAndroid Build Coastguard Worker; ... 80*9880d681SAndroid Build Coastguard Worker; 81*9880d681SAndroid Build Coastguard Worker; to: 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker; jnCC L2 84*9880d681SAndroid Build Coastguard Worker; L1: 85*9880d681SAndroid Build Coastguard Worker; ... 86*9880d681SAndroid Build Coastguard Worker; L2: 87*9880d681SAndroid Build Coastguard Worker; ... 88*9880d681SAndroid Build Coastguard Workerdefine float @test4(float %x, float %y) nounwind readnone optsize ssp { 89*9880d681SAndroid Build Coastguard Workerentry: 90*9880d681SAndroid Build Coastguard Worker %0 = fpext float %x to double ; <double> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double ; <double> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker %2 = fmul double %0, %1 ; <double> [#uses=3] 93*9880d681SAndroid Build Coastguard Worker %3 = fcmp oeq double %2, 0.000000e+00 ; <i1> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker br i1 %3, label %bb2, label %bb1 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; CHECK: jne 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jnp 98*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: jmp 99*9880d681SAndroid Build Coastguard Worker; CHECK: LBB 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 102*9880d681SAndroid Build Coastguard Worker %4 = fadd double %2, -1.000000e+00 ; <double> [#uses=1] 103*9880d681SAndroid Build Coastguard Worker br label %bb2 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %entry, %bb1 106*9880d681SAndroid Build Coastguard Worker %.0.in = phi double [ %4, %bb1 ], [ %2, %entry ] ; <double> [#uses=1] 107*9880d681SAndroid Build Coastguard Worker %.0 = fptrunc double %.0.in to float ; <float> [#uses=1] 108*9880d681SAndroid Build Coastguard Worker ret float %.0 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse41.ptestz(<4 x float> %p1, <4 x float> %p2) nounwind 112*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse41.ptestc(<4 x float> %p1, <4 x float> %p2) nounwind 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test5(<4 x float> %a, <4 x float> %b) nounwind { 115*9880d681SAndroid Build Coastguard Workerentry: 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 117*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne 119*9880d681SAndroid Build Coastguard Worker; CHECK: ret 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind 122*9880d681SAndroid Build Coastguard Worker %one = icmp ne i32 %res, 0 123*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerbb1: 126*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 127*9880d681SAndroid Build Coastguard Worker br label %return 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerbb2: 130*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 131*9880d681SAndroid Build Coastguard Worker br label %return 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerreturn: 134*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 135*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test7(<4 x float> %a, <4 x float> %b) nounwind { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 141*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne 143*9880d681SAndroid Build Coastguard Worker; CHECK: ret 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind 146*9880d681SAndroid Build Coastguard Worker %one = trunc i32 %res to i1 147*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerbb1: 150*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 151*9880d681SAndroid Build Coastguard Worker br label %return 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerbb2: 154*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 155*9880d681SAndroid Build Coastguard Worker br label %return 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerreturn: 158*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 159*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test8(<4 x float> %a, <4 x float> %b) nounwind { 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 165*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jae 167*9880d681SAndroid Build Coastguard Worker; CHECK: ret 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind 170*9880d681SAndroid Build Coastguard Worker %one = icmp ne i32 %res, 0 171*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerbb1: 174*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 175*9880d681SAndroid Build Coastguard Worker br label %return 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerbb2: 178*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 179*9880d681SAndroid Build Coastguard Worker br label %return 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerreturn: 182*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 183*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test10(<4 x float> %a, <4 x float> %b) nounwind { 187*9880d681SAndroid Build Coastguard Workerentry: 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 189*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jae 191*9880d681SAndroid Build Coastguard Worker; CHECK: ret 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind 194*9880d681SAndroid Build Coastguard Worker %one = trunc i32 %res to i1 195*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerbb1: 198*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 199*9880d681SAndroid Build Coastguard Worker br label %return 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerbb2: 202*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 203*9880d681SAndroid Build Coastguard Worker br label %return 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerreturn: 206*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 207*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test11(<4 x float> %a, <4 x float> %b) nounwind { 211*9880d681SAndroid Build Coastguard Workerentry: 212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 213*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne 215*9880d681SAndroid Build Coastguard Worker; CHECK: ret 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind 218*9880d681SAndroid Build Coastguard Worker %one = icmp eq i32 %res, 1 219*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerbb1: 222*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 223*9880d681SAndroid Build Coastguard Worker br label %return 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerbb2: 226*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 227*9880d681SAndroid Build Coastguard Worker br label %return 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerreturn: 230*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 231*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test12(<4 x float> %a, <4 x float> %b) nounwind { 235*9880d681SAndroid Build Coastguard Workerentry: 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 237*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 239*9880d681SAndroid Build Coastguard Worker; CHECK: ret 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind 242*9880d681SAndroid Build Coastguard Worker %one = icmp ne i32 %res, 1 243*9880d681SAndroid Build Coastguard Worker br i1 %one, label %bb1, label %bb2 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerbb1: 246*9880d681SAndroid Build Coastguard Worker %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 247*9880d681SAndroid Build Coastguard Worker br label %return 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Workerbb2: 250*9880d681SAndroid Build Coastguard Worker %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 > 251*9880d681SAndroid Build Coastguard Worker br label %return 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerreturn: 254*9880d681SAndroid Build Coastguard Worker %e = phi <4 x float> [%c, %bb1], [%d, %bb2] 255*9880d681SAndroid Build Coastguard Worker ret <4 x float> %e 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258