711 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s3 4define i32 @test1(i32 %i, ptr %a) {5; CHECK-LABEL: 'test1'6; CHECK-NEXT: ---- Branch Probabilities ----7; CHECK-NEXT: edge %entry -> %body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]8; CHECK-NEXT: edge %body -> %exit probability is 0x04000000 / 0x80000000 = 3.12%9; CHECK-NEXT: edge %body -> %body probability is 0x7c000000 / 0x80000000 = 96.88% [HOT edge]10;11entry:12 br label %body13 14body:15 %iv = phi i32 [ 0, %entry ], [ %next, %body ]16 %base = phi i32 [ 0, %entry ], [ %sum, %body ]17 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %iv18 %0 = load i32, ptr %arrayidx19 %sum = add nsw i32 %0, %base20 %next = add i32 %iv, 121 %exitcond = icmp eq i32 %next, %i22 br i1 %exitcond, label %exit, label %body23 24exit:25 ret i32 %sum26}27 28define i32 @test2(i32 %i, i32 %a, i32 %b) {29; CHECK-LABEL: 'test2'30; CHECK-NEXT: ---- Branch Probabilities ----31; CHECK-NEXT: edge %entry -> %then probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]32; CHECK-NEXT: edge %entry -> %else probability is 0x07878788 / 0x80000000 = 5.88%33; CHECK-NEXT: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]34; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]35;36entry:37 %cond = icmp ult i32 %i, 4238 br i1 %cond, label %then, label %else, !prof !039 40then:41 br label %exit42 43else:44 br label %exit45 46exit:47 %result = phi i32 [ %a, %then ], [ %b, %else ]48 ret i32 %result49}50 51!0 = !{!"branch_weights", i32 64, i32 4}52 53define i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {54; CHECK-LABEL: 'test3'55; CHECK-NEXT: ---- Branch Probabilities ----56; CHECK-NEXT: edge %entry -> %case_a probability is 0x06666666 / 0x80000000 = 5.00%57; CHECK-NEXT: edge %entry -> %case_b probability is 0x06666666 / 0x80000000 = 5.00%58; CHECK-NEXT: edge %entry -> %case_c probability is 0x66666666 / 0x80000000 = 80.00%59; CHECK-NEXT: edge %entry -> %case_d probability is 0x06666666 / 0x80000000 = 5.00%60; CHECK-NEXT: edge %entry -> %case_e probability is 0x06666666 / 0x80000000 = 5.00%61; CHECK-NEXT: edge %case_a -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]62; CHECK-NEXT: edge %case_b -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]63; CHECK-NEXT: edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]64; CHECK-NEXT: edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]65; CHECK-NEXT: edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]66;67entry:68 switch i32 %i, label %case_a [ i32 1, label %case_b69 i32 2, label %case_c70 i32 3, label %case_d71 i32 4, label %case_e ], !prof !172 73case_a:74 br label %exit75 76case_b:77 br label %exit78 79case_c:80 br label %exit81 82case_d:83 br label %exit84 85case_e:86 br label %exit87 88exit:89 %result = phi i32 [ %a, %case_a ], [ %b, %case_b ], [ %c, %case_c ], [ %d, %case_d ], [ %e, %case_e ]90 ret i32 %result91}92 93!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}94 95define i32 @test4(i32 %x) nounwind uwtable readnone ssp {96; CHECK-LABEL: 'test4'97; CHECK-NEXT: ---- Branch Probabilities ----98; CHECK-NEXT: edge %entry -> %return probability is 0x0a8a8a8b / 0x80000000 = 8.24%99; CHECK-NEXT: edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%100; CHECK-NEXT: edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%101; CHECK-NEXT: edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%102; CHECK-NEXT: edge %entry -> %sw.bb1 probability is 0x60606060 / 0x80000000 = 75.29%103; CHECK-NEXT: edge %sw.bb -> %return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]104; CHECK-NEXT: edge %sw.bb1 -> %return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]105;106entry:107 %conv = sext i32 %x to i64108 switch i64 %conv, label %return [109 i64 0, label %sw.bb110 i64 1, label %sw.bb111 i64 2, label %sw.bb112 i64 5, label %sw.bb1113 ], !prof !2114 115sw.bb:116 br label %return117 118sw.bb1:119 br label %return120 121return:122 %retval.0 = phi i32 [ 5, %sw.bb1 ], [ 1, %sw.bb ], [ 0, %entry ]123 ret i32 %retval.0124}125 126!2 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64}127 128declare void @coldfunc() cold129 130define i32 @test5(i32 %a, i32 %b, i1 %flag) {131; CHECK-LABEL: 'test5'132; CHECK-NEXT: ---- Branch Probabilities ----133; CHECK-NEXT: edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%134; CHECK-NEXT: edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]135; CHECK-NEXT: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]136; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]137;138entry:139 br i1 %flag, label %then, label %else140 141then:142 call void @coldfunc()143 br label %exit144 145else:146 br label %exit147 148exit:149 %result = phi i32 [ %a, %then ], [ %b, %else ]150 ret i32 %result151}152 153define i32 @test_cold_loop(i32 %a, i32 %b) {154; CHECK-LABEL: 'test_cold_loop'155; CHECK-NEXT: ---- Branch Probabilities ----156; CHECK-NEXT: edge %entry -> %header probability is 0x40000000 / 0x80000000 = 50.00%157; CHECK-NEXT: edge %entry -> %exit probability is 0x40000000 / 0x80000000 = 50.00%158; CHECK-NEXT: edge %header -> %body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]159; CHECK-NEXT: edge %body -> %header probability is 0x7fbe1203 / 0x80000000 = 99.80% [HOT edge]160; CHECK-NEXT: edge %body -> %exit probability is 0x0041edfd / 0x80000000 = 0.20%161;162entry:163 %cond1 = icmp eq i32 %a, 42164 br i1 %cond1, label %header, label %exit165header:166 br label %body167 168body:169 %cond2 = icmp eq i32 %b, 42170 br i1 %cond2, label %header, label %exit171exit:172 call void @coldfunc()173 ret i32 %b174}175 176declare i32 @regular_function(i32 %i)177 178define i32 @test_cold_call_sites_with_prof(i32 %a, i32 %b, i1 %flag, i1 %flag2) {179; CHECK-LABEL: 'test_cold_call_sites_with_prof'180; CHECK-NEXT: ---- Branch Probabilities ----181; CHECK-NEXT: edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%182; CHECK-NEXT: edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]183; CHECK-NEXT: edge %then -> %then2 probability is 0x7ebb907a / 0x80000000 = 99.01% [HOT edge]184; CHECK-NEXT: edge %then -> %else2 probability is 0x01446f86 / 0x80000000 = 0.99%185; CHECK-NEXT: edge %then2 -> %join probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]186; CHECK-NEXT: edge %else2 -> %join probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]187; CHECK-NEXT: edge %join -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]188; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]189;190entry:191 br i1 %flag, label %then, label %else192 193then:194 br i1 %flag2, label %then2, label %else2, !prof !3195 196then2:197 br label %join198 199else2:200 br label %join201 202join:203 %joinresult = phi i32 [ %a, %then2 ], [ %b, %else2 ]204 call void @coldfunc()205 br label %exit206 207else:208 br label %exit209 210exit:211 %result = phi i32 [ %joinresult, %join ], [ %b, %else ]212 ret i32 %result213}214 215!3 = !{!"branch_weights", i32 100, i32 1}216 217define i32 @test_cold_call_sites(ptr %a) {218; Test that edges to blocks post-dominated by cold call sites219; are marked as not expected to be taken.220; TODO(dnovillo) The calls to regular_function should not be merged, but221; they are currently being merged. Convert this into a code generation test222; after that is fixed.223; CHECK-LABEL: 'test_cold_call_sites'224; CHECK-NEXT: ---- Branch Probabilities ----225; CHECK-NEXT: edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%226; CHECK-NEXT: edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]227; CHECK-NEXT: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]228; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]229;230 231entry:232 %gep1 = getelementptr i32, ptr %a, i32 1233 %val1 = load i32, ptr %gep1234 %cond1 = icmp ugt i32 %val1, 1235 br i1 %cond1, label %then, label %else236 237then:238 ; This function is not declared cold, but this call site is.239 %val4 = call i32 @regular_function(i32 %val1) cold240 br label %exit241 242else:243 %gep2 = getelementptr i32, ptr %a, i32 2244 %val2 = load i32, ptr %gep2245 %val3 = call i32 @regular_function(i32 %val2)246 br label %exit247 248exit:249 %ret = phi i32 [ %val4, %then ], [ %val3, %else ]250 ret i32 %ret251}252 253define i32 @test_invoke_code_callsite1(i1 %c) personality ptr @__gxx_personality_v0 {254; CHECK-LABEL: 'test_invoke_code_callsite1'255; CHECK-NEXT: ---- Branch Probabilities ----256; CHECK-NEXT: edge %entry -> %if.then probability is 0x078780e3 / 0x80000000 = 5.88%257; CHECK-NEXT: edge %entry -> %if.end probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]258; CHECK-NEXT: edge %if.then -> %invoke.cont probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]259; CHECK-NEXT: edge %if.then -> %lpad probability is 0x00008000 / 0x80000000 = 0.00%260; CHECK-NEXT: edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]261; CHECK-NEXT: edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]262;263entry:264 br i1 %c, label %if.then, label %if.end265; Edge "entry->if.end" should have higher probability based on the cold call266; heuristic which treat %if.then as a cold block because the normal destination267; of the invoke instruction in %if.then is post-dominated by ColdFunc().268 269if.then:270 invoke i32 @InvokeCall()271 to label %invoke.cont unwind label %lpad272 273invoke.cont:274 call void @ColdFunc() #0275 br label %if.end276 277lpad:278 %ll = landingpad { ptr, i32 }279 cleanup280 br label %if.end281 282if.end:283 ret i32 0284}285 286define i32 @test_invoke_code_callsite2(i1 %c) personality ptr @__gxx_personality_v0 {287; CHECK-LABEL: 'test_invoke_code_callsite2'288; CHECK-NEXT: ---- Branch Probabilities ----289; CHECK-NEXT: edge %entry -> %if.then probability is 0x40000000 / 0x80000000 = 50.00%290; CHECK-NEXT: edge %entry -> %if.end probability is 0x40000000 / 0x80000000 = 50.00%291; CHECK-NEXT: edge %if.then -> %invoke.cont probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]292; CHECK-NEXT: edge %if.then -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%293; CHECK-NEXT: edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]294; CHECK-NEXT: edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]295;296entry:297 br i1 %c, label %if.then, label %if.end298 299if.then:300 invoke i32 @InvokeCall()301 to label %invoke.cont unwind label %lpad302; The cold call heuristic should not kick in when the cold callsite is in EH path.303 304invoke.cont:305 br label %if.end306 307lpad:308 %ll = landingpad { ptr, i32 }309 cleanup310 call void @ColdFunc() #0311 br label %if.end312 313if.end:314 ret i32 0315}316 317define i32 @test_invoke_code_callsite3(i1 %c) personality ptr @__gxx_personality_v0 {318; CHECK-LABEL: 'test_invoke_code_callsite3'319; CHECK-NEXT: ---- Branch Probabilities ----320; CHECK-NEXT: edge %entry -> %if.then probability is 0x078780e3 / 0x80000000 = 5.88%321; CHECK-NEXT: edge %entry -> %if.end probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]322; CHECK-NEXT: edge %if.then -> %invoke.cont probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]323; CHECK-NEXT: edge %if.then -> %lpad probability is 0x00008000 / 0x80000000 = 0.00%324; CHECK-NEXT: edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]325; CHECK-NEXT: edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]326;327entry:328 br i1 %c, label %if.then, label %if.end329 330if.then:331 invoke i32 @InvokeCall()332 to label %invoke.cont unwind label %lpad333; Regardless of cold calls, edge weights from a invoke instruction should be334; determined by the invoke heuristic.335 336invoke.cont:337 call void @ColdFunc() #0338 br label %if.end339 340lpad:341 %ll = landingpad { ptr, i32 }342 cleanup343 call void @ColdFunc() #0344 br label %if.end345 346if.end:347 ret i32 0348}349 350define void @test_invoke_code_profiled(i1 %c) personality ptr @__gxx_personality_v0 {351; CHECK-LABEL: 'test_invoke_code_profiled'352; CHECK-NEXT: ---- Branch Probabilities ----353; CHECK-NEXT: edge %entry -> %invoke.to0 probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]354; CHECK-NEXT: edge %entry -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%355; CHECK-NEXT: edge %invoke.to0 -> %invoke.to1 probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]356; CHECK-NEXT: edge %invoke.to0 -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%357; CHECK-NEXT: edge %invoke.to1 -> %invoke.to2 probability is 0x55555555 / 0x80000000 = 66.67%358; CHECK-NEXT: edge %invoke.to1 -> %lpad probability is 0x2aaaaaab / 0x80000000 = 33.33%359;360entry:361 invoke i32 @InvokeCall() to label %invoke.to0 unwind label %lpad362 363invoke.to0:364 invoke i32 @InvokeCall() to label %invoke.to1 unwind label %lpad,365 !prof !{!"branch_weights", i32 444}366 367invoke.to1:368 invoke i32 @InvokeCall() to label %invoke.to2 unwind label %lpad,369 !prof !{!"branch_weights", i32 222, i32 111}370 ret void371 372invoke.to2:373 ret void374 375lpad:376 %ll = landingpad { ptr, i32 }377 cleanup378 ret void379}380 381declare i32 @__gxx_personality_v0(...)382declare void @ColdFunc()383declare i32 @InvokeCall()384 385attributes #0 = { cold }386 387 388define i32 @zero1(i32 %i, i32 %a, i32 %b) {389; CHECK-LABEL: 'zero1'390; CHECK-NEXT: ---- Branch Probabilities ----391; CHECK-NEXT: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%392; CHECK-NEXT: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%393; CHECK-NEXT: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]394; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]395;396entry:397 %cond = icmp eq i32 %i, 0398 br i1 %cond, label %then, label %else399 400then:401 br label %exit402 403else:404 br label %exit405 406exit:407 %result = phi i32 [ %a, %then ], [ %b, %else ]408 ret i32 %result409}410 411define i32 @zero2(i32 %i, i32 %a, i32 %b) {412; CHECK-LABEL: 'zero2'413; CHECK-NEXT: ---- Branch Probabilities ----414; CHECK-NEXT: edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%415; CHECK-NEXT: edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%416; CHECK-NEXT: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]417; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]418;419entry:420 %cond = icmp ne i32 %i, -1421 br i1 %cond, label %then, label %else422 423then:424 br label %exit425 426else:427 br label %exit428 429exit:430 %result = phi i32 [ %a, %then ], [ %b, %else ]431 ret i32 %result432}433 434define i32 @zero3(i32 %i, i32 %a, i32 %b) {435; CHECK-LABEL: 'zero3'436; CHECK-NEXT: ---- Branch Probabilities ----437; CHECK-NEXT: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%438; CHECK-NEXT: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%439; CHECK-NEXT: edge %then -> %else probability is 0x30000000 / 0x80000000 = 37.50%440; CHECK-NEXT: edge %then -> %exit probability is 0x50000000 / 0x80000000 = 62.50%441; CHECK-NEXT: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]442;443entry:444; AND'ing with a single bit bitmask essentially leads to a bool comparison,445; meaning we don't have probability information.446 %and = and i32 %i, 2447 %tobool = icmp eq i32 %and, 0448 br i1 %tobool, label %then, label %else449 450then:451; AND'ing with other bitmask might be something else, so we still assume the452; usual probabilities.453 %and2 = and i32 %i, 5454 %tobool2 = icmp eq i32 %and2, 0455 br i1 %tobool2, label %else, label %exit456 457else:458 br label %exit459 460exit:461 %result = phi i32 [ %a, %then ], [ %b, %else ]462 ret i32 %result463}464 465define i32 @test_unreachable_with_prof_greater(i32 %a, i32 %b) {466; CHECK-LABEL: 'test_unreachable_with_prof_greater'467; CHECK-NEXT: ---- Branch Probabilities ----468; CHECK-NEXT: edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]469; CHECK-NEXT: edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%470;471entry:472 %cond = icmp eq i32 %a, 42473 br i1 %cond, label %exit, label %unr, !prof !4474 475 476unr:477 unreachable478 479exit:480 ret i32 %b481}482 483!4 = !{!"branch_weights", i32 0, i32 1}484 485define i32 @test_unreachable_with_prof_equal(i32 %a, i32 %b) {486; CHECK-LABEL: 'test_unreachable_with_prof_equal'487; CHECK-NEXT: ---- Branch Probabilities ----488; CHECK-NEXT: edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]489; CHECK-NEXT: edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%490;491entry:492 %cond = icmp eq i32 %a, 42493 br i1 %cond, label %exit, label %unr, !prof !5494 495 496unr:497 unreachable498 499exit:500 ret i32 %b501}502 503!5 = !{!"branch_weights", i32 2147483647, i32 1}504 505define i32 @test_unreachable_with_prof_zero(i32 %a, i32 %b) {506; CHECK-LABEL: 'test_unreachable_with_prof_zero'507; CHECK-NEXT: ---- Branch Probabilities ----508; CHECK-NEXT: edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]509; CHECK-NEXT: edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%510;511entry:512 %cond = icmp eq i32 %a, 42513 br i1 %cond, label %exit, label %unr, !prof !6514 515 516unr:517 unreachable518 519exit:520 ret i32 %b521}522 523!6 = !{!"branch_weights", i32 0, i32 0}524 525define i32 @test_unreachable_with_prof_less(i32 %a, i32 %b) {526; CHECK-LABEL: 'test_unreachable_with_prof_less'527; CHECK-NEXT: ---- Branch Probabilities ----528; CHECK-NEXT: edge %entry -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]529; CHECK-NEXT: edge %entry -> %unr probability is 0x00000000 / 0x80000000 = 0.00%530;531entry:532 %cond = icmp eq i32 %a, 42533 br i1 %cond, label %exit, label %unr, !prof !7534 535 536unr:537 unreachable538 539exit:540 ret i32 %b541}542 543!7 = !{!"branch_weights", i32 1, i32 0}544 545define i32 @test_unreachable_with_switch_prof1(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {546; CHECK-LABEL: 'test_unreachable_with_switch_prof1'547; CHECK-NEXT: ---- Branch Probabilities ----548; CHECK-NEXT: edge %entry -> %case_a probability is 0x00000001 / 0x80000000 = 0.00%549; CHECK-NEXT: edge %entry -> %case_b probability is 0x06bca1af / 0x80000000 = 5.26%550; CHECK-NEXT: edge %entry -> %case_c probability is 0x6bca1af3 / 0x80000000 = 84.21% [HOT edge]551; CHECK-NEXT: edge %entry -> %case_d probability is 0x06bca1af / 0x80000000 = 5.26%552; CHECK-NEXT: edge %entry -> %case_e probability is 0x06bca1af / 0x80000000 = 5.26%553; CHECK-NEXT: edge %case_b -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]554; CHECK-NEXT: edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]555; CHECK-NEXT: edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]556; CHECK-NEXT: edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]557;558entry:559 switch i32 %i, label %case_a [560 i32 1, label %case_b561 i32 2, label %case_c562 i32 3, label %case_d563 i32 4, label %case_e ], !prof !8564; Reachable probabilities keep their relation: 4/64/4/4 = 5.26% / 84.21% / 5.26% / 5.26%.565 566case_a:567 unreachable568 569case_b:570 br label %exit571 572case_c:573 br label %exit574 575case_d:576 br label %exit577 578case_e:579 br label %exit580 581exit:582 %result = phi i32 [ %b, %case_b ],583 [ %c, %case_c ],584 [ %d, %case_d ],585 [ %e, %case_e ]586 ret i32 %result587}588 589!8 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}590 591define i32 @test_unreachable_with_switch_prof2(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {592; CHECK-LABEL: 'test_unreachable_with_switch_prof2'593; CHECK-NEXT: ---- Branch Probabilities ----594; CHECK-NEXT: edge %entry -> %case_a probability is 0x00000001 / 0x80000000 = 0.00%595; CHECK-NEXT: edge %entry -> %case_b probability is 0x00000001 / 0x80000000 = 0.00%596; CHECK-NEXT: edge %entry -> %case_c probability is 0x71c71c71 / 0x80000000 = 88.89% [HOT edge]597; CHECK-NEXT: edge %entry -> %case_d probability is 0x071c71c7 / 0x80000000 = 5.56%598; CHECK-NEXT: edge %entry -> %case_e probability is 0x071c71c7 / 0x80000000 = 5.56%599; CHECK-NEXT: edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]600; CHECK-NEXT: edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]601; CHECK-NEXT: edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]602;603entry:604 switch i32 %i, label %case_a [ i32 1, label %case_b605 i32 2, label %case_c606 i32 3, label %case_d607 i32 4, label %case_e ], !prof !9608; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%.609 610 611case_a:612 unreachable613 614case_b:615 unreachable616 617case_c:618 br label %exit619 620case_d:621 br label %exit622 623case_e:624 br label %exit625 626exit:627 %result = phi i32 [ %c, %case_c ],628 [ %d, %case_d ],629 [ %e, %case_e ]630 ret i32 %result631}632 633!9 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}634 635define i32 @test_unreachable_with_switch_prof3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {636; CHECK-LABEL: 'test_unreachable_with_switch_prof3'637; CHECK-NEXT: ---- Branch Probabilities ----638; CHECK-NEXT: edge %entry -> %case_a probability is 0x00000000 / 0x80000000 = 0.00%639; CHECK-NEXT: edge %entry -> %case_b probability is 0x00000001 / 0x80000000 = 0.00%640; CHECK-NEXT: edge %entry -> %case_c probability is 0x71c71c71 / 0x80000000 = 88.89% [HOT edge]641; CHECK-NEXT: edge %entry -> %case_d probability is 0x071c71c7 / 0x80000000 = 5.56%642; CHECK-NEXT: edge %entry -> %case_e probability is 0x071c71c7 / 0x80000000 = 5.56%643; CHECK-NEXT: edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]644; CHECK-NEXT: edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]645; CHECK-NEXT: edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]646;647entry:648 switch i32 %i, label %case_a [ i32 1, label %case_b649 i32 2, label %case_c650 i32 3, label %case_d651 i32 4, label %case_e ], !prof !10652; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%.653 654case_a:655 unreachable656 657case_b:658 unreachable659 660case_c:661 br label %exit662 663case_d:664 br label %exit665 666case_e:667 br label %exit668 669exit:670 %result = phi i32 [ %c, %case_c ],671 [ %d, %case_d ],672 [ %e, %case_e ]673 ret i32 %result674}675 676!10 = !{!"branch_weights", i32 0, i32 4, i32 64, i32 4, i32 4}677 678define i32 @test_unreachable_with_switch_prof4(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {679; CHECK-LABEL: 'test_unreachable_with_switch_prof4'680; CHECK-NEXT: ---- Branch Probabilities ----681; CHECK-NEXT: edge %entry -> %case_a probability is 0x1999999a / 0x80000000 = 20.00%682; CHECK-NEXT: edge %entry -> %case_b probability is 0x1999999a / 0x80000000 = 20.00%683; CHECK-NEXT: edge %entry -> %case_c probability is 0x1999999a / 0x80000000 = 20.00%684; CHECK-NEXT: edge %entry -> %case_d probability is 0x1999999a / 0x80000000 = 20.00%685; CHECK-NEXT: edge %entry -> %case_e probability is 0x1999999a / 0x80000000 = 20.00%686;687entry:688 switch i32 %i, label %case_a [ i32 1, label %case_b689 i32 2, label %case_c690 i32 3, label %case_d691 i32 4, label %case_e ], !prof !11692 693case_a:694 unreachable695 696case_b:697 unreachable698 699case_c:700 unreachable701 702case_d:703 unreachable704 705case_e:706 unreachable707 708}709 710!11 = !{!"branch_weights", i32 0, i32 4, i32 64, i32 4, i32 4}711