Skip to content

Commit 551caec

Browse files
committed
Make likelihood lit test less brittle
Jeremy Morse discovered an issue with the lit test introduced in D88363. The test gives different results for Sony's `-O1`. The test needs to run at `-O1` otherwise the likelihood attribute will be ignored. Instead of running all `-O1` passes it only runs the lower-expect pass which is needed to lower `__builtin_expect`. Differential Revision: https://reviews.llvm.org/D89204
1 parent 1ef0e94 commit 551caec

File tree

1 file changed

+37
-35
lines changed

1 file changed

+37
-35
lines changed

clang/test/CodeGenCXX/attr-likelihood-if-vs-builtin-expect.cpp

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -O1 -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
1+
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | opt --lower-expect -S | FileCheck %s
22

33
// Verifies the output of __builtin_expect versus the output of the likelihood
44
// attributes. They should generate the same probabilities for the branches.
@@ -9,9 +9,9 @@ extern bool c();
99

1010
void ab1(int &i) {
1111
// CHECK-LABEL: define{{.*}}ab1
12-
// CHECK: br {{.*}} !prof !2
13-
// CHECK: br {{.*}} !prof !2
14-
// CHECK: br {{.*}} !prof !2
12+
// CHECK: br {{.*}} !prof !6
13+
// CHECK: br {{.*}} !prof !6
14+
// CHECK: br {{.*}} !prof !6
1515
if (__builtin_expect(a() && b() && a(), 1)) {
1616
++i;
1717
} else {
@@ -21,9 +21,9 @@ void ab1(int &i) {
2121

2222
void al(int &i) {
2323
// CHECK-LABEL: define{{.*}}al
24-
// CHECK: br {{.*}} !prof !2
25-
// CHECK: br {{.*}} !prof !2
26-
// CHECK: br {{.*}} !prof !2
24+
// CHECK: br {{.*}} !prof !6
25+
// CHECK: br {{.*}} !prof !6
26+
// CHECK: br {{.*}} !prof !6
2727
if (a() && b() && c()) [[likely]] {
2828
++i;
2929
} else {
@@ -33,9 +33,10 @@ void al(int &i) {
3333

3434
void ab0(int &i) {
3535
// CHECK-LABEL: define{{.*}}ab0
36-
// CHECK: br {{.*}}else{{$}}
37-
// CHECK: br {{.*}}else{{$}}
38-
// CHECK: br {{.*}} !prof !8
36+
// CHECK: br {{.*}}end{{$}}
37+
// CHECK: br {{.*}}end{{$}}
38+
// CHECK: br {{.*}}end{{$}}
39+
// CHECK: br {{.*}} !prof !10
3940
if (__builtin_expect(a() && b() && c(), 0)) {
4041
++i;
4142
} else {
@@ -47,7 +48,7 @@ void au(int &i) {
4748
// CHECK-LABEL: define{{.*}}au
4849
// CHECK: br {{.*}}else{{$}}
4950
// CHECK: br {{.*}}else{{$}}
50-
// CHECK: br {{.*}} !prof !8
51+
// CHECK: br {{.*}} !prof !10
5152
if (a() && b() && c()) [[unlikely]] {
5253
++i;
5354
} else {
@@ -59,7 +60,8 @@ void ob1(int &i) {
5960
// CHECK-LABEL: define{{.*}}ob1
6061
// CHECK: br {{.*}}false{{$}}
6162
// CHECK: br {{.*}}rhs{{$}}
62-
// CHECK: br {{.*}} !prof !2
63+
// CHECK: br {{.*}}end{{$}}
64+
// CHECK: br {{.*}} !prof !6
6365
if (__builtin_expect(a() || b() || a(), 1)) {
6466
i = 0;
6567
} else {
@@ -71,7 +73,7 @@ void ol(int &i) {
7173
// CHECK-LABEL: define{{.*}}ol
7274
// CHECK: br {{.*}}false{{$}}
7375
// CHECK: br {{.*}}false2{{$}}
74-
// CHECK: br {{.*}} !prof !2
76+
// CHECK: br {{.*}} !prof !6
7577
if (a() || b() || c()) [[likely]] {
7678
i = 0;
7779
} else {
@@ -81,9 +83,9 @@ void ol(int &i) {
8183

8284
void ob0(int &i) {
8385
// CHECK-LABEL: define{{.*}}ob0
84-
// CHECK: br {{.*}} !prof !8
85-
// CHECK: br {{.*}} !prof !8
86-
// CHECK: br {{.*}} !prof !8
86+
// CHECK: br {{.*}} !prof !10
87+
// CHECK: br {{.*}} !prof !10
88+
// CHECK: br {{.*}} !prof !10
8789
if (__builtin_expect(a() || b() || c(), 0)) {
8890
i = 0;
8991
} else {
@@ -93,9 +95,9 @@ void ob0(int &i) {
9395

9496
void ou(int &i) {
9597
// CHECK-LABEL: define{{.*}}ou
96-
// CHECK: br {{.*}} !prof !8
97-
// CHECK: br {{.*}} !prof !8
98-
// CHECK: br {{.*}} !prof !8
98+
// CHECK: br {{.*}} !prof !10
99+
// CHECK: br {{.*}} !prof !10
100+
// CHECK: br {{.*}} !prof !10
99101
if (a() || b() || c()) [[unlikely]] {
100102
i = 0;
101103
} else {
@@ -105,7 +107,7 @@ void ou(int &i) {
105107

106108
void nb1(int &i) {
107109
// CHECK-LABEL: define{{.*}}nb1
108-
// CHECK: storemerge{{.*}} !prof !8
110+
// CHECK: br {{.*}} !prof !6
109111
if (__builtin_expect(!a(), 1)) {
110112
++i;
111113
} else {
@@ -115,8 +117,8 @@ void nb1(int &i) {
115117

116118
void nl(int &i) {
117119
// CHECK-LABEL: define{{.*}}nl
118-
// CHECK: storemerge{{.*}} !prof !8
119-
if (!a()) [[likely]] {
120+
// CHECK: br {{.*}} !prof !6
121+
if (bool d = !a()) [[likely]] {
120122
++i;
121123
} else {
122124
--i;
@@ -125,7 +127,7 @@ void nl(int &i) {
125127

126128
void nb0(int &i) {
127129
// CHECK-LABEL: define{{.*}}nb0
128-
// CHECK: storemerge{{.*}} !prof !2
130+
// CHECK: br {{.*}} !prof !10
129131
if (__builtin_expect(!a(), 0)) {
130132
++i;
131133
} else {
@@ -135,8 +137,8 @@ void nb0(int &i) {
135137

136138
void nu(int &i) {
137139
// CHECK-LABEL: define{{.*}}nu
138-
// CHECK: storemerge{{.*}} !prof !2
139-
if (!a()) [[unlikely]] {
140+
// CHECK: br {{.*}} !prof !10
141+
if (bool d = !a()) [[unlikely]] {
140142
++i;
141143
} else {
142144
--i;
@@ -148,7 +150,7 @@ void tb1(int &i) {
148150
// CHECK: br {{.*}}false{{$}}
149151
// CHECK: br {{.*}}end{{$}}
150152
// CHECK: br {{.*}}end{{$}}
151-
// CHECK: storemerge{{.*}} !prof !2
153+
// CHECK: br {{.*}} !prof !6
152154
if (__builtin_expect(a() ? b() : c(), 1)) {
153155
++i;
154156
} else {
@@ -161,7 +163,7 @@ void tl(int &i) {
161163
// CHECK: br {{.*}}false{{$}}
162164
// CHECK: br {{.*}}end{{$}}
163165
// CHECK: br {{.*}}end{{$}}
164-
// CHECK: storemerge{{.*}} !prof !2
166+
// CHECK: br {{.*}} !prof !6
165167
if (bool d = a() ? b() : c()) [[likely]] {
166168
++i;
167169
} else {
@@ -172,8 +174,8 @@ void tl(int &i) {
172174
void tl2(int &i) {
173175
// CHECK-LABEL: define{{.*}}tl
174176
// CHECK: br {{.*}}false{{$}}
175-
// CHECK: br {{.*}} !prof !2
176-
// CHECK: br {{.*}} !prof !2
177+
// CHECK: br {{.*}} !prof !6
178+
// CHECK: br {{.*}} !prof !6
177179
if (a() ? b() : c()) [[likely]] {
178180
++i;
179181
} else {
@@ -186,7 +188,7 @@ void tb0(int &i) {
186188
// CHECK: br {{.*}}false{{$}}
187189
// CHECK: br {{.*}}end{{$}}
188190
// CHECK: br {{.*}}end{{$}}
189-
// CHECK: storemerge{{.*}} !prof !8
191+
// CHECK: br {{.*}} !prof !10
190192
if (__builtin_expect(a() ? b() : c(), 0)) {
191193
++i;
192194
} else {
@@ -199,7 +201,7 @@ void tu(int &i) {
199201
// CHECK: br {{.*}}false{{$}}
200202
// CHECK: br {{.*}}end{{$}}
201203
// CHECK: br {{.*}}end{{$}}
202-
// CHECK: storemerge{{.*}} !prof !8
204+
// CHECK: br {{.*}} !prof !10
203205
if (bool d = a() ? b() : c()) [[unlikely]] {
204206
++i;
205207
} else {
@@ -210,14 +212,14 @@ void tu(int &i) {
210212
void tu2(int &i) {
211213
// CHECK-LABEL: define{{.*}}tu
212214
// CHECK: br {{.*}}false{{$}}
213-
// CHECK: br {{.*}} !prof !8
214-
// CHECK: br {{.*}} !prof !8
215+
// CHECK: br {{.*}} !prof !10
216+
// CHECK: br {{.*}} !prof !10
215217
if (a() ? b() : c()) [[unlikely]] {
216218
++i;
217219
} else {
218220
--i;
219221
}
220222
}
221223

222-
// CHECK: !2 = !{!"branch_weights", i32 2000, i32 1}
223-
// CHECK: !8 = !{!"branch_weights", i32 1, i32 2000}
224+
// CHECK: !6 = !{!"branch_weights", i32 2000, i32 1}
225+
// CHECK: !10 = !{!"branch_weights", i32 1, i32 2000}

0 commit comments

Comments
 (0)