1*9880d681SAndroid Build Coastguard Worker; Test that compares are omitted if CC already has the right value 2*9880d681SAndroid Build Coastguard Worker; (z10 version). 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -no-integrated-as \ 5*9880d681SAndroid Build Coastguard Worker; RUN: -verify-machineinstrs| FileCheck %s 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @foo() 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Addition provides enough for equality comparisons with zero. First teest 10*9880d681SAndroid Build Coastguard Worker; the EQ case. 11*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a, i32 %b, i32 *%dest) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 13*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 15*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 18*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %res, 0 19*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerstore: 22*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 23*9880d681SAndroid Build Coastguard Worker br label %exit 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerexit: 26*9880d681SAndroid Build Coastguard Worker ret i32 %res 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; ...and again with NE. 30*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b, i32 *%dest) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 32*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14 34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 37*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 38*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerstore: 41*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 42*9880d681SAndroid Build Coastguard Worker br label %exit 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerexit: 45*9880d681SAndroid Build Coastguard Worker ret i32 %res 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; SLT requires a comparison. 49*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b, i32 *%dest) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 51*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14) 53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 56*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %res, 0 57*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerstore: 60*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 61*9880d681SAndroid Build Coastguard Worker br label %exit 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerexit: 64*9880d681SAndroid Build Coastguard Worker ret i32 %res 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; ...SLE too. 68*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %b, i32 *%dest) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 70*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cible %r2, 0, 0(%r14) 72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 75*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %res, 0 76*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerstore: 79*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 80*9880d681SAndroid Build Coastguard Worker br label %exit 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerexit: 83*9880d681SAndroid Build Coastguard Worker ret i32 %res 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; ...SGT too. 87*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b, i32 *%dest) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 89*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibh %r2, 0, 0(%r14) 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 94*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %res, 0 95*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerstore: 98*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 99*9880d681SAndroid Build Coastguard Worker br label %exit 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerexit: 102*9880d681SAndroid Build Coastguard Worker ret i32 %res 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; ...SGE too. 106*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i32 %b, i32 *%dest) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 108*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibhe %r2, 0, 0(%r14) 110*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 111*9880d681SAndroid Build Coastguard Workerentry: 112*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 113*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i32 %res, 0 114*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerstore: 117*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 118*9880d681SAndroid Build Coastguard Worker br label %exit 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerexit: 121*9880d681SAndroid Build Coastguard Worker ret i32 %res 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; Subtraction also provides enough for equality comparisons with zero. 125*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b, i32 *%dest) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 127*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4) 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14 129*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 130*9880d681SAndroid Build Coastguard Workerentry: 131*9880d681SAndroid Build Coastguard Worker %cur = load i32 , i32 *%dest 132*9880d681SAndroid Build Coastguard Worker %res = sub i32 %a, %cur 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 134*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerstore: 137*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 138*9880d681SAndroid Build Coastguard Worker br label %exit 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerexit: 141*9880d681SAndroid Build Coastguard Worker ret i32 %res 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; ...but not for ordered comparisons. 145*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a, i32 %b, i32 *%dest) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 147*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4) 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14) 149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker %cur = load i32 , i32 *%dest 152*9880d681SAndroid Build Coastguard Worker %res = sub i32 %a, %cur 153*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %res, 0 154*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerstore: 157*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 158*9880d681SAndroid Build Coastguard Worker br label %exit 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerexit: 161*9880d681SAndroid Build Coastguard Worker ret i32 %res 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; Logic register-register instructions also provide enough for equality 165*9880d681SAndroid Build Coastguard Worker; comparisons with zero. 166*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %a, i32 %b, i32 *%dest) { 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 168*9880d681SAndroid Build Coastguard Worker; CHECK: nr %r2, %r3 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 170*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker %res = and i32 %a, %b 173*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 174*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerstore: 177*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 178*9880d681SAndroid Build Coastguard Worker br label %exit 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerexit: 181*9880d681SAndroid Build Coastguard Worker ret i32 %res 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker; ...but not for ordered comparisons. 185*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %a, i32 %b, i32 *%dest) { 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 187*9880d681SAndroid Build Coastguard Worker; CHECK: nr %r2, %r3 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14) 189*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 190*9880d681SAndroid Build Coastguard Workerentry: 191*9880d681SAndroid Build Coastguard Worker %res = and i32 %a, %b 192*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %res, 0 193*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerstore: 196*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 197*9880d681SAndroid Build Coastguard Worker br label %exit 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerexit: 200*9880d681SAndroid Build Coastguard Worker ret i32 %res 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; Logic register-immediate instructions also provide enough for equality 204*9880d681SAndroid Build Coastguard Worker; comparisons with zero if the immediate covers the whole register. 205*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %a, i32 %b, i32 *%dest) { 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 207*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 100000001 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 209*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 210*9880d681SAndroid Build Coastguard Workerentry: 211*9880d681SAndroid Build Coastguard Worker %res = and i32 %a, 100000001 212*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 213*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerstore: 216*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 217*9880d681SAndroid Build Coastguard Worker br label %exit 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerexit: 220*9880d681SAndroid Build Coastguard Worker ret i32 %res 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; Partial logic register-immediate instructions do not provide simple 224*9880d681SAndroid Build Coastguard Worker; zero results. 225*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %a, i32 %b, i32 *%dest) { 226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 227*9880d681SAndroid Build Coastguard Worker; CHECK: nill %r2, 65436 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ciblh %r2, 0, 0(%r14) 229*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 230*9880d681SAndroid Build Coastguard Workerentry: 231*9880d681SAndroid Build Coastguard Worker %res = and i32 %a, -100 232*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 233*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerstore: 236*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 237*9880d681SAndroid Build Coastguard Worker br label %exit 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerexit: 240*9880d681SAndroid Build Coastguard Worker ret i32 %res 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; SRA provides the same CC result as a comparison with zero. 244*9880d681SAndroid Build Coastguard Workerdefine i32 @f13(i32 %a, i32 %b, i32 *%dest) { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 246*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 248*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 249*9880d681SAndroid Build Coastguard Workerentry: 250*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 251*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %res, 0 252*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerstore: 255*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 256*9880d681SAndroid Build Coastguard Worker br label %exit 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerexit: 259*9880d681SAndroid Build Coastguard Worker ret i32 %res 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker; ...and again with NE. 263*9880d681SAndroid Build Coastguard Workerdefine i32 @f14(i32 %a, i32 %b, i32 *%dest) { 264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 265*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blhr %r14 267*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 268*9880d681SAndroid Build Coastguard Workerentry: 269*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 270*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 271*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerstore: 274*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 275*9880d681SAndroid Build Coastguard Worker br label %exit 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerexit: 278*9880d681SAndroid Build Coastguard Worker ret i32 %res 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; ...and SLT. 282*9880d681SAndroid Build Coastguard Workerdefine i32 @f15(i32 %a, i32 %b, i32 *%dest) { 283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 284*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 287*9880d681SAndroid Build Coastguard Workerentry: 288*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 289*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %res, 0 290*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerstore: 293*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 294*9880d681SAndroid Build Coastguard Worker br label %exit 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Workerexit: 297*9880d681SAndroid Build Coastguard Worker ret i32 %res 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker; ...and SLE. 301*9880d681SAndroid Build Coastguard Workerdefine i32 @f16(i32 %a, i32 %b, i32 *%dest) { 302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 303*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14 305*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 306*9880d681SAndroid Build Coastguard Workerentry: 307*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 308*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %res, 0 309*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Workerstore: 312*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 313*9880d681SAndroid Build Coastguard Worker br label %exit 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Workerexit: 316*9880d681SAndroid Build Coastguard Worker ret i32 %res 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; ...and SGT. 320*9880d681SAndroid Build Coastguard Workerdefine i32 @f17(i32 %a, i32 %b, i32 *%dest) { 321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 322*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 324*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 325*9880d681SAndroid Build Coastguard Workerentry: 326*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 327*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %res, 0 328*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerstore: 331*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 332*9880d681SAndroid Build Coastguard Worker br label %exit 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerexit: 335*9880d681SAndroid Build Coastguard Worker ret i32 %res 336*9880d681SAndroid Build Coastguard Worker} 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker; ...and SGE. 339*9880d681SAndroid Build Coastguard Workerdefine i32 @f18(i32 %a, i32 %b, i32 *%dest) { 340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 341*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3) 342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bher %r14 343*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 344*9880d681SAndroid Build Coastguard Workerentry: 345*9880d681SAndroid Build Coastguard Worker %res = ashr i32 %a, %b 346*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i32 %res, 0 347*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerstore: 350*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 351*9880d681SAndroid Build Coastguard Worker br label %exit 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerexit: 354*9880d681SAndroid Build Coastguard Worker ret i32 %res 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker; RISBG provides the same result as a comparison against zero. 358*9880d681SAndroid Build Coastguard Worker; Test the EQ case. 359*9880d681SAndroid Build Coastguard Workerdefine i64 @f19(i64 %a, i64 %b, i64 *%dest) { 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 361*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r3, 0, 190, 0 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 363*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 364*9880d681SAndroid Build Coastguard Workerentry: 365*9880d681SAndroid Build Coastguard Worker %res = and i64 %b, -2 366*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %res, 0 367*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerstore: 370*9880d681SAndroid Build Coastguard Worker store i64 %b, i64 *%dest 371*9880d681SAndroid Build Coastguard Worker br label %exit 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerexit: 374*9880d681SAndroid Build Coastguard Worker ret i64 %res 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker; ...and the SLT case. 378*9880d681SAndroid Build Coastguard Workerdefine i64 @f20(i64 %a, i64 %b, i64 *%dest) { 379*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20: 380*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r3, 0, 190, 0 381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 383*9880d681SAndroid Build Coastguard Workerentry: 384*9880d681SAndroid Build Coastguard Worker %res = and i64 %b, -2 385*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %res, 0 386*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Workerstore: 389*9880d681SAndroid Build Coastguard Worker store i64 %b, i64 *%dest 390*9880d681SAndroid Build Coastguard Worker br label %exit 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Workerexit: 393*9880d681SAndroid Build Coastguard Worker ret i64 %res 394*9880d681SAndroid Build Coastguard Worker} 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker; Test a case where the register we're testing is set by a non-CC-clobbering 397*9880d681SAndroid Build Coastguard Worker; instruction. 398*9880d681SAndroid Build Coastguard Workerdefine i32 @f21(i32 %a, i32 %b, i32 *%dest) { 399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21: 400*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 403*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14) 405*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 406*9880d681SAndroid Build Coastguard Workerentry: 407*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 408*9880d681SAndroid Build Coastguard Worker %res = call i32 asm "blah $0", "=r,0" (i32 %add) 409*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %res, 0 410*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Workerstore: 413*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 414*9880d681SAndroid Build Coastguard Worker br label %exit 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Workerexit: 417*9880d681SAndroid Build Coastguard Worker ret i32 %res 418*9880d681SAndroid Build Coastguard Worker} 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Worker; ...and again with a CC-clobbering instruction. 421*9880d681SAndroid Build Coastguard Workerdefine i32 @f22(i32 %a, i32 %b, i32 *%dest) { 422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22: 423*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 427*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14) 428*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 429*9880d681SAndroid Build Coastguard Workerentry: 430*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 431*9880d681SAndroid Build Coastguard Worker %res = call i32 asm "blah $0", "=r,0,~{cc}" (i32 %add) 432*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %res, 0 433*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Workerstore: 436*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 437*9880d681SAndroid Build Coastguard Worker br label %exit 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Workerexit: 440*9880d681SAndroid Build Coastguard Worker ret i32 %res 441*9880d681SAndroid Build Coastguard Worker} 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Worker; Check that stores do not interfere. 444*9880d681SAndroid Build Coastguard Workerdefine i32 @f23(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) { 445*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23: 446*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st %r2, 0(%r4) 448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14 449*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 450*9880d681SAndroid Build Coastguard Workerentry: 451*9880d681SAndroid Build Coastguard Worker %res = add i32 %a, 1000000 452*9880d681SAndroid Build Coastguard Worker store i32 %res, i32 *%dest1 453*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %res, 0 454*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerstore: 457*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest2 458*9880d681SAndroid Build Coastguard Worker br label %exit 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Workerexit: 461*9880d681SAndroid Build Coastguard Worker ret i32 %res 462*9880d681SAndroid Build Coastguard Worker} 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Worker; Check that calls do interfere. 465*9880d681SAndroid Build Coastguard Workerdefine void @f24(i32 *%ptr) { 466*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24: 467*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[REG:%r[0-9]+]], 1000000 468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: brasl %r14, foo@PLT 469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cijlh [[REG]], 0, .L{{.*}} 470*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 471*9880d681SAndroid Build Coastguard Workerentry: 472*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 473*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %val, 1 474*9880d681SAndroid Build Coastguard Worker %add = add i32 %xor, 1000000 475*9880d681SAndroid Build Coastguard Worker call void @foo() 476*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 477*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Workerstore: 480*9880d681SAndroid Build Coastguard Worker store i32 %add, i32 *%ptr 481*9880d681SAndroid Build Coastguard Worker br label %exit 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerexit: 484*9880d681SAndroid Build Coastguard Worker ret void 485*9880d681SAndroid Build Coastguard Worker} 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Worker; Check that inline asms don't interfere if they don't clobber CC. 488*9880d681SAndroid Build Coastguard Workerdefine void @f25(i32 %a, i32 *%ptr) { 489*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25: 490*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah 493*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 494*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14 495*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 496*9880d681SAndroid Build Coastguard Workerentry: 497*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 498*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah", "r"(i32 %add) 499*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 500*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Workerstore: 503*9880d681SAndroid Build Coastguard Worker store i32 %add, i32 *%ptr 504*9880d681SAndroid Build Coastguard Worker br label %exit 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Workerexit: 507*9880d681SAndroid Build Coastguard Worker ret void 508*9880d681SAndroid Build Coastguard Worker} 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Worker; ...but do interfere if they do clobber CC. 511*9880d681SAndroid Build Coastguard Workerdefine void @f26(i32 %a, i32 *%ptr) { 512*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26: 513*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 515*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah 516*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ciblh %r2, 0, 0(%r14) 518*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 519*9880d681SAndroid Build Coastguard Workerentry: 520*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 521*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah", "r,~{cc}"(i32 %add) 522*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 523*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Workerstore: 526*9880d681SAndroid Build Coastguard Worker store i32 %add, i32 *%ptr 527*9880d681SAndroid Build Coastguard Worker br label %exit 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Workerexit: 530*9880d681SAndroid Build Coastguard Worker ret void 531*9880d681SAndroid Build Coastguard Worker} 532*9880d681SAndroid Build Coastguard Worker 533*9880d681SAndroid Build Coastguard Worker; Test a case where CC is set based on a different register from the 534*9880d681SAndroid Build Coastguard Worker; compare input. 535*9880d681SAndroid Build Coastguard Workerdefine i32 @f27(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) { 536*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27: 537*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sr %r3, %r2 539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st %r3, 0(%r4) 540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14) 541*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 542*9880d681SAndroid Build Coastguard Workerentry: 543*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 544*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %b, %add 545*9880d681SAndroid Build Coastguard Worker store i32 %sub, i32 *%dest1 546*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 547*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Workerstore: 550*9880d681SAndroid Build Coastguard Worker store i32 %sub, i32 *%dest2 551*9880d681SAndroid Build Coastguard Worker br label %exit 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard Workerexit: 554*9880d681SAndroid Build Coastguard Worker ret i32 %add 555*9880d681SAndroid Build Coastguard Worker} 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Worker; Make sure that we don't confuse a base register for a destination. 558*9880d681SAndroid Build Coastguard Workerdefine void @f28(i64 %a, i64 *%dest) { 559*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28: 560*9880d681SAndroid Build Coastguard Worker; CHECK: xi 0(%r2), 15 561*9880d681SAndroid Build Coastguard Worker; CHECK: cgibe %r2, 0, 0(%r14) 562*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 563*9880d681SAndroid Build Coastguard Workerentry: 564*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %a to i8 * 565*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr 566*9880d681SAndroid Build Coastguard Worker %xor = xor i8 %val, 15 567*9880d681SAndroid Build Coastguard Worker store i8 %xor, i8 *%ptr 568*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %a, 0 569*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Workerstore: 572*9880d681SAndroid Build Coastguard Worker store i64 %a, i64 *%dest 573*9880d681SAndroid Build Coastguard Worker br label %exit 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Workerexit: 576*9880d681SAndroid Build Coastguard Worker ret void 577*9880d681SAndroid Build Coastguard Worker} 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker; Test that L gets converted to LT where useful. 580*9880d681SAndroid Build Coastguard Workerdefine i32 @f29(i64 %base, i64 %index, i32 *%dest) { 581*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29: 582*9880d681SAndroid Build Coastguard Worker; CHECK: lt %r2, 0({{%r2,%r3|%r3,%r2}}) 583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14 584*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 585*9880d681SAndroid Build Coastguard Workerentry: 586*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 587*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 588*9880d681SAndroid Build Coastguard Worker %res = load i32 , i32 *%ptr 589*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %res, 0 590*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Workerstore: 593*9880d681SAndroid Build Coastguard Worker store i32 %res, i32 *%dest 594*9880d681SAndroid Build Coastguard Worker br label %exit 595*9880d681SAndroid Build Coastguard Worker 596*9880d681SAndroid Build Coastguard Workerexit: 597*9880d681SAndroid Build Coastguard Worker ret i32 %res 598*9880d681SAndroid Build Coastguard Worker} 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker; Test that LY gets converted to LT where useful. 601*9880d681SAndroid Build Coastguard Workerdefine i32 @f30(i64 %base, i64 %index, i32 *%dest) { 602*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30: 603*9880d681SAndroid Build Coastguard Worker; CHECK: lt %r2, 100000({{%r2,%r3|%r3,%r2}}) 604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14 605*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 606*9880d681SAndroid Build Coastguard Workerentry: 607*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %base, %index 608*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 100000 609*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to i32 * 610*9880d681SAndroid Build Coastguard Worker %res = load i32 , i32 *%ptr 611*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %res, 0 612*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 613*9880d681SAndroid Build Coastguard Worker 614*9880d681SAndroid Build Coastguard Workerstore: 615*9880d681SAndroid Build Coastguard Worker store i32 %res, i32 *%dest 616*9880d681SAndroid Build Coastguard Worker br label %exit 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Workerexit: 619*9880d681SAndroid Build Coastguard Worker ret i32 %res 620*9880d681SAndroid Build Coastguard Worker} 621*9880d681SAndroid Build Coastguard Worker 622*9880d681SAndroid Build Coastguard Worker; Test that LG gets converted to LTG where useful. 623*9880d681SAndroid Build Coastguard Workerdefine i64 @f31(i64 %base, i64 %index, i64 *%dest) { 624*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f31: 625*9880d681SAndroid Build Coastguard Worker; CHECK: ltg %r2, 0({{%r2,%r3|%r3,%r2}}) 626*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bher %r14 627*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 628*9880d681SAndroid Build Coastguard Workerentry: 629*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 630*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i64 * 631*9880d681SAndroid Build Coastguard Worker %res = load i64 , i64 *%ptr 632*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i64 %res, 0 633*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Workerstore: 636*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%dest 637*9880d681SAndroid Build Coastguard Worker br label %exit 638*9880d681SAndroid Build Coastguard Worker 639*9880d681SAndroid Build Coastguard Workerexit: 640*9880d681SAndroid Build Coastguard Worker ret i64 %res 641*9880d681SAndroid Build Coastguard Worker} 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Worker; Test that LGF gets converted to LTGF where useful. 644*9880d681SAndroid Build Coastguard Workerdefine i64 @f32(i64 %base, i64 %index, i64 *%dest) { 645*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32: 646*9880d681SAndroid Build Coastguard Worker; CHECK: ltgf %r2, 0({{%r2,%r3|%r3,%r2}}) 647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 648*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 649*9880d681SAndroid Build Coastguard Workerentry: 650*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 651*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 652*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 653*9880d681SAndroid Build Coastguard Worker %res = sext i32 %val to i64 654*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %res, 0 655*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 656*9880d681SAndroid Build Coastguard Worker 657*9880d681SAndroid Build Coastguard Workerstore: 658*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%dest 659*9880d681SAndroid Build Coastguard Worker br label %exit 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Workerexit: 662*9880d681SAndroid Build Coastguard Worker ret i64 %res 663*9880d681SAndroid Build Coastguard Worker} 664*9880d681SAndroid Build Coastguard Worker 665*9880d681SAndroid Build Coastguard Worker; Test that LR gets converted to LTR where useful. 666*9880d681SAndroid Build Coastguard Workerdefine i32 @f33(i32 %dummy, i32 %val, i32 *%dest) { 667*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f33: 668*9880d681SAndroid Build Coastguard Worker; CHECK: ltr %r2, %r3 669*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 673*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 674*9880d681SAndroid Build Coastguard Workerentry: 675*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r2}"(i32 %val) 676*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %val, 0 677*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 678*9880d681SAndroid Build Coastguard Worker 679*9880d681SAndroid Build Coastguard Workerstore: 680*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *%dest 681*9880d681SAndroid Build Coastguard Worker br label %exit 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Workerexit: 684*9880d681SAndroid Build Coastguard Worker ret i32 %val 685*9880d681SAndroid Build Coastguard Worker} 686*9880d681SAndroid Build Coastguard Worker 687*9880d681SAndroid Build Coastguard Worker; Test that LGR gets converted to LTGR where useful. 688*9880d681SAndroid Build Coastguard Workerdefine i64 @f34(i64 %dummy, i64 %val, i64 *%dest) { 689*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f34: 690*9880d681SAndroid Build Coastguard Worker; CHECK: ltgr %r2, %r3 691*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 692*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 693*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 695*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 696*9880d681SAndroid Build Coastguard Workerentry: 697*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r2}"(i64 %val) 698*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %val, 0 699*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 700*9880d681SAndroid Build Coastguard Worker 701*9880d681SAndroid Build Coastguard Workerstore: 702*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%dest 703*9880d681SAndroid Build Coastguard Worker br label %exit 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerexit: 706*9880d681SAndroid Build Coastguard Worker ret i64 %val 707*9880d681SAndroid Build Coastguard Worker} 708*9880d681SAndroid Build Coastguard Worker 709*9880d681SAndroid Build Coastguard Worker; Test that LGFR gets converted to LTGFR where useful. 710*9880d681SAndroid Build Coastguard Workerdefine i64 @f35(i64 %dummy, i32 %val, i64 *%dest) { 711*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f35: 712*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3 713*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 714*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 715*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 717*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 718*9880d681SAndroid Build Coastguard Workerentry: 719*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 720*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r2}"(i64 %ext) 721*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %ext, 0 722*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 723*9880d681SAndroid Build Coastguard Worker 724*9880d681SAndroid Build Coastguard Workerstore: 725*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64 *%dest 726*9880d681SAndroid Build Coastguard Worker br label %exit 727*9880d681SAndroid Build Coastguard Worker 728*9880d681SAndroid Build Coastguard Workerexit: 729*9880d681SAndroid Build Coastguard Worker ret i64 %ext 730*9880d681SAndroid Build Coastguard Worker} 731*9880d681SAndroid Build Coastguard Worker 732*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LR that 733*9880d681SAndroid Build Coastguard Worker; we need. 734*9880d681SAndroid Build Coastguard Workerdefine i32 @f36(i32 %val, i32 %dummy, i32 *%dest) { 735*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f36: 736*9880d681SAndroid Build Coastguard Worker; CHECK: ltr %r3, %r2 737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3 739*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 740*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 741*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 742*9880d681SAndroid Build Coastguard Workerentry: 743*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %val) 744*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %val, 0 745*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Workerstore: 748*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *%dest 749*9880d681SAndroid Build Coastguard Worker br label %exit 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Workerexit: 752*9880d681SAndroid Build Coastguard Worker ret i32 %val 753*9880d681SAndroid Build Coastguard Worker} 754*9880d681SAndroid Build Coastguard Worker 755*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LGR that 756*9880d681SAndroid Build Coastguard Worker; we need. 757*9880d681SAndroid Build Coastguard Workerdefine i64 @f37(i64 %val, i64 %dummy, i64 *%dest) { 758*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f37: 759*9880d681SAndroid Build Coastguard Worker; CHECK: ltgr %r3, %r2 760*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 761*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3 762*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 763*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 764*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 765*9880d681SAndroid Build Coastguard Workerentry: 766*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i64 %val) 767*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %val, 0 768*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 769*9880d681SAndroid Build Coastguard Worker 770*9880d681SAndroid Build Coastguard Workerstore: 771*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%dest 772*9880d681SAndroid Build Coastguard Worker br label %exit 773*9880d681SAndroid Build Coastguard Worker 774*9880d681SAndroid Build Coastguard Workerexit: 775*9880d681SAndroid Build Coastguard Worker ret i64 %val 776*9880d681SAndroid Build Coastguard Worker} 777*9880d681SAndroid Build Coastguard Worker 778*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LGFR that 779*9880d681SAndroid Build Coastguard Worker; we need. 780*9880d681SAndroid Build Coastguard Workerdefine i32 @f38(i32 %val, i64 %dummy, i32 *%dest) { 781*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f38: 782*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r3, %r2 783*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 784*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3 785*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 786*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 787*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 788*9880d681SAndroid Build Coastguard Workerentry: 789*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 790*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i64 %ext) 791*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %val, 0 792*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Workerstore: 795*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *%dest 796*9880d681SAndroid Build Coastguard Worker br label %exit 797*9880d681SAndroid Build Coastguard Worker 798*9880d681SAndroid Build Coastguard Workerexit: 799*9880d681SAndroid Build Coastguard Worker ret i32 %val 800*9880d681SAndroid Build Coastguard Worker} 801*9880d681SAndroid Build Coastguard Worker 802*9880d681SAndroid Build Coastguard Worker; Test f35 for in-register extensions. 803*9880d681SAndroid Build Coastguard Workerdefine i64 @f39(i64 %dummy, i64 %a, i64 *%dest) { 804*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f39: 805*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3 806*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 807*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 808*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 810*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 811*9880d681SAndroid Build Coastguard Workerentry: 812*9880d681SAndroid Build Coastguard Worker %val = trunc i64 %a to i32 813*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 814*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r2}"(i64 %ext) 815*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %ext, 0 816*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Workerstore: 819*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64 *%dest 820*9880d681SAndroid Build Coastguard Worker br label %exit 821*9880d681SAndroid Build Coastguard Worker 822*9880d681SAndroid Build Coastguard Workerexit: 823*9880d681SAndroid Build Coastguard Worker ret i64 %ext 824*9880d681SAndroid Build Coastguard Worker} 825*9880d681SAndroid Build Coastguard Worker 826*9880d681SAndroid Build Coastguard Worker; ...and again with what InstCombine would produce for f40. 827*9880d681SAndroid Build Coastguard Workerdefine i64 @f40(i64 %dummy, i64 %a, i64 *%dest) { 828*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f40: 829*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3 830*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP 831*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2 832*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP 833*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 834*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 835*9880d681SAndroid Build Coastguard Workerentry: 836*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %a, 32 837*9880d681SAndroid Build Coastguard Worker %ext = ashr i64 %shl, 32 838*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r2}"(i64 %ext) 839*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %shl, 0 840*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Workerstore: 843*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64 *%dest 844*9880d681SAndroid Build Coastguard Worker br label %exit 845*9880d681SAndroid Build Coastguard Worker 846*9880d681SAndroid Build Coastguard Workerexit: 847*9880d681SAndroid Build Coastguard Worker ret i64 %ext 848*9880d681SAndroid Build Coastguard Worker} 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Worker; Try a form of f7 in which the subtraction operands are compared directly. 851*9880d681SAndroid Build Coastguard Workerdefine i32 @f41(i32 %a, i32 %b, i32 *%dest) { 852*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f41: 853*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4) 854*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14 855*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 856*9880d681SAndroid Build Coastguard Workerentry: 857*9880d681SAndroid Build Coastguard Worker %cur = load i32 , i32 *%dest 858*9880d681SAndroid Build Coastguard Worker %res = sub i32 %a, %cur 859*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %a, %cur 860*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 861*9880d681SAndroid Build Coastguard Worker 862*9880d681SAndroid Build Coastguard Workerstore: 863*9880d681SAndroid Build Coastguard Worker store i32 %b, i32 *%dest 864*9880d681SAndroid Build Coastguard Worker br label %exit 865*9880d681SAndroid Build Coastguard Worker 866*9880d681SAndroid Build Coastguard Workerexit: 867*9880d681SAndroid Build Coastguard Worker ret i32 %res 868*9880d681SAndroid Build Coastguard Worker} 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Worker; A version of f32 that tests the unextended value. 871*9880d681SAndroid Build Coastguard Workerdefine i64 @f42(i64 %base, i64 %index, i64 *%dest) { 872*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f42: 873*9880d681SAndroid Build Coastguard Worker; CHECK: ltgf %r2, 0({{%r2,%r3|%r3,%r2}}) 874*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 875*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 876*9880d681SAndroid Build Coastguard Workerentry: 877*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 878*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 879*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 880*9880d681SAndroid Build Coastguard Worker %res = sext i32 %val to i64 881*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %val, 0 882*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %exit, label %store 883*9880d681SAndroid Build Coastguard Worker 884*9880d681SAndroid Build Coastguard Workerstore: 885*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%dest 886*9880d681SAndroid Build Coastguard Worker br label %exit 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Workerexit: 889*9880d681SAndroid Build Coastguard Worker ret i64 %res 890*9880d681SAndroid Build Coastguard Worker} 891