1 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | opt -passes=lower-expect -S | FileCheck %s
3 // Verifies the output of __builtin_expect versus the output of the likelihood
4 // attributes. They should generate the same probabilities for the branches.
11 // CHECK-LABEL: define{{.*}}ab1
12 // CHECK: br {{.*}} !prof [[BW_LIKELY:!.+]]
13 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
14 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
15 if (__builtin_expect(a() && b() && a(), 1)) {
23 // CHECK-LABEL: define{{.*}}al
24 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
25 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
26 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
27 if (a() && b() && c()) [[likely
]] {
35 // CHECK-LABEL: define{{.*}}ab0
36 // CHECK: br {{.*}}end{{$}}
37 // CHECK: br {{.*}}end{{$}}
38 // CHECK: br {{.*}}end{{$}}
39 // CHECK: br {{.*}} !prof [[BW_UNLIKELY:!.+]]
40 if (__builtin_expect(a() && b() && c(), 0)) {
48 // CHECK-LABEL: define{{.*}}au
49 // CHECK: br {{.*}}else{{$}}
50 // CHECK: br {{.*}}else{{$}}
51 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
52 if (a() && b() && c()) [[unlikely
]] {
60 // CHECK-LABEL: define{{.*}}ob1
61 // CHECK: br {{.*}}false{{$}}
62 // CHECK: br {{.*}}rhs{{$}}
63 // CHECK: br {{.*}}end{{$}}
64 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
65 if (__builtin_expect(a() || b() || a(), 1)) {
73 // CHECK-LABEL: define{{.*}}ol
74 // CHECK: br {{.*}}false{{$}}
75 // CHECK: br {{.*}}false2{{$}}
76 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
77 if (a() || b() || c()) [[likely
]] {
85 // CHECK-LABEL: define{{.*}}ob0
86 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
87 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
88 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
89 if (__builtin_expect(a() || b() || c(), 0)) {
97 // CHECK-LABEL: define{{.*}}ou
98 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
99 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
100 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
101 if (a() || b() || c()) [[unlikely
]] {
109 // CHECK-LABEL: define{{.*}}nb1
110 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
111 if (__builtin_expect(!a(), 1)) {
119 // CHECK-LABEL: define{{.*}}nl
120 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
121 if (bool d
= !a()) [[likely
]] {
129 // CHECK-LABEL: define{{.*}}nb0
130 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
131 if (__builtin_expect(!a(), 0)) {
139 // CHECK-LABEL: define{{.*}}nu
140 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
141 if (bool d
= !a()) [[unlikely
]] {
149 // CHECK-LABEL: define{{.*}}tb1
150 // CHECK: br {{.*}}false{{$}}
151 // CHECK: br {{.*}}end{{$}}
152 // CHECK: br {{.*}}end{{$}}
153 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
154 if (__builtin_expect(a() ? b() : c(), 1)) {
162 // CHECK-LABEL: define{{.*}}tl
163 // CHECK: br {{.*}}false{{$}}
164 // CHECK: br {{.*}}end{{$}}
165 // CHECK: br {{.*}}end{{$}}
166 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
167 if (bool d
= a() ? b() : c()) [[likely
]] {
175 // CHECK-LABEL: define{{.*}}tl
176 // CHECK: br {{.*}}false{{$}}
177 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
178 // CHECK: br {{.*}} !prof [[BW_LIKELY]]
179 if (a() ? b() : c()) [[likely
]] {
187 // CHECK-LABEL: define{{.*}}tb0
188 // CHECK: br {{.*}}false{{$}}
189 // CHECK: br {{.*}}end{{$}}
190 // CHECK: br {{.*}}end{{$}}
191 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
192 if (__builtin_expect(a() ? b() : c(), 0)) {
200 // CHECK-LABEL: define{{.*}}tu
201 // CHECK: br {{.*}}false{{$}}
202 // CHECK: br {{.*}}end{{$}}
203 // CHECK: br {{.*}}end{{$}}
204 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
205 if (bool d
= a() ? b() : c()) [[unlikely
]] {
213 // CHECK-LABEL: define{{.*}}tu
214 // CHECK: br {{.*}}false{{$}}
215 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
216 // CHECK: br {{.*}} !prof [[BW_UNLIKELY]]
217 if (a() ? b() : c()) [[unlikely
]] {
224 // CHECK: [[BW_LIKELY]] = !{!"branch_weights", i32 2000, i32 1}
225 // CHECK: [[BW_UNLIKELY]] = !{!"branch_weights", i32 1, i32 2000}