1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 -pre-RA-sched=source -enable-misched -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; Verify that misched resource/latency balancy heuristics are sane. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine void @unrolled_mmult1(i32* %tmp55, i32* %tmp56, i32* %pre, i32* %pre94, 6*9880d681SAndroid Build Coastguard Worker i32* %pre95, i32* %pre96, i32* %pre97, i32* %pre98, i32* %pre99, 7*9880d681SAndroid Build Coastguard Worker i32* %pre100, i32* %pre101, i32* %pre102, i32* %pre103, i32* %pre104) 8*9880d681SAndroid Build Coastguard Worker nounwind uwtable ssp { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker br label %for.body 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; imull folded loads should be in order and interleaved with addl, never 13*9880d681SAndroid Build Coastguard Worker; adjacent. Also check that we have no spilling. 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; Since mmult1 IR is already in good order, this effectively ensure 16*9880d681SAndroid Build Coastguard Worker; the scheduler maintains source order. 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %for.body 19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %rsp 20*9880d681SAndroid Build Coastguard Worker; CHECK: imull 4 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 22*9880d681SAndroid Build Coastguard Worker; CHECK: addl 23*9880d681SAndroid Build Coastguard Worker; CHECK: imull 8 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 25*9880d681SAndroid Build Coastguard Worker; CHECK: addl 26*9880d681SAndroid Build Coastguard Worker; CHECK: imull 12 27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 28*9880d681SAndroid Build Coastguard Worker; CHECK: addl 29*9880d681SAndroid Build Coastguard Worker; CHECK: imull 16 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 31*9880d681SAndroid Build Coastguard Worker; CHECK: addl 32*9880d681SAndroid Build Coastguard Worker; CHECK: imull 20 33*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 34*9880d681SAndroid Build Coastguard Worker; CHECK: addl 35*9880d681SAndroid Build Coastguard Worker; CHECK: imull 24 36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 37*9880d681SAndroid Build Coastguard Worker; CHECK: addl 38*9880d681SAndroid Build Coastguard Worker; CHECK: imull 28 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 40*9880d681SAndroid Build Coastguard Worker; CHECK: addl 41*9880d681SAndroid Build Coastguard Worker; CHECK: imull 32 42*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 43*9880d681SAndroid Build Coastguard Worker; CHECK: addl 44*9880d681SAndroid Build Coastguard Worker; CHECK: imull 36 45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 46*9880d681SAndroid Build Coastguard Worker; CHECK: addl 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %end 49*9880d681SAndroid Build Coastguard Workerfor.body: 50*9880d681SAndroid Build Coastguard Worker %indvars.iv42.i = phi i64 [ %indvars.iv.next43.i, %for.body ], [ 0, %entry ] 51*9880d681SAndroid Build Coastguard Worker %tmp57 = load i32, i32* %tmp56, align 4 52*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61 = getelementptr inbounds i32, i32* %pre, i64 %indvars.iv42.i 53*9880d681SAndroid Build Coastguard Worker %tmp58 = load i32, i32* %arrayidx12.us.i61, align 4 54*9880d681SAndroid Build Coastguard Worker %mul.us.i = mul nsw i32 %tmp58, %tmp57 55*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.1 = getelementptr inbounds i32, i32* %tmp56, i64 1 56*9880d681SAndroid Build Coastguard Worker %tmp59 = load i32, i32* %arrayidx8.us.i.1, align 4 57*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.1 = getelementptr inbounds i32, i32* %pre94, i64 %indvars.iv42.i 58*9880d681SAndroid Build Coastguard Worker %tmp60 = load i32, i32* %arrayidx12.us.i61.1, align 4 59*9880d681SAndroid Build Coastguard Worker %mul.us.i.1 = mul nsw i32 %tmp60, %tmp59 60*9880d681SAndroid Build Coastguard Worker %add.us.i.1 = add nsw i32 %mul.us.i.1, %mul.us.i 61*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.2 = getelementptr inbounds i32, i32* %tmp56, i64 2 62*9880d681SAndroid Build Coastguard Worker %tmp61 = load i32, i32* %arrayidx8.us.i.2, align 4 63*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.2 = getelementptr inbounds i32, i32* %pre95, i64 %indvars.iv42.i 64*9880d681SAndroid Build Coastguard Worker %tmp62 = load i32, i32* %arrayidx12.us.i61.2, align 4 65*9880d681SAndroid Build Coastguard Worker %mul.us.i.2 = mul nsw i32 %tmp62, %tmp61 66*9880d681SAndroid Build Coastguard Worker %add.us.i.2 = add nsw i32 %mul.us.i.2, %add.us.i.1 67*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.3 = getelementptr inbounds i32, i32* %tmp56, i64 3 68*9880d681SAndroid Build Coastguard Worker %tmp63 = load i32, i32* %arrayidx8.us.i.3, align 4 69*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.3 = getelementptr inbounds i32, i32* %pre96, i64 %indvars.iv42.i 70*9880d681SAndroid Build Coastguard Worker %tmp64 = load i32, i32* %arrayidx12.us.i61.3, align 4 71*9880d681SAndroid Build Coastguard Worker %mul.us.i.3 = mul nsw i32 %tmp64, %tmp63 72*9880d681SAndroid Build Coastguard Worker %add.us.i.3 = add nsw i32 %mul.us.i.3, %add.us.i.2 73*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.4 = getelementptr inbounds i32, i32* %tmp56, i64 4 74*9880d681SAndroid Build Coastguard Worker %tmp65 = load i32, i32* %arrayidx8.us.i.4, align 4 75*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.4 = getelementptr inbounds i32, i32* %pre97, i64 %indvars.iv42.i 76*9880d681SAndroid Build Coastguard Worker %tmp66 = load i32, i32* %arrayidx12.us.i61.4, align 4 77*9880d681SAndroid Build Coastguard Worker %mul.us.i.4 = mul nsw i32 %tmp66, %tmp65 78*9880d681SAndroid Build Coastguard Worker %add.us.i.4 = add nsw i32 %mul.us.i.4, %add.us.i.3 79*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.5 = getelementptr inbounds i32, i32* %tmp56, i64 5 80*9880d681SAndroid Build Coastguard Worker %tmp67 = load i32, i32* %arrayidx8.us.i.5, align 4 81*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.5 = getelementptr inbounds i32, i32* %pre98, i64 %indvars.iv42.i 82*9880d681SAndroid Build Coastguard Worker %tmp68 = load i32, i32* %arrayidx12.us.i61.5, align 4 83*9880d681SAndroid Build Coastguard Worker %mul.us.i.5 = mul nsw i32 %tmp68, %tmp67 84*9880d681SAndroid Build Coastguard Worker %add.us.i.5 = add nsw i32 %mul.us.i.5, %add.us.i.4 85*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.6 = getelementptr inbounds i32, i32* %tmp56, i64 6 86*9880d681SAndroid Build Coastguard Worker %tmp69 = load i32, i32* %arrayidx8.us.i.6, align 4 87*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.6 = getelementptr inbounds i32, i32* %pre99, i64 %indvars.iv42.i 88*9880d681SAndroid Build Coastguard Worker %tmp70 = load i32, i32* %arrayidx12.us.i61.6, align 4 89*9880d681SAndroid Build Coastguard Worker %mul.us.i.6 = mul nsw i32 %tmp70, %tmp69 90*9880d681SAndroid Build Coastguard Worker %add.us.i.6 = add nsw i32 %mul.us.i.6, %add.us.i.5 91*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.7 = getelementptr inbounds i32, i32* %tmp56, i64 7 92*9880d681SAndroid Build Coastguard Worker %tmp71 = load i32, i32* %arrayidx8.us.i.7, align 4 93*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.7 = getelementptr inbounds i32, i32* %pre100, i64 %indvars.iv42.i 94*9880d681SAndroid Build Coastguard Worker %tmp72 = load i32, i32* %arrayidx12.us.i61.7, align 4 95*9880d681SAndroid Build Coastguard Worker %mul.us.i.7 = mul nsw i32 %tmp72, %tmp71 96*9880d681SAndroid Build Coastguard Worker %add.us.i.7 = add nsw i32 %mul.us.i.7, %add.us.i.6 97*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.8 = getelementptr inbounds i32, i32* %tmp56, i64 8 98*9880d681SAndroid Build Coastguard Worker %tmp73 = load i32, i32* %arrayidx8.us.i.8, align 4 99*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.8 = getelementptr inbounds i32, i32* %pre101, i64 %indvars.iv42.i 100*9880d681SAndroid Build Coastguard Worker %tmp74 = load i32, i32* %arrayidx12.us.i61.8, align 4 101*9880d681SAndroid Build Coastguard Worker %mul.us.i.8 = mul nsw i32 %tmp74, %tmp73 102*9880d681SAndroid Build Coastguard Worker %add.us.i.8 = add nsw i32 %mul.us.i.8, %add.us.i.7 103*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.9 = getelementptr inbounds i32, i32* %tmp56, i64 9 104*9880d681SAndroid Build Coastguard Worker %tmp75 = load i32, i32* %arrayidx8.us.i.9, align 4 105*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.9 = getelementptr inbounds i32, i32* %pre102, i64 %indvars.iv42.i 106*9880d681SAndroid Build Coastguard Worker %tmp76 = load i32, i32* %arrayidx12.us.i61.9, align 4 107*9880d681SAndroid Build Coastguard Worker %mul.us.i.9 = mul nsw i32 %tmp76, %tmp75 108*9880d681SAndroid Build Coastguard Worker %add.us.i.9 = add nsw i32 %mul.us.i.9, %add.us.i.8 109*9880d681SAndroid Build Coastguard Worker %arrayidx16.us.i = getelementptr inbounds i32, i32* %tmp55, i64 %indvars.iv42.i 110*9880d681SAndroid Build Coastguard Worker store i32 %add.us.i.9, i32* %arrayidx16.us.i, align 4 111*9880d681SAndroid Build Coastguard Worker %indvars.iv.next43.i = add i64 %indvars.iv42.i, 1 112*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next43.i to i32 113*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, 10 114*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %end, label %for.body 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerend: 117*9880d681SAndroid Build Coastguard Worker ret void 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; Unlike the above loop, this IR starts out bad and must be 121*9880d681SAndroid Build Coastguard Worker; rescheduled. 122*9880d681SAndroid Build Coastguard Worker; 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %for.body 124*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %rsp 125*9880d681SAndroid Build Coastguard Worker; CHECK: imull 4 126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 127*9880d681SAndroid Build Coastguard Worker; CHECK: addl 128*9880d681SAndroid Build Coastguard Worker; CHECK: imull 8 129*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 130*9880d681SAndroid Build Coastguard Worker; CHECK: addl 131*9880d681SAndroid Build Coastguard Worker; CHECK: imull 12 132*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 133*9880d681SAndroid Build Coastguard Worker; CHECK: addl 134*9880d681SAndroid Build Coastguard Worker; CHECK: imull 16 135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 136*9880d681SAndroid Build Coastguard Worker; CHECK: addl 137*9880d681SAndroid Build Coastguard Worker; CHECK: imull 20 138*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 139*9880d681SAndroid Build Coastguard Worker; CHECK: addl 140*9880d681SAndroid Build Coastguard Worker; CHECK: imull 24 141*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 142*9880d681SAndroid Build Coastguard Worker; CHECK: addl 143*9880d681SAndroid Build Coastguard Worker; CHECK: imull 28 144*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 145*9880d681SAndroid Build Coastguard Worker; CHECK: addl 146*9880d681SAndroid Build Coastguard Worker; CHECK: imull 32 147*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 148*9880d681SAndroid Build Coastguard Worker; CHECK: addl 149*9880d681SAndroid Build Coastguard Worker; CHECK: imull 36 150*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 151*9880d681SAndroid Build Coastguard Worker; CHECK: addl 152*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}} 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %end 154*9880d681SAndroid Build Coastguard Workerdefine void @unrolled_mmult2(i32* %tmp55, i32* %tmp56, i32* %pre, i32* %pre94, 155*9880d681SAndroid Build Coastguard Worker i32* %pre95, i32* %pre96, i32* %pre97, i32* %pre98, i32* %pre99, 156*9880d681SAndroid Build Coastguard Worker i32* %pre100, i32* %pre101, i32* %pre102, i32* %pre103, i32* %pre104) 157*9880d681SAndroid Build Coastguard Worker nounwind uwtable ssp { 158*9880d681SAndroid Build Coastguard Workerentry: 159*9880d681SAndroid Build Coastguard Worker br label %for.body 160*9880d681SAndroid Build Coastguard Workerfor.body: 161*9880d681SAndroid Build Coastguard Worker %indvars.iv42.i = phi i64 [ %indvars.iv.next43.i, %for.body ], [ 0, %entry ] 162*9880d681SAndroid Build Coastguard Worker %tmp57 = load i32, i32* %tmp56, align 4 163*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61 = getelementptr inbounds i32, i32* %pre, i64 %indvars.iv42.i 164*9880d681SAndroid Build Coastguard Worker %tmp58 = load i32, i32* %arrayidx12.us.i61, align 4 165*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.1 = getelementptr inbounds i32, i32* %tmp56, i64 1 166*9880d681SAndroid Build Coastguard Worker %tmp59 = load i32, i32* %arrayidx8.us.i.1, align 4 167*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.1 = getelementptr inbounds i32, i32* %pre94, i64 %indvars.iv42.i 168*9880d681SAndroid Build Coastguard Worker %tmp60 = load i32, i32* %arrayidx12.us.i61.1, align 4 169*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.2 = getelementptr inbounds i32, i32* %tmp56, i64 2 170*9880d681SAndroid Build Coastguard Worker %tmp61 = load i32, i32* %arrayidx8.us.i.2, align 4 171*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.2 = getelementptr inbounds i32, i32* %pre95, i64 %indvars.iv42.i 172*9880d681SAndroid Build Coastguard Worker %tmp62 = load i32, i32* %arrayidx12.us.i61.2, align 4 173*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.3 = getelementptr inbounds i32, i32* %tmp56, i64 3 174*9880d681SAndroid Build Coastguard Worker %tmp63 = load i32, i32* %arrayidx8.us.i.3, align 4 175*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.3 = getelementptr inbounds i32, i32* %pre96, i64 %indvars.iv42.i 176*9880d681SAndroid Build Coastguard Worker %tmp64 = load i32, i32* %arrayidx12.us.i61.3, align 4 177*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.4 = getelementptr inbounds i32, i32* %tmp56, i64 4 178*9880d681SAndroid Build Coastguard Worker %tmp65 = load i32, i32* %arrayidx8.us.i.4, align 4 179*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.4 = getelementptr inbounds i32, i32* %pre97, i64 %indvars.iv42.i 180*9880d681SAndroid Build Coastguard Worker %tmp66 = load i32, i32* %arrayidx12.us.i61.4, align 4 181*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.5 = getelementptr inbounds i32, i32* %tmp56, i64 5 182*9880d681SAndroid Build Coastguard Worker %tmp67 = load i32, i32* %arrayidx8.us.i.5, align 4 183*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.5 = getelementptr inbounds i32, i32* %pre98, i64 %indvars.iv42.i 184*9880d681SAndroid Build Coastguard Worker %tmp68 = load i32, i32* %arrayidx12.us.i61.5, align 4 185*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.6 = getelementptr inbounds i32, i32* %tmp56, i64 6 186*9880d681SAndroid Build Coastguard Worker %tmp69 = load i32, i32* %arrayidx8.us.i.6, align 4 187*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.6 = getelementptr inbounds i32, i32* %pre99, i64 %indvars.iv42.i 188*9880d681SAndroid Build Coastguard Worker %tmp70 = load i32, i32* %arrayidx12.us.i61.6, align 4 189*9880d681SAndroid Build Coastguard Worker %mul.us.i = mul nsw i32 %tmp58, %tmp57 190*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.7 = getelementptr inbounds i32, i32* %tmp56, i64 7 191*9880d681SAndroid Build Coastguard Worker %tmp71 = load i32, i32* %arrayidx8.us.i.7, align 4 192*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.7 = getelementptr inbounds i32, i32* %pre100, i64 %indvars.iv42.i 193*9880d681SAndroid Build Coastguard Worker %tmp72 = load i32, i32* %arrayidx12.us.i61.7, align 4 194*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.8 = getelementptr inbounds i32, i32* %tmp56, i64 8 195*9880d681SAndroid Build Coastguard Worker %tmp73 = load i32, i32* %arrayidx8.us.i.8, align 4 196*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.8 = getelementptr inbounds i32, i32* %pre101, i64 %indvars.iv42.i 197*9880d681SAndroid Build Coastguard Worker %tmp74 = load i32, i32* %arrayidx12.us.i61.8, align 4 198*9880d681SAndroid Build Coastguard Worker %arrayidx8.us.i.9 = getelementptr inbounds i32, i32* %tmp56, i64 9 199*9880d681SAndroid Build Coastguard Worker %tmp75 = load i32, i32* %arrayidx8.us.i.9, align 4 200*9880d681SAndroid Build Coastguard Worker %arrayidx12.us.i61.9 = getelementptr inbounds i32, i32* %pre102, i64 %indvars.iv42.i 201*9880d681SAndroid Build Coastguard Worker %tmp76 = load i32, i32* %arrayidx12.us.i61.9, align 4 202*9880d681SAndroid Build Coastguard Worker %mul.us.i.1 = mul nsw i32 %tmp60, %tmp59 203*9880d681SAndroid Build Coastguard Worker %add.us.i.1 = add nsw i32 %mul.us.i.1, %mul.us.i 204*9880d681SAndroid Build Coastguard Worker %mul.us.i.2 = mul nsw i32 %tmp62, %tmp61 205*9880d681SAndroid Build Coastguard Worker %add.us.i.2 = add nsw i32 %mul.us.i.2, %add.us.i.1 206*9880d681SAndroid Build Coastguard Worker %mul.us.i.3 = mul nsw i32 %tmp64, %tmp63 207*9880d681SAndroid Build Coastguard Worker %add.us.i.3 = add nsw i32 %mul.us.i.3, %add.us.i.2 208*9880d681SAndroid Build Coastguard Worker %mul.us.i.4 = mul nsw i32 %tmp66, %tmp65 209*9880d681SAndroid Build Coastguard Worker %add.us.i.4 = add nsw i32 %mul.us.i.4, %add.us.i.3 210*9880d681SAndroid Build Coastguard Worker %mul.us.i.5 = mul nsw i32 %tmp68, %tmp67 211*9880d681SAndroid Build Coastguard Worker %add.us.i.5 = add nsw i32 %mul.us.i.5, %add.us.i.4 212*9880d681SAndroid Build Coastguard Worker %mul.us.i.6 = mul nsw i32 %tmp70, %tmp69 213*9880d681SAndroid Build Coastguard Worker %add.us.i.6 = add nsw i32 %mul.us.i.6, %add.us.i.5 214*9880d681SAndroid Build Coastguard Worker %mul.us.i.7 = mul nsw i32 %tmp72, %tmp71 215*9880d681SAndroid Build Coastguard Worker %add.us.i.7 = add nsw i32 %mul.us.i.7, %add.us.i.6 216*9880d681SAndroid Build Coastguard Worker %mul.us.i.8 = mul nsw i32 %tmp74, %tmp73 217*9880d681SAndroid Build Coastguard Worker %add.us.i.8 = add nsw i32 %mul.us.i.8, %add.us.i.7 218*9880d681SAndroid Build Coastguard Worker %mul.us.i.9 = mul nsw i32 %tmp76, %tmp75 219*9880d681SAndroid Build Coastguard Worker %add.us.i.9 = add nsw i32 %mul.us.i.9, %add.us.i.8 220*9880d681SAndroid Build Coastguard Worker %arrayidx16.us.i = getelementptr inbounds i32, i32* %tmp55, i64 %indvars.iv42.i 221*9880d681SAndroid Build Coastguard Worker store i32 %add.us.i.9, i32* %arrayidx16.us.i, align 4 222*9880d681SAndroid Build Coastguard Worker %indvars.iv.next43.i = add i64 %indvars.iv42.i, 1 223*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next43.i to i32 224*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, 10 225*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %end, label %for.body 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerend: 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; A mildly interesting little block extracted from a cipher. The 232*9880d681SAndroid Build Coastguard Worker; balanced heuristics are interesting here because we have resource, 233*9880d681SAndroid Build Coastguard Worker; latency, and register limits all at once. For now, simply check that 234*9880d681SAndroid Build Coastguard Worker; we don't use any callee-saves. 235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @encpc1 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %entry 237*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: push 238*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pop 239*9880d681SAndroid Build Coastguard Worker; CHECK: ret 240*9880d681SAndroid Build Coastguard Worker@a = external global i32, align 4 241*9880d681SAndroid Build Coastguard Worker@b = external global i32, align 4 242*9880d681SAndroid Build Coastguard Worker@c = external global i32, align 4 243*9880d681SAndroid Build Coastguard Worker@d = external global i32, align 4 244*9880d681SAndroid Build Coastguard Workerdefine i32 @encpc1() nounwind { 245*9880d681SAndroid Build Coastguard Workerentry: 246*9880d681SAndroid Build Coastguard Worker %l1 = load i32, i32* @a, align 16 247*9880d681SAndroid Build Coastguard Worker %conv = shl i32 %l1, 8 248*9880d681SAndroid Build Coastguard Worker %s5 = lshr i32 %l1, 8 249*9880d681SAndroid Build Coastguard Worker %add = or i32 %conv, %s5 250*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* @b 251*9880d681SAndroid Build Coastguard Worker %l6 = load i32, i32* @a 252*9880d681SAndroid Build Coastguard Worker %l7 = load i32, i32* @c 253*9880d681SAndroid Build Coastguard Worker %add.i = add i32 %l7, %l6 254*9880d681SAndroid Build Coastguard Worker %idxprom.i = zext i32 %l7 to i64 255*9880d681SAndroid Build Coastguard Worker %arrayidx.i = getelementptr inbounds i32, i32* @d, i64 %idxprom.i 256*9880d681SAndroid Build Coastguard Worker %l8 = load i32, i32* %arrayidx.i 257*9880d681SAndroid Build Coastguard Worker store i32 346, i32* @c 258*9880d681SAndroid Build Coastguard Worker store i32 20021, i32* @d 259*9880d681SAndroid Build Coastguard Worker %l9 = load i32, i32* @a 260*9880d681SAndroid Build Coastguard Worker store i32 %l8, i32* @a 261*9880d681SAndroid Build Coastguard Worker store i32 %l9, i32* @b 262*9880d681SAndroid Build Coastguard Worker store i32 %add.i, i32* @c 263*9880d681SAndroid Build Coastguard Worker store i32 %l9, i32* @d 264*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp eq i32 %add.i, 0 265*9880d681SAndroid Build Coastguard Worker %s10 = lshr i32 %l1, 16 266*9880d681SAndroid Build Coastguard Worker %s12 = lshr i32 %l1, 24 267*9880d681SAndroid Build Coastguard Worker %s14 = lshr i32 %l1, 30 268*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %if, label %return 269*9880d681SAndroid Build Coastguard Workerif: 270*9880d681SAndroid Build Coastguard Worker %sa = add i32 %s5, %s10 271*9880d681SAndroid Build Coastguard Worker %sb = add i32 %sa, %s12 272*9880d681SAndroid Build Coastguard Worker %sc = add i32 %sb, %s14 273*9880d681SAndroid Build Coastguard Worker br label %return 274*9880d681SAndroid Build Coastguard Workerreturn: 275*9880d681SAndroid Build Coastguard Worker %result = phi i32 [0, %entry], [%sc, %if] 276*9880d681SAndroid Build Coastguard Worker ret i32 %result 277*9880d681SAndroid Build Coastguard Worker} 278