| ; 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 |
| ; 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 |
| |
| ; The test contains a "diamond" and a "triangle" that needs to be rebalanced |
| ; after basic profile inference. |
| ; |
| ; +----------------+ |
| ; | b11 [?] | |
| ; +----------------+ |
| ; | |
| ; v |
| ; +----------+ +----------------+ |
| ; | b13 [10] | <-- | b12 [65536] | |
| ; +----------+ +----------------+ |
| ; | |
| ; v |
| ; +----------+ +----------------+ |
| ; | b16 [?] | <-- | b14 [65536] | |
| ; +----------+ +----------------+ |
| ; | | |
| ; | v |
| ; | +----------------+ |
| ; | | b15 [?] | |
| ; | +----------------+ |
| ; | | |
| ; | v |
| ; | +----------------+ |
| ; +------------> | b17 [65536] | -+ |
| ; +----------------+ | |
| ; | | |
| ; v | |
| ; +----------------+ | |
| ; | b18 [?] | | |
| ; +----------------+ | |
| ; | | |
| ; v | |
| ; +----------------+ | |
| ; | b19 [65536] | <+ |
| ; +----------------+ |
| ; | |
| ; v |
| ; +----------------+ |
| ; | b110 [65536] | |
| ; +----------------+ |
| |
| @yydebug = dso_local global i32 0, align 4 |
| |
| ; Function Attrs: nounwind uwtable |
| define dso_local i32 @countMultipliers(i32 %0, i32 %1) #0 { |
| b11: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br label %b12 |
| ; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 65546 |
| |
| b12: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 2, i32 0, i64 -1) |
| br i1 %cmp, label %b14, label %b13 |
| ; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 65546 |
| |
| b13: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 3, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 10 |
| |
| b14: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 4, i32 0, i64 -1) |
| br i1 %cmp, label %b15, label %b16 |
| ; CHECK: edge b14 -> b15 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b14 -> b16 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 65536 |
| |
| b15: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 5, i32 0, i64 -1) |
| br label %b17 |
| ; CHECK2: - b15: float = {{.*}}, int = {{.*}}, count = 32768 |
| |
| b16: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 6, i32 0, i64 -1) |
| br label %b17 |
| ; CHECK2: - b16: float = {{.*}}, int = {{.*}}, count = 32768 |
| |
| b17: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 7, i32 0, i64 -1) |
| br i1 %cmp, label %b18, label %b19 |
| ; CHECK: edge b17 -> b18 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b17 -> b19 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b17: float = {{.*}}, int = {{.*}}, count = 65536 |
| |
| b18: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 8, i32 0, i64 -1) |
| br label %b19 |
| ; CHECK2: - b18: float = {{.*}}, int = {{.*}}, count = 32768 |
| |
| b19: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 9, i32 0, i64 -1) |
| br label %b110 |
| ; CHECK2: - b19: float = {{.*}}, int = {{.*}}, count = 65536 |
| |
| b110: |
| call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 10, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b110: float = {{.*}}, int = {{.*}}, count = 65536 |
| } |
| |
| |
| ; The test contains a triangle comprised of dangling blocks. |
| ; |
| ; +-----------+ |
| ; | b0 [2100] | -+ |
| ; +-----------+ | |
| ; | | |
| ; | | |
| ; v | |
| ; +-----------+ | |
| ; +- | b1 [2000] | | |
| ; | +-----------+ | |
| ; | | | |
| ; | | | |
| ; | v | |
| ; +--------+ | +-----------+ | |
| ; | b4 [?] | <-----+- | b2 [?] | | |
| ; +--------+ | +-----------+ | |
| ; | | | | |
| ; | | | | |
| ; | | v | |
| ; | | +-----------+ | |
| ; | +> | b3 [?] | | |
| ; | +-----------+ | |
| ; | | | |
| ; | | | |
| ; | v | |
| ; | +-----------+ | |
| ; +---------------> | b5 [2100] | <+ |
| ; +-----------+ |
| |
| define dso_local i32 @countMultipliers2(i32 %0, i32 %1) #0 { |
| b0: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br i1 %cmp, label %b1, label %b5 |
| ; CHECK: edge b0 -> b1 probability is 0x79e79e7a / 0x80000000 = 95.24% [HOT edge] |
| ; CHECK: edge b0 -> b5 probability is 0x06186186 / 0x80000000 = 4.76% |
| ; CHECK2: - b0: float = {{.*}}, int = {{.*}}, count = 2100 |
| |
| b1: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 2, i32 0, i64 -1) |
| br i1 %cmp, label %b2, label %b3 |
| ; CHECK: edge b1 -> b2 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b1 -> b3 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 1973 |
| |
| b2: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 3, i32 0, i64 -1) |
| br i1 %cmp, label %b3, label %b4 |
| ; CHECK: edge b2 -> b3 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b2 -> b4 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 955 |
| |
| b3: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 4, i32 0, i64 -1) |
| br label %b5 |
| ; CHECK: edge b3 -> b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] |
| ; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1527 |
| |
| b4: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 5, i32 0, i64 -1) |
| br label %b5 |
| ; CHECK: edge b4 -> b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] |
| ; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 445 |
| |
| b5: |
| call void @llvm.pseudoprobe(i64 2506109673213838996, i64 6, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 2100 |
| |
| } |
| |
| |
| ; The test contains a dangling subgraph that contains an exit dangling block. |
| ; No rebalancing is necessary here. |
| ; |
| ; +-----------+ |
| ; | b31 [100] | |
| ; +-----------+ |
| ; | |
| ; | |
| ; v |
| ; +---------+ +-----------+ |
| ; | b34 [?] | <-- | b32 [100] | |
| ; +---------+ +-----------+ |
| ; | |
| ; | |
| ; v |
| ; +-----------+ |
| ; | b33 [100] | |
| ; +-----------+ |
| |
| define dso_local i32 @countMultipliers3(i32 %0, i32 %1) #0 { |
| b31: |
| call void @llvm.pseudoprobe(i64 -544905447084884130, i64 1, i32 0, i64 -1) |
| br label %b32 |
| ; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 100 |
| |
| b32: |
| call void @llvm.pseudoprobe(i64 -544905447084884130, i64 2, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br i1 %cmp, label %b34, label %b33 |
| ; CHECK: edge b32 -> b34 probability is 0x00000000 / 0x80000000 = 0.00% |
| ; CHECK: edge b32 -> b33 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] |
| ; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 100 |
| |
| b33: |
| call void @llvm.pseudoprobe(i64 -544905447084884130, i64 3, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 100 |
| |
| b34: |
| call void @llvm.pseudoprobe(i64 -544905447084884130, i64 4, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 0 |
| |
| } |
| |
| ; Another dangling subgraph (b42, b43, b44) containing a single dangling block. |
| ; |
| ; +----------+ +-----------+ |
| ; +- | b42 [50] | <-- | b40 [100] | |
| ; | +----------+ +-----------+ |
| ; | | | |
| ; | | | |
| ; | | v |
| ; | | +-----------+ |
| ; | | | b41 [50] | |
| ; | | +-----------+ |
| ; | | | |
| ; | | | |
| ; | | v |
| ; | | +-----------+ |
| ; | +------------> | b43 [?] | |
| ; | +-----------+ |
| ; | | |
| ; | | |
| ; | v |
| ; | +-----------+ |
| ; +-----------------> | b44 [100] | |
| ; +-----------+ |
| |
| define dso_local i32 @countMultipliers4(i32 %0, i32 %1) #0 { |
| b40: |
| call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br i1 %cmp, label %b41, label %b42 |
| ; CHECK2: - b40: float = {{.*}}, int = {{.*}}, count = 100 |
| |
| b41: |
| call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 2, i32 0, i64 -1) |
| br label %b43 |
| ; CHECK2: - b41: float = {{.*}}, int = {{.*}}, count = 50 |
| |
| b42: |
| call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 3, i32 0, i64 -1) |
| br i1 %cmp, label %b43, label %b44 |
| ; CHECK: edge b42 -> b43 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b42 -> b44 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b42: float = {{.*}}, int = {{.*}}, count = 50 |
| |
| b43: |
| call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 4, i32 0, i64 -1) |
| br label %b44 |
| ; CHECK2: - b43: float = {{.*}}, int = {{.*}}, count = 75 |
| |
| b44: |
| call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 5, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b44: float = {{.*}}, int = {{.*}}, count = 100 |
| } |
| |
| ; Function Attrs: inaccessiblememonly nounwind willreturn |
| declare void @llvm.pseudoprobe(i64, i64, i32, i64) #4 |
| |
| attributes #0 = { noinline nounwind uwtable "use-sample-profile" } |
| attributes #4 = { inaccessiblememonly nounwind willreturn } |
| |
| !llvm.pseudo_probe_desc = !{!7, !8, !9, !10} |
| |
| !7 = !{i64 -5758218299531803684, i64 223598586707, !"countMultipliers", null} |
| !8 = !{i64 2506109673213838996, i64 2235985, !"countMultipliers2", null} |
| !9 = !{i64 -544905447084884130, i64 22985, !"countMultipliers3", null} |
| !10 = !{i64 -2989539179265513123, i64 2298578, !"countMultipliers4", null} |