mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 05:46:06 +00:00

See discussion in https://bugs.llvm.org/show_bug.cgi?id=45073 / https://reviews.llvm.org/D66324#2334485 the implementation is known-broken for certain inputs, the bugreport was up for a significant amount of timer, and there has been no activity to address it. Therefore, just completely rip out all of misexpect handling. I suspect, fixing it requires redesigning the internals of MD_misexpect. Should anyone commit to fixing the implementation problem, starting from clean slate may be better anyways. This reverts commit 7bdad08429411e7d0ecd58cd696b1efe3cff309e, and some of it's follow-ups, that don't stand on their own.
226 lines
4.3 KiB
C++
226 lines
4.3 KiB
C++
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | opt --lower-expect -S | FileCheck %s
|
|
|
|
// Verifies the output of __builtin_expect versus the output of the likelihood
|
|
// attributes. They should generate the same probabilities for the branches.
|
|
|
|
extern bool a();
|
|
extern bool b();
|
|
extern bool c();
|
|
|
|
void ab1(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ab1
|
|
// CHECK: br {{.*}} !prof !6
|
|
// CHECK: br {{.*}} !prof !6
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (__builtin_expect(a() && b() && a(), 1)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void al(int &i) {
|
|
// CHECK-LABEL: define{{.*}}al
|
|
// CHECK: br {{.*}} !prof !6
|
|
// CHECK: br {{.*}} !prof !6
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (a() && b() && c()) [[likely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void ab0(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ab0
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (__builtin_expect(a() && b() && c(), 0)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void au(int &i) {
|
|
// CHECK-LABEL: define{{.*}}au
|
|
// CHECK: br {{.*}}else{{$}}
|
|
// CHECK: br {{.*}}else{{$}}
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (a() && b() && c()) [[unlikely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void ob1(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ob1
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}rhs{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (__builtin_expect(a() || b() || a(), 1)) {
|
|
i = 0;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void ol(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ol
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}false2{{$}}
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (a() || b() || c()) [[likely]] {
|
|
i = 0;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void ob0(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ob0
|
|
// CHECK: br {{.*}} !prof !9
|
|
// CHECK: br {{.*}} !prof !9
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (__builtin_expect(a() || b() || c(), 0)) {
|
|
i = 0;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void ou(int &i) {
|
|
// CHECK-LABEL: define{{.*}}ou
|
|
// CHECK: br {{.*}} !prof !9
|
|
// CHECK: br {{.*}} !prof !9
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (a() || b() || c()) [[unlikely]] {
|
|
i = 0;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void nb1(int &i) {
|
|
// CHECK-LABEL: define{{.*}}nb1
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (__builtin_expect(!a(), 1)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void nl(int &i) {
|
|
// CHECK-LABEL: define{{.*}}nl
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (bool d = !a()) [[likely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void nb0(int &i) {
|
|
// CHECK-LABEL: define{{.*}}nb0
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (__builtin_expect(!a(), 0)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void nu(int &i) {
|
|
// CHECK-LABEL: define{{.*}}nu
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (bool d = !a()) [[unlikely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tb1(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tb1
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (__builtin_expect(a() ? b() : c(), 1)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tl(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tl
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (bool d = a() ? b() : c()) [[likely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tl2(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tl
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}} !prof !6
|
|
// CHECK: br {{.*}} !prof !6
|
|
if (a() ? b() : c()) [[likely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tb0(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tb0
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (__builtin_expect(a() ? b() : c(), 0)) {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tu(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tu
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}}end{{$}}
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (bool d = a() ? b() : c()) [[unlikely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
void tu2(int &i) {
|
|
// CHECK-LABEL: define{{.*}}tu
|
|
// CHECK: br {{.*}}false{{$}}
|
|
// CHECK: br {{.*}} !prof !9
|
|
// CHECK: br {{.*}} !prof !9
|
|
if (a() ? b() : c()) [[unlikely]] {
|
|
++i;
|
|
} else {
|
|
--i;
|
|
}
|
|
}
|
|
|
|
// CHECK: !6 = !{!"branch_weights", i32 2000, i32 1}
|
|
// CHECK: !9 = !{!"branch_weights", i32 1, i32 2000}
|