diff options
author | Pete Cooper <peter_cooper@apple.com> | 2015-01-26 20:51:58 +0000 |
---|---|---|
committer | Pete Cooper <peter_cooper@apple.com> | 2015-01-26 20:51:58 +0000 |
commit | f051cbf6313251ce07b89cd35bf674118d833d7e (patch) | |
tree | 7df62e1714bee5bec95d8824f22f9cfb952ecdda | |
parent | 0dc86722f55adfd0e311066ca627626de999ca2d (diff) | |
download | bcm5719-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.cpp | 7 | ||||
-rw-r--r-- | clang/test/CodeGen/builtin-expect.c | 16 |
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; |