xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference-even-count-distribution.ll (revision bb6497ffa6a88d1b3a32101d9b6519094d75ef2a)
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