1d051c566SArthur Eubanks; 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 2d051c566SArthur Eubanks; 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 3f2ade65fSspupyrev 4f2ade65fSspupyrev; The test verifies that counts are evenly distributed among branches with 5f2ade65fSspupyrev; equal weights. 6f2ade65fSspupyrev; 7f2ade65fSspupyrev; +-----------+ +-----------+ 8f2ade65fSspupyrev; | b3 [0] | <-- | b1 [1000] | 9f2ade65fSspupyrev; +-----------+ +-----------+ 10f2ade65fSspupyrev; | | 11f2ade65fSspupyrev; | | 12f2ade65fSspupyrev; | v 13f2ade65fSspupyrev; | +-----------+ 14f2ade65fSspupyrev; | | b2 [0] | 15f2ade65fSspupyrev; | +-----------+ 16f2ade65fSspupyrev; | | 17f2ade65fSspupyrev; | | 18f2ade65fSspupyrev; | v 19f2ade65fSspupyrev; | +-----------+ 20f2ade65fSspupyrev; +-------------> | b4 [1000] | 21f2ade65fSspupyrev; +-----------+ 22f2ade65fSspupyrev 23f2ade65fSspupyrev@yydebug = dso_local global i32 0, align 4 24f2ade65fSspupyrev 25f2ade65fSspupyrev; Function Attrs: nounwind uwtable 26f2ade65fSspupyrevdefine dso_local i32 @foo1(i32 %0, i32 %1) #0 { 27f2ade65fSspupyrevb11: 28f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 7682762345278052905, i64 1, i32 0, i64 -1) 29f2ade65fSspupyrev %cmp = icmp ne i32 %0, 0 30f2ade65fSspupyrev br i1 %cmp, label %b12, label %b13 31*bb6497ffSMircea Trofin; CHECK: edge %b11 -> %b12 probability is 0x40000000 / 0x80000000 = 50.00% 32*bb6497ffSMircea Trofin; CHECK: edge %b11 -> %b13 probability is 0x40000000 / 0x80000000 = 50.00% 33f2ade65fSspupyrev; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 1000 34f2ade65fSspupyrev 35f2ade65fSspupyrevb12: 36f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 7682762345278052905, i64 2, i32 0, i64 -1) 37f2ade65fSspupyrev br label %b14 38f2ade65fSspupyrev; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 500 39f2ade65fSspupyrev 40f2ade65fSspupyrevb13: 41f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 7682762345278052905, i64 3, i32 0, i64 -1) 42f2ade65fSspupyrev br label %b14 43f2ade65fSspupyrev; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 500 44f2ade65fSspupyrev 45f2ade65fSspupyrevb14: 46f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 7682762345278052905, i64 4, i32 0, i64 -1) 47f2ade65fSspupyrev ret i32 %1 48f2ade65fSspupyrev; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 1000 49f2ade65fSspupyrev} 50f2ade65fSspupyrev 51f2ade65fSspupyrev 52f2ade65fSspupyrev; The test verifies that counts are evenly distributed when the entry basic 53f2ade65fSspupyrev; block is dangling. 54f2ade65fSspupyrev; 55f2ade65fSspupyrev; +-----------+ 56f2ade65fSspupyrev; | b1 [?] | -+ 57f2ade65fSspupyrev; +-----------+ | 58f2ade65fSspupyrev; | | 59f2ade65fSspupyrev; | | 60f2ade65fSspupyrev; v | 61f2ade65fSspupyrev; +-----------+ | 62f2ade65fSspupyrev; | b2 [?] | | 63f2ade65fSspupyrev; +-----------+ | 64f2ade65fSspupyrev; | | 65f2ade65fSspupyrev; | | 66f2ade65fSspupyrev; v | 67f2ade65fSspupyrev; +-----------+ | 68f2ade65fSspupyrev; | b3 [1000] | <+ 69f2ade65fSspupyrev; +-----------+ 70f2ade65fSspupyrev 71f2ade65fSspupyrevdefine dso_local i32 @foo2(i32 %0, i32 %1) #0 { 72f2ade65fSspupyrevb21: 73f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 2494702099028631698, i64 1, i32 0, i64 -1) 74f2ade65fSspupyrev %cmp = icmp ne i32 %0, 0 75f2ade65fSspupyrev br i1 %cmp, label %b22, label %b23 76*bb6497ffSMircea Trofin; CHECK: edge %b21 -> %b22 probability is 0x40000000 / 0x80000000 = 50.00% 77*bb6497ffSMircea Trofin; CHECK: edge %b21 -> %b23 probability is 0x40000000 / 0x80000000 = 50.00% 78f2ade65fSspupyrev; CHECK2: - b21: float = {{.*}}, int = {{.*}}, count = 1000 79f2ade65fSspupyrev 80f2ade65fSspupyrevb22: 81f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 2494702099028631698, i64 2, i32 0, i64 -1) 82f2ade65fSspupyrev br label %b23 83f2ade65fSspupyrev; CHECK2: - b22: float = {{.*}}, int = {{.*}}, count = 500 84f2ade65fSspupyrev 85f2ade65fSspupyrevb23: 86f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 2494702099028631698, i64 3, i32 0, i64 -1) 87f2ade65fSspupyrev ret i32 %1 88f2ade65fSspupyrev; CHECK2: - b23: float = {{.*}}, int = {{.*}}, count = 1000 89f2ade65fSspupyrev 90f2ade65fSspupyrev} 91f2ade65fSspupyrev 92f2ade65fSspupyrev; The test verifies even count distribution in the presence of multiple sinks. 93f2ade65fSspupyrev; 94f2ade65fSspupyrev; +-----------+ 95f2ade65fSspupyrev; | b1 [1000] | 96f2ade65fSspupyrev; +-----------+ 97f2ade65fSspupyrev; | 98f2ade65fSspupyrev; | 99f2ade65fSspupyrev; v 100f2ade65fSspupyrev; +-----------+ 101f2ade65fSspupyrev; | b2 [?] | -+ 102f2ade65fSspupyrev; +-----------+ | 103f2ade65fSspupyrev; | | 104f2ade65fSspupyrev; | | 105f2ade65fSspupyrev; v | 106f2ade65fSspupyrev; +--------+ +-----------+ | 107f2ade65fSspupyrev; | b5 [?] | <-- | b3 [?] | | 108f2ade65fSspupyrev; +--------+ +-----------+ | 109f2ade65fSspupyrev; | | | 110f2ade65fSspupyrev; | | | 111f2ade65fSspupyrev; | v | 112f2ade65fSspupyrev; | +-----------+ | 113f2ade65fSspupyrev; | | b4 [1000] | <+ 114f2ade65fSspupyrev; | +-----------+ 115f2ade65fSspupyrev; | | 116f2ade65fSspupyrev; | | 117f2ade65fSspupyrev; | v 118f2ade65fSspupyrev; | +-----------+ 119f2ade65fSspupyrev; +----------> | b6 [1000] | 120f2ade65fSspupyrev; +-----------+ 121f2ade65fSspupyrev; 122f2ade65fSspupyrev 123f2ade65fSspupyrevdefine dso_local i32 @foo3(i32 %0, i32 %1) #0 { 124f2ade65fSspupyrevb31: 125f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 1, i32 0, i64 -1) 126f2ade65fSspupyrev %cmp = icmp ne i32 %0, 0 127f2ade65fSspupyrev br label %b32 128f2ade65fSspupyrev; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 1000 129f2ade65fSspupyrev 130f2ade65fSspupyrevb32: 131f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 2, i32 0, i64 -1) 132f2ade65fSspupyrev br i1 %cmp, label %b33, label %b34 133*bb6497ffSMircea Trofin; CHECK: edge %b32 -> %b33 probability is 0x40000000 / 0x80000000 = 50.00% 134*bb6497ffSMircea Trofin; CHECK: edge %b32 -> %b34 probability is 0x40000000 / 0x80000000 = 50.00% 135f2ade65fSspupyrev; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 1000 136f2ade65fSspupyrev 137f2ade65fSspupyrevb33: 138f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 3, i32 0, i64 -1) 139f2ade65fSspupyrev br i1 %cmp, label %b35, label %b34 140*bb6497ffSMircea Trofin; CHECK: edge %b33 -> %b35 probability is 0x00000000 / 0x80000000 = 0.00% 141*bb6497ffSMircea Trofin; CHECK: edge %b33 -> %b34 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] 142f2ade65fSspupyrev; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 500 143f2ade65fSspupyrev 144f2ade65fSspupyrevb34: 145f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 4, i32 0, i64 -1) 146f2ade65fSspupyrev br label %b36 147f2ade65fSspupyrev; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 1000 148f2ade65fSspupyrev 149f2ade65fSspupyrevb35: 150f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 5, i32 0, i64 -1) 151f2ade65fSspupyrev br label %b36 152f2ade65fSspupyrev; CHECK2: - b35: float = {{.*}}, int = {{.*}}, count = 0 153f2ade65fSspupyrev 154f2ade65fSspupyrevb36: 155f2ade65fSspupyrev call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 6, i32 0, i64 -1) 156f2ade65fSspupyrev ret i32 %1 157f2ade65fSspupyrev; CHECK2: - b36: float = {{.*}}, int = {{.*}}, count = 1000 158f2ade65fSspupyrev} 159f2ade65fSspupyrev 160f2ade65fSspupyrev 161f2ade65fSspupyrev 162f2ade65fSspupyrev; Function Attrs: inaccessiblememonly nounwind willreturn 163f2ade65fSspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #4 164f2ade65fSspupyrev 165f2ade65fSspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile" } 166f2ade65fSspupyrevattributes #4 = { inaccessiblememonly nounwind willreturn } 167f2ade65fSspupyrev 168f2ade65fSspupyrev!llvm.pseudo_probe_desc = !{!7, !8, !9, !10} 169f2ade65fSspupyrev 170f2ade65fSspupyrev!7 = !{i64 7682762345278052905, i64 157181141624, !"foo1", null} 171f2ade65fSspupyrev!8 = !{i64 2494702099028631698, i64 208782362068, !"foo2", null} 172f2ade65fSspupyrev!9 = !{i64 -7908226060800700466, i64 189901498683, !"foo3", null} 173f2ade65fSspupyrev!10 = !{i64 -6882312132165544686, i64 241030178952, !"foo4", null} 174