1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s 3 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 %body 13 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 %iv 18 %0 = load i32, ptr %arrayidx 19 %sum = add nsw i32 %0, %base 20 %next = add i32 %iv, 1 21 %exitcond = icmp eq i32 %next, %i 22 br i1 %exitcond, label %exit, label %body 23 24exit: 25 ret i32 %sum 26} 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, 42 38 br i1 %cond, label %then, label %else, !prof !0 39 40then: 41 br label %exit 42 43else: 44 br label %exit 45 46exit: 47 %result = phi i32 [ %a, %then ], [ %b, %else ] 48 ret i32 %result 49} 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_b 69 i32 2, label %case_c 70 i32 3, label %case_d 71 i32 4, label %case_e ], !prof !1 72 73case_a: 74 br label %exit 75 76case_b: 77 br label %exit 78 79case_c: 80 br label %exit 81 82case_d: 83 br label %exit 84 85case_e: 86 br label %exit 87 88exit: 89 %result = phi i32 [ %a, %case_a ], [ %b, %case_b ], [ %c, %case_c ], [ %d, %case_d ], [ %e, %case_e ] 90 ret i32 %result 91} 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 i64 108 switch i64 %conv, label %return [ 109 i64 0, label %sw.bb 110 i64 1, label %sw.bb 111 i64 2, label %sw.bb 112 i64 5, label %sw.bb1 113 ], !prof !2 114 115sw.bb: 116 br label %return 117 118sw.bb1: 119 br label %return 120 121return: 122 %retval.0 = phi i32 [ 5, %sw.bb1 ], [ 1, %sw.bb ], [ 0, %entry ] 123 ret i32 %retval.0 124} 125 126!2 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64} 127 128declare void @coldfunc() cold 129 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 %else 140 141then: 142 call void @coldfunc() 143 br label %exit 144 145else: 146 br label %exit 147 148exit: 149 %result = phi i32 [ %a, %then ], [ %b, %else ] 150 ret i32 %result 151} 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, 42 164 br i1 %cond1, label %header, label %exit 165header: 166 br label %body 167 168body: 169 %cond2 = icmp eq i32 %b, 42 170 br i1 %cond2, label %header, label %exit 171exit: 172 call void @coldfunc() 173 ret i32 %b 174} 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 %else 192 193then: 194 br i1 %flag2, label %then2, label %else2, !prof !3 195 196then2: 197 br label %join 198 199else2: 200 br label %join 201 202join: 203 %joinresult = phi i32 [ %a, %then2 ], [ %b, %else2 ] 204 call void @coldfunc() 205 br label %exit 206 207else: 208 br label %exit 209 210exit: 211 %result = phi i32 [ %joinresult, %join ], [ %b, %else ] 212 ret i32 %result 213} 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 sites 219; are marked as not expected to be taken. 220; TODO(dnovillo) The calls to regular_function should not be merged, but 221; they are currently being merged. Convert this into a code generation test 222; 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 1 233 %val1 = load i32, ptr %gep1 234 %cond1 = icmp ugt i32 %val1, 1 235 br i1 %cond1, label %then, label %else 236 237then: 238 ; This function is not declared cold, but this call site is. 239 %val4 = call i32 @regular_function(i32 %val1) cold 240 br label %exit 241 242else: 243 %gep2 = getelementptr i32, ptr %a, i32 2 244 %val2 = load i32, ptr %gep2 245 %val3 = call i32 @regular_function(i32 %val2) 246 br label %exit 247 248exit: 249 %ret = phi i32 [ %val4, %then ], [ %val3, %else ] 250 ret i32 %ret 251} 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.end 265; Edge "entry->if.end" should have higher probability based on the cold call 266; heuristic which treat %if.then as a cold block because the normal destination 267; 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 %lpad 272 273invoke.cont: 274 call void @ColdFunc() #0 275 br label %if.end 276 277lpad: 278 %ll = landingpad { ptr, i32 } 279 cleanup 280 br label %if.end 281 282if.end: 283 ret i32 0 284} 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.end 298 299if.then: 300 invoke i32 @InvokeCall() 301 to label %invoke.cont unwind label %lpad 302; The cold call heuristic should not kick in when the cold callsite is in EH path. 303 304invoke.cont: 305 br label %if.end 306 307lpad: 308 %ll = landingpad { ptr, i32 } 309 cleanup 310 call void @ColdFunc() #0 311 br label %if.end 312 313if.end: 314 ret i32 0 315} 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.end 329 330if.then: 331 invoke i32 @InvokeCall() 332 to label %invoke.cont unwind label %lpad 333; Regardless of cold calls, edge weights from a invoke instruction should be 334; determined by the invoke heuristic. 335 336invoke.cont: 337 call void @ColdFunc() #0 338 br label %if.end 339 340lpad: 341 %ll = landingpad { ptr, i32 } 342 cleanup 343 call void @ColdFunc() #0 344 br label %if.end 345 346if.end: 347 ret i32 0 348} 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 %lpad 362 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 void 371 372invoke.to2: 373 ret void 374 375lpad: 376 %ll = landingpad { ptr, i32 } 377 cleanup 378 ret void 379} 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, 0 398 br i1 %cond, label %then, label %else 399 400then: 401 br label %exit 402 403else: 404 br label %exit 405 406exit: 407 %result = phi i32 [ %a, %then ], [ %b, %else ] 408 ret i32 %result 409} 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, -1 421 br i1 %cond, label %then, label %else 422 423then: 424 br label %exit 425 426else: 427 br label %exit 428 429exit: 430 %result = phi i32 [ %a, %then ], [ %b, %else ] 431 ret i32 %result 432} 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, 2 447 %tobool = icmp eq i32 %and, 0 448 br i1 %tobool, label %then, label %else 449 450then: 451; AND'ing with other bitmask might be something else, so we still assume the 452; usual probabilities. 453 %and2 = and i32 %i, 5 454 %tobool2 = icmp eq i32 %and2, 0 455 br i1 %tobool2, label %else, label %exit 456 457else: 458 br label %exit 459 460exit: 461 %result = phi i32 [ %a, %then ], [ %b, %else ] 462 ret i32 %result 463} 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, 42 473 br i1 %cond, label %exit, label %unr, !prof !4 474 475 476unr: 477 unreachable 478 479exit: 480 ret i32 %b 481} 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, 42 493 br i1 %cond, label %exit, label %unr, !prof !5 494 495 496unr: 497 unreachable 498 499exit: 500 ret i32 %b 501} 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, 42 513 br i1 %cond, label %exit, label %unr, !prof !6 514 515 516unr: 517 unreachable 518 519exit: 520 ret i32 %b 521} 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, 42 533 br i1 %cond, label %exit, label %unr, !prof !7 534 535 536unr: 537 unreachable 538 539exit: 540 ret i32 %b 541} 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_b 561 i32 2, label %case_c 562 i32 3, label %case_d 563 i32 4, label %case_e ], !prof !8 564; Reachable probabilities keep their relation: 4/64/4/4 = 5.26% / 84.21% / 5.26% / 5.26%. 565 566case_a: 567 unreachable 568 569case_b: 570 br label %exit 571 572case_c: 573 br label %exit 574 575case_d: 576 br label %exit 577 578case_e: 579 br label %exit 580 581exit: 582 %result = phi i32 [ %b, %case_b ], 583 [ %c, %case_c ], 584 [ %d, %case_d ], 585 [ %e, %case_e ] 586 ret i32 %result 587} 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_b 605 i32 2, label %case_c 606 i32 3, label %case_d 607 i32 4, label %case_e ], !prof !9 608; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%. 609 610 611case_a: 612 unreachable 613 614case_b: 615 unreachable 616 617case_c: 618 br label %exit 619 620case_d: 621 br label %exit 622 623case_e: 624 br label %exit 625 626exit: 627 %result = phi i32 [ %c, %case_c ], 628 [ %d, %case_d ], 629 [ %e, %case_e ] 630 ret i32 %result 631} 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_b 649 i32 2, label %case_c 650 i32 3, label %case_d 651 i32 4, label %case_e ], !prof !10 652; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%. 653 654case_a: 655 unreachable 656 657case_b: 658 unreachable 659 660case_c: 661 br label %exit 662 663case_d: 664 br label %exit 665 666case_e: 667 br label %exit 668 669exit: 670 %result = phi i32 [ %c, %case_c ], 671 [ %d, %case_d ], 672 [ %e, %case_e ] 673 ret i32 %result 674} 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_b 689 i32 2, label %case_c 690 i32 3, label %case_d 691 i32 4, label %case_e ], !prof !11 692 693case_a: 694 unreachable 695 696case_b: 697 unreachable 698 699case_c: 700 unreachable 701 702case_d: 703 unreachable 704 705case_e: 706 unreachable 707 708} 709 710!11 = !{!"branch_weights", i32 0, i32 4, i32 64, i32 4, i32 4} 711