xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference-islands.ll (revision f72b76cde5a36bcf1bd8a9f5ffa69e4c9d9f318d)
198dd2f9eSspupyrev; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t
298dd2f9eSspupyrev; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT
3*f72b76cdSArthur Eubanks; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
498dd2f9eSspupyrev
598dd2f9eSspupyrev
698dd2f9eSspupyrev; The test contains an isolated flow component ("island") that needs to be
798dd2f9eSspupyrev; reconnected to the entry point via edges with a positive flow.
898dd2f9eSspupyrev; The corresponding CFG is shown below:
998dd2f9eSspupyrev;
1098dd2f9eSspupyrev; +--------+     +--------+     +----------+
1198dd2f9eSspupyrev; | b6 [1] | <-- | b4 [1] | <-- |  b1 [1]  |
1298dd2f9eSspupyrev; +--------+     +--------+     +----------+
1398dd2f9eSspupyrev;                  |              |
1498dd2f9eSspupyrev;                  |              |
1598dd2f9eSspupyrev;                  v              v
1698dd2f9eSspupyrev;                +--------+     +----------+
1798dd2f9eSspupyrev;                | b5 [0] |     | b2 [100] | <+
1898dd2f9eSspupyrev;                +--------+     +----------+  |
1998dd2f9eSspupyrev;                                 |           |
2098dd2f9eSspupyrev;                                 |           |
2198dd2f9eSspupyrev;                                 v           |
2298dd2f9eSspupyrev;                               +----------+  |
2398dd2f9eSspupyrev;                               | b3 [100] | -+
2498dd2f9eSspupyrev;                               +----------+
2598dd2f9eSspupyrev;                                 |
2698dd2f9eSspupyrev;                                 |
2798dd2f9eSspupyrev;                                 v
2898dd2f9eSspupyrev;                               +----------+
2998dd2f9eSspupyrev;                               |  b7 [0]  |
3098dd2f9eSspupyrev;                               +----------+
3198dd2f9eSspupyrev
3298dd2f9eSspupyrev
3398dd2f9eSspupyrev; Function Attrs: nounwind uwtable
3498dd2f9eSspupyrevdefine dso_local i32 @islands_1(i32 %0, i32 %1) #0 {
3598dd2f9eSspupyrevb1:
3698dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 1, i32 0, i64 -1)
3798dd2f9eSspupyrev  %cmp = icmp ne i32 %0, 0
3898dd2f9eSspupyrev  br i1 %cmp, label %b2, label %b4
3998dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 2
4098dd2f9eSspupyrev
4198dd2f9eSspupyrevb2:
4298dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1)
4398dd2f9eSspupyrev  br label %b3
4498dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 101
4598dd2f9eSspupyrev
4698dd2f9eSspupyrevb3:
4798dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1)
4898dd2f9eSspupyrev  br i1 %cmp, label %b2, label %b7
4998dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 101
5098dd2f9eSspupyrev
5198dd2f9eSspupyrevb4:
5298dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1)
5398dd2f9eSspupyrev  br i1 %cmp, label %b5, label %b6
5498dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1
5598dd2f9eSspupyrev
5698dd2f9eSspupyrevb5:
5798dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1)
5898dd2f9eSspupyrev  ret i32 %1
5998dd2f9eSspupyrev; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 0
6098dd2f9eSspupyrev
6198dd2f9eSspupyrevb6:
6298dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1)
6398dd2f9eSspupyrev  ret i32 %1
6498dd2f9eSspupyrev; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1
6598dd2f9eSspupyrev
6698dd2f9eSspupyrevb7:
6798dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1)
6898dd2f9eSspupyrev  ret i32 %1
6998dd2f9eSspupyrev; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1
7098dd2f9eSspupyrev
7198dd2f9eSspupyrev}
7298dd2f9eSspupyrev
7398dd2f9eSspupyrev; Another test with an island.
7498dd2f9eSspupyrev;
7598dd2f9eSspupyrev;  +----------+
7698dd2f9eSspupyrev;  |  b1 [0]  |
7798dd2f9eSspupyrev;  +----------+
7898dd2f9eSspupyrev;   |
7998dd2f9eSspupyrev;   |
8098dd2f9eSspupyrev;   v
8198dd2f9eSspupyrev;  +----------+
8298dd2f9eSspupyrev;  | b2 [100] | <+
8398dd2f9eSspupyrev;  +----------+  |
8498dd2f9eSspupyrev;   |            |
8598dd2f9eSspupyrev;   |            |
8698dd2f9eSspupyrev;   v            |
8798dd2f9eSspupyrev;  +----------+  |
8898dd2f9eSspupyrev;  | b3 [100] | -+
8998dd2f9eSspupyrev;  +----------+
9098dd2f9eSspupyrev;   |
9198dd2f9eSspupyrev;   |
9298dd2f9eSspupyrev;   v
9398dd2f9eSspupyrev;  +----------+
9498dd2f9eSspupyrev;  |  b4 [0]  |
9598dd2f9eSspupyrev;  +----------+
9698dd2f9eSspupyrev
9798dd2f9eSspupyrev; Function Attrs: nounwind uwtable
9898dd2f9eSspupyrevdefine dso_local i32 @islands_2(i32 %0, i32 %1) #1 {
9998dd2f9eSspupyrevb1:
10098dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 1, i32 0, i64 -1)
10198dd2f9eSspupyrev  %cmp = icmp ne i32 %0, 0
10298dd2f9eSspupyrev  br label %b2
10398dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1
10498dd2f9eSspupyrev
10598dd2f9eSspupyrevb2:
10698dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1)
10798dd2f9eSspupyrev  br label %b3
10898dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001
10998dd2f9eSspupyrev
11098dd2f9eSspupyrevb3:
11198dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1)
11298dd2f9eSspupyrev  br i1 %cmp, label %b2, label %b4
11398dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001
11498dd2f9eSspupyrev
11598dd2f9eSspupyrevb4:
11698dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1)
11798dd2f9eSspupyrev  ret i32 %1
11898dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1
11998dd2f9eSspupyrev}
12098dd2f9eSspupyrev
12198dd2f9eSspupyrev
12298dd2f9eSspupyrev; The test verifies that the island is connected to the entry block via a
12398dd2f9eSspupyrev; cheapest path (that is, passing through blocks with large counts).
12498dd2f9eSspupyrev;
12598dd2f9eSspupyrev; +---------+     +---------+     +----------+     +--------+
12698dd2f9eSspupyrev; | b8 [10] | <-- | b3 [10] | <-- | b1 [10]  | --> | b4 [0] |
12798dd2f9eSspupyrev; +---------+     +---------+     +----------+     +--------+
12898dd2f9eSspupyrev;                   |               |                |
12998dd2f9eSspupyrev;                   |               |                |
13098dd2f9eSspupyrev;                   |               v                |
13198dd2f9eSspupyrev;                   |             +----------+       |
13298dd2f9eSspupyrev;                   |             |  b2 [0]  |       |
13398dd2f9eSspupyrev;                   |             +----------+       |
13498dd2f9eSspupyrev;                   |               |                |
13598dd2f9eSspupyrev;                   |               |                |
13698dd2f9eSspupyrev;                   |               v                v
13798dd2f9eSspupyrev;                   |             +-------------------------+
13898dd2f9eSspupyrev;                   +-----------> |        b5 [100]         |
13998dd2f9eSspupyrev;                                 +-------------------------+
14098dd2f9eSspupyrev;                                   |           ^
14198dd2f9eSspupyrev;                                   |           |
14298dd2f9eSspupyrev;                                   v           |
14398dd2f9eSspupyrev;                                 +----------+  |
14498dd2f9eSspupyrev;                                 | b6 [100] | -+
14598dd2f9eSspupyrev;                                 +----------+
14698dd2f9eSspupyrev;                                   |
14798dd2f9eSspupyrev;                                   |
14898dd2f9eSspupyrev;                                   v
14998dd2f9eSspupyrev;                                 +----------+
15098dd2f9eSspupyrev;                                 |  b7 [0]  |
15198dd2f9eSspupyrev;                                 +----------+
15298dd2f9eSspupyrev
15398dd2f9eSspupyrev; Function Attrs: nounwind uwtable
15498dd2f9eSspupyrevdefine dso_local i32 @islands_3(i32 %0, i32 %1) #1 {
15598dd2f9eSspupyrevb1:
15698dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 1, i32 0, i64 -1)
15798dd2f9eSspupyrev  %cmp = icmp ne i32 %0, 0
15898dd2f9eSspupyrev  switch i32 %1, label %b2 [
15998dd2f9eSspupyrev    i32 1, label %b3
16098dd2f9eSspupyrev    i32 2, label %b4
16198dd2f9eSspupyrev  ]
16298dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11
16398dd2f9eSspupyrev
16498dd2f9eSspupyrevb2:
16598dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1)
16698dd2f9eSspupyrev  br label %b5
16798dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0
16898dd2f9eSspupyrev
16998dd2f9eSspupyrevb3:
17098dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1)
17198dd2f9eSspupyrev  br i1 %cmp, label %b8, label %b5
17298dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11
17398dd2f9eSspupyrev
17498dd2f9eSspupyrevb4:
17598dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1)
17698dd2f9eSspupyrev  ret i32 %1
17798dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0
17898dd2f9eSspupyrev
17998dd2f9eSspupyrevb5:
18098dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1)
18198dd2f9eSspupyrev  br label %b6
18298dd2f9eSspupyrev; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001
18398dd2f9eSspupyrev
18498dd2f9eSspupyrevb6:
18598dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1)
18698dd2f9eSspupyrev  br i1 %cmp, label %b7, label %b5
18798dd2f9eSspupyrev; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001
18898dd2f9eSspupyrev
18998dd2f9eSspupyrevb7:
19098dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1)
19198dd2f9eSspupyrev  ret i32 %1
19298dd2f9eSspupyrev; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1
19398dd2f9eSspupyrev
19498dd2f9eSspupyrevb8:
19598dd2f9eSspupyrev  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1)
19698dd2f9eSspupyrev  ret i32 %1
19798dd2f9eSspupyrev; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10
19898dd2f9eSspupyrev}
19998dd2f9eSspupyrev
20098dd2f9eSspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #2
20198dd2f9eSspupyrev
20298dd2f9eSspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile"}
20398dd2f9eSspupyrevattributes #1 = { noinline nounwind uwtable "use-sample-profile"}
20498dd2f9eSspupyrevattributes #2 = { nounwind }
20598dd2f9eSspupyrev
20698dd2f9eSspupyrev!llvm.pseudo_probe_desc = !{!7, !8}
20798dd2f9eSspupyrev
20898dd2f9eSspupyrev!7 = !{i64 -5646793257986063976, i64 120879332589, !"islands_1"}
20998dd2f9eSspupyrev!8 = !{i64 -7683376842751444845, i64 69495280403, !"islands_2"}
21098dd2f9eSspupyrev!9 = !{i64 -9095645063288297061, i64 156608410269, !"islands_3"}
21198dd2f9eSspupyrev
21298dd2f9eSspupyrev; CHECK-ENTRY-COUNT: = !{!"function_entry_count", i64 2}
213