| ; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-even-count-distribution.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-even-count-distribution.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK2 |
| |
| ; The test verifies that counts are evenly distributed among branches with |
| ; equal weights. |
| ; |
| ; +-----------+ +-----------+ |
| ; | b3 [0] | <-- | b1 [1000] | |
| ; +-----------+ +-----------+ |
| ; | | |
| ; | | |
| ; | v |
| ; | +-----------+ |
| ; | | b2 [0] | |
| ; | +-----------+ |
| ; | | |
| ; | | |
| ; | v |
| ; | +-----------+ |
| ; +-------------> | b4 [1000] | |
| ; +-----------+ |
| |
| @yydebug = dso_local global i32 0, align 4 |
| |
| ; Function Attrs: nounwind uwtable |
| define dso_local i32 @foo1(i32 %0, i32 %1) #0 { |
| b11: |
| call void @llvm.pseudoprobe(i64 7682762345278052905, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br i1 %cmp, label %b12, label %b13 |
| ; CHECK: edge b11 -> b12 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b11 -> b13 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| b12: |
| call void @llvm.pseudoprobe(i64 7682762345278052905, i64 2, i32 0, i64 -1) |
| br label %b14 |
| ; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 500 |
| |
| b13: |
| call void @llvm.pseudoprobe(i64 7682762345278052905, i64 3, i32 0, i64 -1) |
| br label %b14 |
| ; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 500 |
| |
| b14: |
| call void @llvm.pseudoprobe(i64 7682762345278052905, i64 4, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 1000 |
| } |
| |
| |
| ; The test verifies that counts are evenly distributed when the entry basic |
| ; block is dangling. |
| ; |
| ; +-----------+ |
| ; | b1 [?] | -+ |
| ; +-----------+ | |
| ; | | |
| ; | | |
| ; v | |
| ; +-----------+ | |
| ; | b2 [?] | | |
| ; +-----------+ | |
| ; | | |
| ; | | |
| ; v | |
| ; +-----------+ | |
| ; | b3 [1000] | <+ |
| ; +-----------+ |
| |
| define dso_local i32 @foo2(i32 %0, i32 %1) #0 { |
| b21: |
| call void @llvm.pseudoprobe(i64 2494702099028631698, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br i1 %cmp, label %b22, label %b23 |
| ; CHECK: edge b21 -> b22 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b21 -> b23 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b21: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| b22: |
| call void @llvm.pseudoprobe(i64 2494702099028631698, i64 2, i32 0, i64 -1) |
| br label %b23 |
| ; CHECK2: - b22: float = {{.*}}, int = {{.*}}, count = 500 |
| |
| b23: |
| call void @llvm.pseudoprobe(i64 2494702099028631698, i64 3, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b23: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| } |
| |
| ; The test verifies even count distribution in the presence of multiple sinks. |
| ; |
| ; +-----------+ |
| ; | b1 [1000] | |
| ; +-----------+ |
| ; | |
| ; | |
| ; v |
| ; +-----------+ |
| ; | b2 [?] | -+ |
| ; +-----------+ | |
| ; | | |
| ; | | |
| ; v | |
| ; +--------+ +-----------+ | |
| ; | b5 [?] | <-- | b3 [?] | | |
| ; +--------+ +-----------+ | |
| ; | | | |
| ; | | | |
| ; | v | |
| ; | +-----------+ | |
| ; | | b4 [1000] | <+ |
| ; | +-----------+ |
| ; | | |
| ; | | |
| ; | v |
| ; | +-----------+ |
| ; +----------> | b6 [1000] | |
| ; +-----------+ |
| ; |
| |
| define dso_local i32 @foo3(i32 %0, i32 %1) #0 { |
| b31: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 1, i32 0, i64 -1) |
| %cmp = icmp ne i32 %0, 0 |
| br label %b32 |
| ; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| b32: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 2, i32 0, i64 -1) |
| br i1 %cmp, label %b33, label %b34 |
| ; CHECK: edge b32 -> b33 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK: edge b32 -> b34 probability is 0x40000000 / 0x80000000 = 50.00% |
| ; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| b33: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 3, i32 0, i64 -1) |
| br i1 %cmp, label %b35, label %b34 |
| ; CHECK: edge b33 -> b35 probability is 0x00000000 / 0x80000000 = 0.00% |
| ; CHECK: edge b33 -> b34 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] |
| ; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 500 |
| |
| b34: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 4, i32 0, i64 -1) |
| br label %b36 |
| ; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 1000 |
| |
| b35: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 5, i32 0, i64 -1) |
| br label %b36 |
| ; CHECK2: - b35: float = {{.*}}, int = {{.*}}, count = 0 |
| |
| b36: |
| call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 6, i32 0, i64 -1) |
| ret i32 %1 |
| ; CHECK2: - b36: float = {{.*}}, int = {{.*}}, count = 1000 |
| } |
| |
| |
| |
| ; 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 7682762345278052905, i64 157181141624, !"foo1", null} |
| !8 = !{i64 2494702099028631698, i64 208782362068, !"foo2", null} |
| !9 = !{i64 -7908226060800700466, i64 189901498683, !"foo3", null} |
| !10 = !{i64 -6882312132165544686, i64 241030178952, !"foo4", null} |