1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -branch-prob | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %i, i32* %a) { 5*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test1' 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker br label %body 8*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerbody: 11*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %next, %body ] 12*9880d681SAndroid Build Coastguard Worker %base = phi i32 [ 0, %entry ], [ %sum, %body ] 13*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i32 %iv 14*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx 15*9880d681SAndroid Build Coastguard Worker %sum = add nsw i32 %0, %base 16*9880d681SAndroid Build Coastguard Worker %next = add i32 %iv, 1 17*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %next, %i 18*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %exit, label %body 19*9880d681SAndroid Build Coastguard Worker; CHECK: edge body -> exit probability is 0x04000000 / 0x80000000 = 3.12% 20*9880d681SAndroid Build Coastguard Worker; CHECK: edge body -> body probability is 0x7c000000 / 0x80000000 = 96.88% [HOT edge] 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerexit: 23*9880d681SAndroid Build Coastguard Worker ret i32 %sum 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %i, i32 %a, i32 %b) { 27*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test2' 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %i, 42 30*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %then, label %else, !prof !0 31*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge] 32*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x07878788 / 0x80000000 = 5.88% 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerthen: 35*9880d681SAndroid Build Coastguard Worker br label %exit 36*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerelse: 39*9880d681SAndroid Build Coastguard Worker br label %exit 40*9880d681SAndroid Build Coastguard Worker; CHECK: edge else -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerexit: 43*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 44*9880d681SAndroid Build Coastguard Worker ret i32 %result 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 50*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test3' 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker switch i32 %i, label %case_a [ i32 1, label %case_b 53*9880d681SAndroid Build Coastguard Worker i32 2, label %case_c 54*9880d681SAndroid Build Coastguard Worker i32 3, label %case_d 55*9880d681SAndroid Build Coastguard Worker i32 4, label %case_e ], !prof !1 56*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_a probability is 0x06666666 / 0x80000000 = 5.00% 57*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_b probability is 0x06666666 / 0x80000000 = 5.00% 58*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_c probability is 0x66666666 / 0x80000000 = 80.00% 59*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_d probability is 0x06666666 / 0x80000000 = 5.00% 60*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_e probability is 0x06666666 / 0x80000000 = 5.00% 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workercase_a: 63*9880d681SAndroid Build Coastguard Worker br label %exit 64*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_a -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workercase_b: 67*9880d681SAndroid Build Coastguard Worker br label %exit 68*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_b -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workercase_c: 71*9880d681SAndroid Build Coastguard Worker br label %exit 72*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_c -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workercase_d: 75*9880d681SAndroid Build Coastguard Worker br label %exit 76*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_d -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workercase_e: 79*9880d681SAndroid Build Coastguard Worker br label %exit 80*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_e -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerexit: 83*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %case_a ], 84*9880d681SAndroid Build Coastguard Worker [ %b, %case_b ], 85*9880d681SAndroid Build Coastguard Worker [ %c, %case_c ], 86*9880d681SAndroid Build Coastguard Worker [ %d, %case_d ], 87*9880d681SAndroid Build Coastguard Worker [ %e, %case_e ] 88*9880d681SAndroid Build Coastguard Worker ret i32 %result 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %x) nounwind uwtable readnone ssp { 94*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test4' 95*9880d681SAndroid Build Coastguard Workerentry: 96*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %x to i64 97*9880d681SAndroid Build Coastguard Worker switch i64 %conv, label %return [ 98*9880d681SAndroid Build Coastguard Worker i64 0, label %sw.bb 99*9880d681SAndroid Build Coastguard Worker i64 1, label %sw.bb 100*9880d681SAndroid Build Coastguard Worker i64 2, label %sw.bb 101*9880d681SAndroid Build Coastguard Worker i64 5, label %sw.bb1 102*9880d681SAndroid Build Coastguard Worker ], !prof !2 103*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> return probability is 0x0a8a8a8b / 0x80000000 = 8.24% 104*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> sw.bb probability is 0x15151515 / 0x80000000 = 16.47% 105*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> sw.bb1 probability is 0x60606060 / 0x80000000 = 75.29% 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workersw.bb: 108*9880d681SAndroid Build Coastguard Worker br label %return 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workersw.bb1: 111*9880d681SAndroid Build Coastguard Worker br label %return 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerreturn: 114*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ 5, %sw.bb1 ], [ 1, %sw.bb ], [ 0, %entry ] 115*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdeclare void @coldfunc() cold 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %a, i32 %b, i1 %flag) { 123*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test5' 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker br i1 %flag, label %then, label %else 126*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x07878788 / 0x80000000 = 5.88% 127*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge] 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerthen: 130*9880d681SAndroid Build Coastguard Worker call void @coldfunc() 131*9880d681SAndroid Build Coastguard Worker br label %exit 132*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerelse: 135*9880d681SAndroid Build Coastguard Worker br label %exit 136*9880d681SAndroid Build Coastguard Worker; CHECK: edge else -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerexit: 139*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 140*9880d681SAndroid Build Coastguard Worker ret i32 %result 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare i32 @regular_function(i32 %i) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cold_call_sites(i32* %a) { 146*9880d681SAndroid Build Coastguard Worker; Test that edges to blocks post-dominated by cold call sites 147*9880d681SAndroid Build Coastguard Worker; are marked as not expected to be taken. 148*9880d681SAndroid Build Coastguard Worker; TODO(dnovillo) The calls to regular_function should not be merged, but 149*9880d681SAndroid Build Coastguard Worker; they are currently being merged. Convert this into a code generation test 150*9880d681SAndroid Build Coastguard Worker; after that is fixed. 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test_cold_call_sites' 153*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x07878788 / 0x80000000 = 5.88% 154*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge] 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i32, i32* %a, i32 1 158*9880d681SAndroid Build Coastguard Worker %val1 = load i32, i32* %gep1 159*9880d681SAndroid Build Coastguard Worker %cond1 = icmp ugt i32 %val1, 1 160*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %then, label %else 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerthen: 163*9880d681SAndroid Build Coastguard Worker ; This function is not declared cold, but this call site is. 164*9880d681SAndroid Build Coastguard Worker %val4 = call i32 @regular_function(i32 %val1) cold 165*9880d681SAndroid Build Coastguard Worker br label %exit 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerelse: 168*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i32, i32* %a, i32 2 169*9880d681SAndroid Build Coastguard Worker %val2 = load i32, i32* %gep2 170*9880d681SAndroid Build Coastguard Worker %val3 = call i32 @regular_function(i32 %val2) 171*9880d681SAndroid Build Coastguard Worker br label %exit 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerexit: 174*9880d681SAndroid Build Coastguard Worker %ret = phi i32 [ %val4, %then ], [ %val3, %else ] 175*9880d681SAndroid Build Coastguard Worker ret i32 %ret 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine i32 @zero1(i32 %i, i32 %a, i32 %b) { 179*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero1' 180*9880d681SAndroid Build Coastguard Workerentry: 181*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %i, 0 182*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %then, label %else 183*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x30000000 / 0x80000000 = 37.50% 184*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x50000000 / 0x80000000 = 62.50% 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerthen: 187*9880d681SAndroid Build Coastguard Worker br label %exit 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerelse: 190*9880d681SAndroid Build Coastguard Worker br label %exit 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerexit: 193*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 194*9880d681SAndroid Build Coastguard Worker ret i32 %result 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i32 @zero2(i32 %i, i32 %a, i32 %b) { 198*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero2' 199*9880d681SAndroid Build Coastguard Workerentry: 200*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %i, -1 201*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %then, label %else 202*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x50000000 / 0x80000000 = 62.50% 203*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x30000000 / 0x80000000 = 37.50% 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerthen: 206*9880d681SAndroid Build Coastguard Worker br label %exit 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerelse: 209*9880d681SAndroid Build Coastguard Worker br label %exit 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerexit: 212*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 213*9880d681SAndroid Build Coastguard Worker ret i32 %result 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine i32 @zero3(i32 %i, i32 %a, i32 %b) { 217*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero3' 218*9880d681SAndroid Build Coastguard Workerentry: 219*9880d681SAndroid Build Coastguard Worker; AND'ing with a single bit bitmask essentially leads to a bool comparison, 220*9880d681SAndroid Build Coastguard Worker; meaning we don't have probability information. 221*9880d681SAndroid Build Coastguard Worker %and = and i32 %i, 2 222*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 0 223*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %then, label %else 224*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x40000000 / 0x80000000 = 50.00% 225*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x40000000 / 0x80000000 = 50.00% 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerthen: 228*9880d681SAndroid Build Coastguard Worker; AND'ing with other bitmask might be something else, so we still assume the 229*9880d681SAndroid Build Coastguard Worker; usual probabilities. 230*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %i, 5 231*9880d681SAndroid Build Coastguard Worker %tobool2 = icmp eq i32 %and2, 0 232*9880d681SAndroid Build Coastguard Worker br i1 %tobool2, label %else, label %exit 233*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> else probability is 0x30000000 / 0x80000000 = 37.50% 234*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x50000000 / 0x80000000 = 62.50% 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerelse: 237*9880d681SAndroid Build Coastguard Worker br label %exit 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerexit: 240*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 241*9880d681SAndroid Build Coastguard Worker ret i32 %result 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244