brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.9 KiB · d09a85a Raw
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