1f72b76cdSArthur Eubanks; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance.prof | opt -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s 2f72b76cdSArthur Eubanks; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK2 393a2c291Sspupyrev 413d1364aSspupyrev; The test contains a "diamond" and a "triangle" that needs to be rebalanced 593a2c291Sspupyrev; after basic profile inference. 693a2c291Sspupyrev; 793a2c291Sspupyrev; +----------------+ 893a2c291Sspupyrev; | b11 [?] | 993a2c291Sspupyrev; +----------------+ 1093a2c291Sspupyrev; | 1193a2c291Sspupyrev; v 1293a2c291Sspupyrev; +----------+ +----------------+ 1393a2c291Sspupyrev; | b13 [10] | <-- | b12 [65536] | 1493a2c291Sspupyrev; +----------+ +----------------+ 1593a2c291Sspupyrev; | 1693a2c291Sspupyrev; v 1793a2c291Sspupyrev; +----------+ +----------------+ 1893a2c291Sspupyrev; | b16 [?] | <-- | b14 [65536] | 1993a2c291Sspupyrev; +----------+ +----------------+ 2093a2c291Sspupyrev; | | 2193a2c291Sspupyrev; | v 2293a2c291Sspupyrev; | +----------------+ 2393a2c291Sspupyrev; | | b15 [?] | 2493a2c291Sspupyrev; | +----------------+ 2593a2c291Sspupyrev; | | 2693a2c291Sspupyrev; | v 2793a2c291Sspupyrev; | +----------------+ 2893a2c291Sspupyrev; +------------> | b17 [65536] | -+ 2993a2c291Sspupyrev; +----------------+ | 3093a2c291Sspupyrev; | | 3193a2c291Sspupyrev; v | 3293a2c291Sspupyrev; +----------------+ | 3393a2c291Sspupyrev; | b18 [?] | | 3493a2c291Sspupyrev; +----------------+ | 3593a2c291Sspupyrev; | | 3693a2c291Sspupyrev; v | 3793a2c291Sspupyrev; +----------------+ | 3893a2c291Sspupyrev; | b19 [65536] | <+ 3993a2c291Sspupyrev; +----------------+ 4093a2c291Sspupyrev; | 4193a2c291Sspupyrev; v 4293a2c291Sspupyrev; +----------------+ 4393a2c291Sspupyrev; | b110 [65536] | 4493a2c291Sspupyrev; +----------------+ 4593a2c291Sspupyrev 4693a2c291Sspupyrev@yydebug = dso_local global i32 0, align 4 4793a2c291Sspupyrev 4893a2c291Sspupyrev; Function Attrs: nounwind uwtable 4993a2c291Sspupyrevdefine dso_local i32 @countMultipliers(i32 %0, i32 %1) #0 { 5093a2c291Sspupyrevb11: 5193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 1, i32 0, i64 -1) 5293a2c291Sspupyrev %cmp = icmp ne i32 %0, 0 5393a2c291Sspupyrev br label %b12 5493a2c291Sspupyrev; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 65546 5593a2c291Sspupyrev 5693a2c291Sspupyrevb12: 5793a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 2, i32 0, i64 -1) 5893a2c291Sspupyrev br i1 %cmp, label %b14, label %b13 5993a2c291Sspupyrev; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 65546 6093a2c291Sspupyrev 6193a2c291Sspupyrevb13: 6293a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 3, i32 0, i64 -1) 6393a2c291Sspupyrev ret i32 %1 6493a2c291Sspupyrev; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 10 6593a2c291Sspupyrev 6693a2c291Sspupyrevb14: 6793a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 4, i32 0, i64 -1) 6893a2c291Sspupyrev br i1 %cmp, label %b15, label %b16 69*bb6497ffSMircea Trofin; CHECK: edge %b14 -> %b15 probability is 0x40000000 / 0x80000000 = 50.00% 70*bb6497ffSMircea Trofin; CHECK: edge %b14 -> %b16 probability is 0x40000000 / 0x80000000 = 50.00% 7193a2c291Sspupyrev; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 65536 7293a2c291Sspupyrev 7393a2c291Sspupyrevb15: 7493a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 5, i32 0, i64 -1) 7593a2c291Sspupyrev br label %b17 7693a2c291Sspupyrev; CHECK2: - b15: float = {{.*}}, int = {{.*}}, count = 32768 7793a2c291Sspupyrev 7893a2c291Sspupyrevb16: 7993a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 6, i32 0, i64 -1) 8093a2c291Sspupyrev br label %b17 8193a2c291Sspupyrev; CHECK2: - b16: float = {{.*}}, int = {{.*}}, count = 32768 8293a2c291Sspupyrev 8393a2c291Sspupyrevb17: 8493a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 7, i32 0, i64 -1) 8593a2c291Sspupyrev br i1 %cmp, label %b18, label %b19 86*bb6497ffSMircea Trofin; CHECK: edge %b17 -> %b18 probability is 0x40000000 / 0x80000000 = 50.00% 87*bb6497ffSMircea Trofin; CHECK: edge %b17 -> %b19 probability is 0x40000000 / 0x80000000 = 50.00% 8893a2c291Sspupyrev; CHECK2: - b17: float = {{.*}}, int = {{.*}}, count = 65536 8993a2c291Sspupyrev 9093a2c291Sspupyrevb18: 9193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 8, i32 0, i64 -1) 9293a2c291Sspupyrev br label %b19 9393a2c291Sspupyrev; CHECK2: - b18: float = {{.*}}, int = {{.*}}, count = 32768 9493a2c291Sspupyrev 9593a2c291Sspupyrevb19: 9693a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 9, i32 0, i64 -1) 9793a2c291Sspupyrev br label %b110 9893a2c291Sspupyrev; CHECK2: - b19: float = {{.*}}, int = {{.*}}, count = 65536 9993a2c291Sspupyrev 10093a2c291Sspupyrevb110: 10193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 10, i32 0, i64 -1) 10293a2c291Sspupyrev ret i32 %1 10393a2c291Sspupyrev; CHECK2: - b110: float = {{.*}}, int = {{.*}}, count = 65536 10493a2c291Sspupyrev} 10593a2c291Sspupyrev 10693a2c291Sspupyrev 10793a2c291Sspupyrev; The test contains a triangle comprised of dangling blocks. 10893a2c291Sspupyrev; 10993a2c291Sspupyrev; +-----------+ 11093a2c291Sspupyrev; | b0 [2100] | -+ 11193a2c291Sspupyrev; +-----------+ | 11293a2c291Sspupyrev; | | 11393a2c291Sspupyrev; | | 11493a2c291Sspupyrev; v | 11593a2c291Sspupyrev; +-----------+ | 11693a2c291Sspupyrev; +- | b1 [2000] | | 11793a2c291Sspupyrev; | +-----------+ | 11893a2c291Sspupyrev; | | | 11993a2c291Sspupyrev; | | | 12093a2c291Sspupyrev; | v | 12193a2c291Sspupyrev; +--------+ | +-----------+ | 12293a2c291Sspupyrev; | b4 [?] | <-----+- | b2 [?] | | 12393a2c291Sspupyrev; +--------+ | +-----------+ | 12493a2c291Sspupyrev; | | | | 12593a2c291Sspupyrev; | | | | 12693a2c291Sspupyrev; | | v | 12793a2c291Sspupyrev; | | +-----------+ | 12893a2c291Sspupyrev; | +> | b3 [?] | | 12993a2c291Sspupyrev; | +-----------+ | 13093a2c291Sspupyrev; | | | 13193a2c291Sspupyrev; | | | 13293a2c291Sspupyrev; | v | 13393a2c291Sspupyrev; | +-----------+ | 13493a2c291Sspupyrev; +---------------> | b5 [2100] | <+ 13593a2c291Sspupyrev; +-----------+ 13693a2c291Sspupyrev 13793a2c291Sspupyrevdefine dso_local i32 @countMultipliers2(i32 %0, i32 %1) #0 { 13893a2c291Sspupyrevb0: 13993a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 1, i32 0, i64 -1) 14093a2c291Sspupyrev %cmp = icmp ne i32 %0, 0 14193a2c291Sspupyrev br i1 %cmp, label %b1, label %b5 142*bb6497ffSMircea Trofin; CHECK: edge %b0 -> %b1 probability is 0x79e79e7a / 0x80000000 = 95.24% [HOT edge] 143*bb6497ffSMircea Trofin; CHECK: edge %b0 -> %b5 probability is 0x06186186 / 0x80000000 = 4.76% 14493a2c291Sspupyrev; CHECK2: - b0: float = {{.*}}, int = {{.*}}, count = 2100 14593a2c291Sspupyrev 14693a2c291Sspupyrevb1: 14793a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 2, i32 0, i64 -1) 14893a2c291Sspupyrev br i1 %cmp, label %b2, label %b3 149*bb6497ffSMircea Trofin; CHECK: edge %b1 -> %b2 probability is 0x40000000 / 0x80000000 = 50.00% 150*bb6497ffSMircea Trofin; CHECK: edge %b1 -> %b3 probability is 0x40000000 / 0x80000000 = 50.00% 151e3cf80c5SMatthias Braun; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 2000 15293a2c291Sspupyrev 15393a2c291Sspupyrevb2: 15493a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 3, i32 0, i64 -1) 15593a2c291Sspupyrev br i1 %cmp, label %b3, label %b4 156*bb6497ffSMircea Trofin; CHECK: edge %b2 -> %b3 probability is 0x40000000 / 0x80000000 = 50.00% 157*bb6497ffSMircea Trofin; CHECK: edge %b2 -> %b4 probability is 0x40000000 / 0x80000000 = 50.00% 158e3cf80c5SMatthias Braun; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 1000 15993a2c291Sspupyrev 16093a2c291Sspupyrevb3: 16193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 4, i32 0, i64 -1) 16293a2c291Sspupyrev br label %b5 163*bb6497ffSMircea Trofin; CHECK: edge %b3 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 164e3cf80c5SMatthias Braun; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1500 16593a2c291Sspupyrev 16693a2c291Sspupyrevb4: 16793a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 5, i32 0, i64 -1) 16893a2c291Sspupyrev br label %b5 169*bb6497ffSMircea Trofin; CHECK: edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 170e3cf80c5SMatthias Braun; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 500 17193a2c291Sspupyrev 17293a2c291Sspupyrevb5: 17393a2c291Sspupyrev call void @llvm.pseudoprobe(i64 2506109673213838996, i64 6, i32 0, i64 -1) 17493a2c291Sspupyrev ret i32 %1 17593a2c291Sspupyrev; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 2100 17693a2c291Sspupyrev 17793a2c291Sspupyrev} 17893a2c291Sspupyrev 17993a2c291Sspupyrev 18093a2c291Sspupyrev; The test contains a dangling subgraph that contains an exit dangling block. 18193a2c291Sspupyrev; No rebalancing is necessary here. 18293a2c291Sspupyrev; 18393a2c291Sspupyrev; +-----------+ 18493a2c291Sspupyrev; | b31 [100] | 18593a2c291Sspupyrev; +-----------+ 18693a2c291Sspupyrev; | 18793a2c291Sspupyrev; | 18893a2c291Sspupyrev; v 18993a2c291Sspupyrev; +---------+ +-----------+ 19093a2c291Sspupyrev; | b34 [?] | <-- | b32 [100] | 19193a2c291Sspupyrev; +---------+ +-----------+ 19293a2c291Sspupyrev; | 19393a2c291Sspupyrev; | 19493a2c291Sspupyrev; v 19593a2c291Sspupyrev; +-----------+ 19693a2c291Sspupyrev; | b33 [100] | 19793a2c291Sspupyrev; +-----------+ 19893a2c291Sspupyrev 19993a2c291Sspupyrevdefine dso_local i32 @countMultipliers3(i32 %0, i32 %1) #0 { 20093a2c291Sspupyrevb31: 20193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -544905447084884130, i64 1, i32 0, i64 -1) 20293a2c291Sspupyrev br label %b32 20393a2c291Sspupyrev; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 100 20493a2c291Sspupyrev 20593a2c291Sspupyrevb32: 20693a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -544905447084884130, i64 2, i32 0, i64 -1) 20793a2c291Sspupyrev %cmp = icmp ne i32 %0, 0 20893a2c291Sspupyrev br i1 %cmp, label %b34, label %b33 209*bb6497ffSMircea Trofin; CHECK: edge %b32 -> %b34 probability is 0x00000000 / 0x80000000 = 0.00% 210*bb6497ffSMircea Trofin; CHECK: edge %b32 -> %b33 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 21193a2c291Sspupyrev; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 100 21293a2c291Sspupyrev 21393a2c291Sspupyrevb33: 21493a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -544905447084884130, i64 3, i32 0, i64 -1) 21593a2c291Sspupyrev ret i32 %1 21693a2c291Sspupyrev; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 100 21793a2c291Sspupyrev 21893a2c291Sspupyrevb34: 21993a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -544905447084884130, i64 4, i32 0, i64 -1) 22093a2c291Sspupyrev ret i32 %1 22193a2c291Sspupyrev; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 0 22293a2c291Sspupyrev 22393a2c291Sspupyrev} 22493a2c291Sspupyrev 22593a2c291Sspupyrev; Another dangling subgraph (b42, b43, b44) containing a single dangling block. 22693a2c291Sspupyrev; 22793a2c291Sspupyrev; +----------+ +-----------+ 22893a2c291Sspupyrev; +- | b42 [50] | <-- | b40 [100] | 22993a2c291Sspupyrev; | +----------+ +-----------+ 23093a2c291Sspupyrev; | | | 23193a2c291Sspupyrev; | | | 23293a2c291Sspupyrev; | | v 23393a2c291Sspupyrev; | | +-----------+ 23493a2c291Sspupyrev; | | | b41 [50] | 23593a2c291Sspupyrev; | | +-----------+ 23693a2c291Sspupyrev; | | | 23793a2c291Sspupyrev; | | | 23893a2c291Sspupyrev; | | v 23993a2c291Sspupyrev; | | +-----------+ 24093a2c291Sspupyrev; | +------------> | b43 [?] | 24193a2c291Sspupyrev; | +-----------+ 24293a2c291Sspupyrev; | | 24393a2c291Sspupyrev; | | 24493a2c291Sspupyrev; | v 24593a2c291Sspupyrev; | +-----------+ 24693a2c291Sspupyrev; +-----------------> | b44 [100] | 24793a2c291Sspupyrev; +-----------+ 24893a2c291Sspupyrev 24993a2c291Sspupyrevdefine dso_local i32 @countMultipliers4(i32 %0, i32 %1) #0 { 25093a2c291Sspupyrevb40: 25193a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 1, i32 0, i64 -1) 25293a2c291Sspupyrev %cmp = icmp ne i32 %0, 0 25393a2c291Sspupyrev br i1 %cmp, label %b41, label %b42 25493a2c291Sspupyrev; CHECK2: - b40: float = {{.*}}, int = {{.*}}, count = 100 25593a2c291Sspupyrev 25693a2c291Sspupyrevb41: 25793a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 2, i32 0, i64 -1) 25893a2c291Sspupyrev br label %b43 25993a2c291Sspupyrev; CHECK2: - b41: float = {{.*}}, int = {{.*}}, count = 50 26093a2c291Sspupyrev 26193a2c291Sspupyrevb42: 26293a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 3, i32 0, i64 -1) 26393a2c291Sspupyrev br i1 %cmp, label %b43, label %b44 264*bb6497ffSMircea Trofin; CHECK: edge %b42 -> %b43 probability is 0x40000000 / 0x80000000 = 50.00% 265*bb6497ffSMircea Trofin; CHECK: edge %b42 -> %b44 probability is 0x40000000 / 0x80000000 = 50.00% 26693a2c291Sspupyrev; CHECK2: - b42: float = {{.*}}, int = {{.*}}, count = 50 26793a2c291Sspupyrev 26893a2c291Sspupyrevb43: 26993a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 4, i32 0, i64 -1) 27093a2c291Sspupyrev br label %b44 27193a2c291Sspupyrev; CHECK2: - b43: float = {{.*}}, int = {{.*}}, count = 75 27293a2c291Sspupyrev 27393a2c291Sspupyrevb44: 27493a2c291Sspupyrev call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 5, i32 0, i64 -1) 27593a2c291Sspupyrev ret i32 %1 27693a2c291Sspupyrev; CHECK2: - b44: float = {{.*}}, int = {{.*}}, count = 100 27793a2c291Sspupyrev} 27893a2c291Sspupyrev 27993a2c291Sspupyrev; Function Attrs: inaccessiblememonly nounwind willreturn 28093a2c291Sspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #4 28193a2c291Sspupyrev 28293a2c291Sspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile" } 28393a2c291Sspupyrevattributes #4 = { inaccessiblememonly nounwind willreturn } 28493a2c291Sspupyrev 28593a2c291Sspupyrev!llvm.pseudo_probe_desc = !{!7, !8, !9, !10} 28693a2c291Sspupyrev 28793a2c291Sspupyrev!7 = !{i64 -5758218299531803684, i64 223598586707, !"countMultipliers", null} 28893a2c291Sspupyrev!8 = !{i64 2506109673213838996, i64 2235985, !"countMultipliers2", null} 28993a2c291Sspupyrev!9 = !{i64 -544905447084884130, i64 22985, !"countMultipliers3", null} 29093a2c291Sspupyrev!10 = !{i64 -2989539179265513123, i64 2298578, !"countMultipliers4", null} 291