mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 17:45:07 +08:00
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
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user