1*9880d681SAndroid Build Coastguard Worker; FIXME: FastISel currently returns false if it hits code that uses VSX 2*9880d681SAndroid Build Coastguard Worker; registers and with -fast-isel-abort=1 turned on the test case will then fail. 3*9880d681SAndroid Build Coastguard Worker; When fastisel better supports VSX fix up this test case. 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s --check-prefix=ELF64 6*9880d681SAndroid Build Coastguard Workerdefine void @t1a(float %a) nounwind { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; ELF64: t1a 9*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %a, 0.000000e+00 10*9880d681SAndroid Build Coastguard Worker; ELF64: addis 11*9880d681SAndroid Build Coastguard Worker; ELF64: lfs 12*9880d681SAndroid Build Coastguard Worker; ELF64: fcmpu 13*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 16*9880d681SAndroid Build Coastguard Worker call void @foo() 17*9880d681SAndroid Build Coastguard Worker br label %if.end 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdeclare void @foo() 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine void @t1b(float %a) nounwind { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker; ELF64: t1b 28*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %a, -0.000000e+00 29*9880d681SAndroid Build Coastguard Worker; ELF64: addis 30*9880d681SAndroid Build Coastguard Worker; ELF64: lfs 31*9880d681SAndroid Build Coastguard Worker; ELF64: fcmpu 32*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 35*9880d681SAndroid Build Coastguard Worker call void @foo() 36*9880d681SAndroid Build Coastguard Worker br label %if.end 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine void @t2a(double %a) nounwind { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker; ELF64: t2a 45*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq double %a, 0.000000e+00 46*9880d681SAndroid Build Coastguard Worker; ELF64: addis 47*9880d681SAndroid Build Coastguard Worker; ELF64: lfd 48*9880d681SAndroid Build Coastguard Worker; ELF64: fcmpu 49*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 52*9880d681SAndroid Build Coastguard Worker call void @foo() 53*9880d681SAndroid Build Coastguard Worker br label %if.end 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @t2b(double %a) nounwind { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker; ELF64: t2b 62*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq double %a, -0.000000e+00 63*9880d681SAndroid Build Coastguard Worker; ELF64: addis 64*9880d681SAndroid Build Coastguard Worker; ELF64: lfd 65*9880d681SAndroid Build Coastguard Worker; ELF64: fcmpu 66*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 69*9880d681SAndroid Build Coastguard Worker call void @foo() 70*9880d681SAndroid Build Coastguard Worker br label %if.end 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @t4(i8 signext %a) nounwind { 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker; ELF64: t4 79*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %a, -1 80*9880d681SAndroid Build Coastguard Worker; ELF64: extsb 81*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 82*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 85*9880d681SAndroid Build Coastguard Worker call void @foo() 86*9880d681SAndroid Build Coastguard Worker br label %if.end 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine void @t5(i8 zeroext %a) nounwind { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker; ELF64: t5 95*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %a, 1 96*9880d681SAndroid Build Coastguard Worker; ELF64: extsb 97*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 98*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 101*9880d681SAndroid Build Coastguard Worker call void @foo() 102*9880d681SAndroid Build Coastguard Worker br label %if.end 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine void @t6(i16 signext %a) nounwind { 109*9880d681SAndroid Build Coastguard Workerentry: 110*9880d681SAndroid Build Coastguard Worker; ELF64: t6 111*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i16 %a, -1 112*9880d681SAndroid Build Coastguard Worker; ELF64: extsh 113*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 114*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 117*9880d681SAndroid Build Coastguard Worker call void @foo() 118*9880d681SAndroid Build Coastguard Worker br label %if.end 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 121*9880d681SAndroid Build Coastguard Worker ret void 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine void @t7(i16 zeroext %a) nounwind { 125*9880d681SAndroid Build Coastguard Workerentry: 126*9880d681SAndroid Build Coastguard Worker; ELF64: t7 127*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i16 %a, 1 128*9880d681SAndroid Build Coastguard Worker; ELF64: extsh 129*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 130*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 133*9880d681SAndroid Build Coastguard Worker call void @foo() 134*9880d681SAndroid Build Coastguard Worker br label %if.end 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine void @t8(i32 %a) nounwind { 141*9880d681SAndroid Build Coastguard Workerentry: 142*9880d681SAndroid Build Coastguard Worker; ELF64: t8 143*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, -1 144*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 145*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 148*9880d681SAndroid Build Coastguard Worker call void @foo() 149*9880d681SAndroid Build Coastguard Worker br label %if.end 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine void @t9(i32 %a) nounwind { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker; ELF64: t9 158*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, 1 159*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 160*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 163*9880d681SAndroid Build Coastguard Worker call void @foo() 164*9880d681SAndroid Build Coastguard Worker br label %if.end 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 167*9880d681SAndroid Build Coastguard Worker ret void 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine void @t10(i32 %a) nounwind { 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker; ELF64: t10 173*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, 384 174*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 175*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 178*9880d681SAndroid Build Coastguard Worker call void @foo() 179*9880d681SAndroid Build Coastguard Worker br label %if.end 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine void @t11(i32 %a) nounwind { 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker; ELF64: t11 188*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, 4096 189*9880d681SAndroid Build Coastguard Worker; ELF64: cmpwi 190*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 193*9880d681SAndroid Build Coastguard Worker call void @foo() 194*9880d681SAndroid Build Coastguard Worker br label %if.end 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerdefine void @t12(i8 %a) nounwind { 201*9880d681SAndroid Build Coastguard Workerentry: 202*9880d681SAndroid Build Coastguard Worker; ELF64: t12 203*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i8 %a, -113 204*9880d681SAndroid Build Coastguard Worker; ELF64: clrlwi 205*9880d681SAndroid Build Coastguard Worker; ELF64: cmplwi 206*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 209*9880d681SAndroid Build Coastguard Worker call void @foo() 210*9880d681SAndroid Build Coastguard Worker br label %if.end 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 213*9880d681SAndroid Build Coastguard Worker ret void 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine void @t13() nounwind ssp { 217*9880d681SAndroid Build Coastguard Workerentry: 218*9880d681SAndroid Build Coastguard Worker; ELF64: t13 219*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 -123, -2147483648 220*9880d681SAndroid Build Coastguard Worker; ELF64: li 221*9880d681SAndroid Build Coastguard Worker; ELF64: lis 222*9880d681SAndroid Build Coastguard Worker; ELF64: cmpw 223*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 226*9880d681SAndroid Build Coastguard Worker ret void 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 229*9880d681SAndroid Build Coastguard Worker ret void 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine void @t14(i64 %a) nounwind { 233*9880d681SAndroid Build Coastguard Workerentry: 234*9880d681SAndroid Build Coastguard Worker; ELF64: t14 235*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %a, -1 236*9880d681SAndroid Build Coastguard Worker; ELF64: cmpdi 237*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 240*9880d681SAndroid Build Coastguard Worker call void @foo() 241*9880d681SAndroid Build Coastguard Worker br label %if.end 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 244*9880d681SAndroid Build Coastguard Worker ret void 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine void @t15(i64 %a) nounwind { 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker; ELF64: t15 250*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %a, 1 251*9880d681SAndroid Build Coastguard Worker; ELF64: cmpdi 252*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 255*9880d681SAndroid Build Coastguard Worker call void @foo() 256*9880d681SAndroid Build Coastguard Worker br label %if.end 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 259*9880d681SAndroid Build Coastguard Worker ret void 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdefine void @t16(i64 %a) nounwind { 263*9880d681SAndroid Build Coastguard Workerentry: 264*9880d681SAndroid Build Coastguard Worker; ELF64: t16 265*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %a, 384 266*9880d681SAndroid Build Coastguard Worker; ELF64: cmpdi 267*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 270*9880d681SAndroid Build Coastguard Worker call void @foo() 271*9880d681SAndroid Build Coastguard Worker br label %if.end 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 274*9880d681SAndroid Build Coastguard Worker ret void 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine void @t17(i64 %a) nounwind { 278*9880d681SAndroid Build Coastguard Workerentry: 279*9880d681SAndroid Build Coastguard Worker; ELF64: t17 280*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %a, 32768 281*9880d681SAndroid Build Coastguard Worker; Extra operand so we don't match on cmpdi. 282*9880d681SAndroid Build Coastguard Worker; ELF64: cmpd {{[0-9]+}} 283*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 286*9880d681SAndroid Build Coastguard Worker call void @foo() 287*9880d681SAndroid Build Coastguard Worker br label %if.end 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 290*9880d681SAndroid Build Coastguard Worker ret void 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293