summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPete Cooper <peter_cooper@apple.com>2015-01-26 20:51:58 +0000
committerPete Cooper <peter_cooper@apple.com>2015-01-26 20:51:58 +0000
commitf051cbf6313251ce07b89cd35bf674118d833d7e (patch)
tree7df62e1714bee5bec95d8824f22f9cfb952ecdda
parent0dc86722f55adfd0e311066ca627626de999ca2d (diff)
downloadbcm5719-llvm-f051cbf6313251ce07b89cd35bf674118d833d7e.tar.gz
bcm5719-llvm-f051cbf6313251ce07b89cd35bf674118d833d7e.zip
Don't generate llvm.expect intrinsics with -O0.
The backend won't run LowerExpect on -O0. In a debug LTO build, this results in llvm.expect intrinsics being in the LTO IR which doesn't know how to optimize them. Thanks to Chandler for the suggestion and review. Differential revision: http://reviews.llvm.org/D7183 llvm-svn: 227135
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp7
-rw-r--r--clang/test/CodeGen/builtin-expect.c16
2 files changed, 18 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 8f320d1d776..ee8aa12b680 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -389,9 +389,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Value *ArgValue = EmitScalarExpr(E->getArg(0));
llvm::Type *ArgType = ArgValue->getType();
- Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
+ // Don't generate llvm.expect on -O0 as the backend won't use it for
+ // anything.
+ // Note, we still IRGen ExpectedValue because it could have side-effects.
+ if (CGM.getCodeGenOpts().OptimizationLevel == 0)
+ return RValue::get(ArgValue);
+ Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
"expval");
return RValue::get(Result);
diff --git a/clang/test/CodeGen/builtin-expect.c b/clang/test/CodeGen/builtin-expect.c
index 664c6b6a470..21c3adedbd2 100644
--- a/clang/test/CodeGen/builtin-expect.c
+++ b/clang/test/CodeGen/builtin-expect.c
@@ -1,10 +1,14 @@
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=CHECK_O0
int x;
int y(void);
void foo();
void FUNC() {
+// CHECK-LABEL: define void @FUNC()
// CHECK: [[call:%.*]] = call i32 @y
+// CHECK_O0: [[call:%.*]] = call i32 @y
+// CHECK_O0-NOT: call i64 @llvm.expect
if (__builtin_expect (x, y()))
foo ();
}
@@ -17,21 +21,25 @@ int main() {
(void) __builtin_expect((isigprocmask(), 0), bar());
}
+// CHECK-LABEL: define i32 @main()
// CHECK: call void @isigprocmask()
// CHECK: [[C:%.*]] = call i64 (...)* @bar()
+// CHECK_O0: call void @isigprocmask()
+// CHECK_O0: [[C:%.*]] = call i64 (...)* @bar()
+// CHECK_O0-NOT: call i64 @llvm.expect
-// CHECK: @test1
+// CHECK-LABEL: define i32 @test1
int test1(int x) {
-// CHECK: @llvm.expect
+// CHECK_O0-NOT: call i64 @llvm.expect
if (__builtin_expect (x, 1))
return 0;
return x;
}
-// CHECK: @test2
+// CHECK: define i32 @test2
int test2(int x) {
-// CHECK: @llvm.expect
+// CHECK_O0-NOT: call i64 @llvm.expect
switch(__builtin_expect(x, 5)) {
default:
return 0;
OpenPOWER on IntegriCloud