r227135 - Don't generate llvm.expect intrinsics with -O0.

Pete Cooper peter_cooper at apple.com
Mon Jan 26 12:51:59 PST 2015


Author: pete
Date: Mon Jan 26 14:51:58 2015
New Revision: 227135

URL: http://llvm.org/viewvc/llvm-project?rev=227135&view=rev
Log:
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

Modified:
    cfe/trunk/lib/CodeGen/CGBuiltin.cpp
    cfe/trunk/test/CodeGen/builtin-expect.c

Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=227135&r1=227134&r2=227135&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Mon Jan 26 14:51:58 2015
@@ -389,9 +389,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(
     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);

Modified: cfe/trunk/test/CodeGen/builtin-expect.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtin-expect.c?rev=227135&r1=227134&r2=227135&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/builtin-expect.c (original)
+++ cfe/trunk/test/CodeGen/builtin-expect.c Mon Jan 26 14:51:58 2015
@@ -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;





More information about the cfe-commits mailing list