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
2
2
3
3
// Verifies the output of __builtin_expect versus the output of the likelihood
4
4
// attributes. They should generate the same probabilities for the branches.
@@ -9,9 +9,9 @@ extern bool c();
9
9
10
10
void ab1 (int &i) {
11
11
// 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
15
15
if (__builtin_expect (a () && b () && a (), 1 )) {
16
16
++i;
17
17
} else {
@@ -21,9 +21,9 @@ void ab1(int &i) {
21
21
22
22
void al (int &i) {
23
23
// 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
27
27
if (a () && b () && c ()) [[likely]] {
28
28
++i;
29
29
} else {
@@ -33,9 +33,10 @@ void al(int &i) {
33
33
34
34
void ab0 (int &i) {
35
35
// 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
39
40
if (__builtin_expect (a () && b () && c (), 0 )) {
40
41
++i;
41
42
} else {
@@ -47,7 +48,7 @@ void au(int &i) {
47
48
// CHECK-LABEL: define{{.*}}au
48
49
// CHECK: br {{.*}}else{{$}}
49
50
// CHECK: br {{.*}}else{{$}}
50
- // CHECK: br {{.*}} !prof !8
51
+ // CHECK: br {{.*}} !prof !10
51
52
if (a () && b () && c ()) [[unlikely]] {
52
53
++i;
53
54
} else {
@@ -59,7 +60,8 @@ void ob1(int &i) {
59
60
// CHECK-LABEL: define{{.*}}ob1
60
61
// CHECK: br {{.*}}false{{$}}
61
62
// CHECK: br {{.*}}rhs{{$}}
62
- // CHECK: br {{.*}} !prof !2
63
+ // CHECK: br {{.*}}end{{$}}
64
+ // CHECK: br {{.*}} !prof !6
63
65
if (__builtin_expect (a () || b () || a (), 1 )) {
64
66
i = 0 ;
65
67
} else {
@@ -71,7 +73,7 @@ void ol(int &i) {
71
73
// CHECK-LABEL: define{{.*}}ol
72
74
// CHECK: br {{.*}}false{{$}}
73
75
// CHECK: br {{.*}}false2{{$}}
74
- // CHECK: br {{.*}} !prof !2
76
+ // CHECK: br {{.*}} !prof !6
75
77
if (a () || b () || c ()) [[likely]] {
76
78
i = 0 ;
77
79
} else {
@@ -81,9 +83,9 @@ void ol(int &i) {
81
83
82
84
void ob0 (int &i) {
83
85
// 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
87
89
if (__builtin_expect (a () || b () || c (), 0 )) {
88
90
i = 0 ;
89
91
} else {
@@ -93,9 +95,9 @@ void ob0(int &i) {
93
95
94
96
void ou (int &i) {
95
97
// 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
99
101
if (a () || b () || c ()) [[unlikely]] {
100
102
i = 0 ;
101
103
} else {
@@ -105,7 +107,7 @@ void ou(int &i) {
105
107
106
108
void nb1 (int &i) {
107
109
// CHECK-LABEL: define{{.*}}nb1
108
- // CHECK: storemerge {{.*}} !prof !8
110
+ // CHECK: br {{.*}} !prof !6
109
111
if (__builtin_expect (!a (), 1 )) {
110
112
++i;
111
113
} else {
@@ -115,8 +117,8 @@ void nb1(int &i) {
115
117
116
118
void nl (int &i) {
117
119
// CHECK-LABEL: define{{.*}}nl
118
- // CHECK: storemerge {{.*}} !prof !8
119
- if (!a ()) [[likely]] {
120
+ // CHECK: br {{.*}} !prof !6
121
+ if (bool d = !a ()) [[likely]] {
120
122
++i;
121
123
} else {
122
124
--i;
@@ -125,7 +127,7 @@ void nl(int &i) {
125
127
126
128
void nb0 (int &i) {
127
129
// CHECK-LABEL: define{{.*}}nb0
128
- // CHECK: storemerge {{.*}} !prof !2
130
+ // CHECK: br {{.*}} !prof !10
129
131
if (__builtin_expect (!a (), 0 )) {
130
132
++i;
131
133
} else {
@@ -135,8 +137,8 @@ void nb0(int &i) {
135
137
136
138
void nu (int &i) {
137
139
// CHECK-LABEL: define{{.*}}nu
138
- // CHECK: storemerge {{.*}} !prof !2
139
- if (!a ()) [[unlikely]] {
140
+ // CHECK: br {{.*}} !prof !10
141
+ if (bool d = !a ()) [[unlikely]] {
140
142
++i;
141
143
} else {
142
144
--i;
@@ -148,7 +150,7 @@ void tb1(int &i) {
148
150
// CHECK: br {{.*}}false{{$}}
149
151
// CHECK: br {{.*}}end{{$}}
150
152
// CHECK: br {{.*}}end{{$}}
151
- // CHECK: storemerge {{.*}} !prof !2
153
+ // CHECK: br {{.*}} !prof !6
152
154
if (__builtin_expect (a () ? b () : c (), 1 )) {
153
155
++i;
154
156
} else {
@@ -161,7 +163,7 @@ void tl(int &i) {
161
163
// CHECK: br {{.*}}false{{$}}
162
164
// CHECK: br {{.*}}end{{$}}
163
165
// CHECK: br {{.*}}end{{$}}
164
- // CHECK: storemerge {{.*}} !prof !2
166
+ // CHECK: br {{.*}} !prof !6
165
167
if (bool d = a () ? b () : c ()) [[likely]] {
166
168
++i;
167
169
} else {
@@ -172,8 +174,8 @@ void tl(int &i) {
172
174
void tl2 (int &i) {
173
175
// CHECK-LABEL: define{{.*}}tl
174
176
// CHECK: br {{.*}}false{{$}}
175
- // CHECK: br {{.*}} !prof !2
176
- // CHECK: br {{.*}} !prof !2
177
+ // CHECK: br {{.*}} !prof !6
178
+ // CHECK: br {{.*}} !prof !6
177
179
if (a () ? b () : c ()) [[likely]] {
178
180
++i;
179
181
} else {
@@ -186,7 +188,7 @@ void tb0(int &i) {
186
188
// CHECK: br {{.*}}false{{$}}
187
189
// CHECK: br {{.*}}end{{$}}
188
190
// CHECK: br {{.*}}end{{$}}
189
- // CHECK: storemerge {{.*}} !prof !8
191
+ // CHECK: br {{.*}} !prof !10
190
192
if (__builtin_expect (a () ? b () : c (), 0 )) {
191
193
++i;
192
194
} else {
@@ -199,7 +201,7 @@ void tu(int &i) {
199
201
// CHECK: br {{.*}}false{{$}}
200
202
// CHECK: br {{.*}}end{{$}}
201
203
// CHECK: br {{.*}}end{{$}}
202
- // CHECK: storemerge {{.*}} !prof !8
204
+ // CHECK: br {{.*}} !prof !10
203
205
if (bool d = a () ? b () : c ()) [[unlikely]] {
204
206
++i;
205
207
} else {
@@ -210,14 +212,14 @@ void tu(int &i) {
210
212
void tu2 (int &i) {
211
213
// CHECK-LABEL: define{{.*}}tu
212
214
// CHECK: br {{.*}}false{{$}}
213
- // CHECK: br {{.*}} !prof !8
214
- // CHECK: br {{.*}} !prof !8
215
+ // CHECK: br {{.*}} !prof !10
216
+ // CHECK: br {{.*}} !prof !10
215
217
if (a () ? b () : c ()) [[unlikely]] {
216
218
++i;
217
219
} else {
218
220
--i;
219
221
}
220
222
}
221
223
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