]> granicus.if.org Git - clang/commitdiff
[builtin_expect] tighten checks, add test, add comments
authorSanjay Patel <spatel@rotateright.com>
Tue, 19 Apr 2016 18:17:34 +0000 (18:17 +0000)
committerSanjay Patel <spatel@rotateright.com>
Tue, 19 Apr 2016 18:17:34 +0000 (18:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266788 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/builtin-expect.c

index 884110cbe905e01a45336b72dee6ebc884bf5716..560625ed24392031749412db683a8ec091fe6012 100644 (file)
@@ -1,45 +1,69 @@
-// 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
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O1 -disable-llvm-optzns | FileCheck %s --check-prefix=ALL --check-prefix=O1
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=ALL --check-prefix=O0
+
+// In all tests, make sure that no expect is generated if optimizations are off.
+// If optimizations are on, generate the correct expect and preserve other necessary operations.
+
+int expect_taken(int x) {
+// ALL-LABEL: define i32 @expect_taken
+// O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 1)
+// O0-NOT:    @llvm.expect
+
+  if (__builtin_expect (x, 1))
+    return 0;
+  return x;
+}
+
+
+int expect_not_taken(int x) {
+// ALL-LABEL: define i32 @expect_not_taken
+// O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 0)
+// O0-NOT:    @llvm.expect
+
+  if (__builtin_expect (x, 0))
+    return 0;
+  return x;
+}
+
 
 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
+
+void expect_value_side_effects() {
+// ALL-LABEL: define void @expect_value_side_effects()
+// ALL:       [[CALL:%.*]] = call i32 @y
+// O1:        [[SEXT:%.*]] = sext i32 [[CALL]] to i64
+// O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 [[SEXT]])
+// O0-NOT:    @llvm.expect
+
   if (__builtin_expect (x, y()))
     foo ();
 }
 
+
+// Make sure that issigprocmask() is called before bar()?
+// There's no compare, so there's nothing to expect?
 // rdar://9330105
 void isigprocmask(void);
 long bar();
 
 int main() {
-    (void) __builtin_expect((isigprocmask(), 0), bar());
-}
+// ALL-LABEL: define i32 @main()
+// ALL:       call void @isigprocmask()
+// ALL:       [[CALL:%.*]] = call i64 (...) @bar()
+// O1:        call i64 @llvm.expect.i64(i64 0, i64 [[CALL]])
+// O0-NOT:    @llvm.expect
 
-// 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
+  (void) __builtin_expect((isigprocmask(), 0), bar());
+}
 
 
-// CHECK-LABEL: define i32 @test1
-int test1(int x) {
-// CHECK_O0-NOT: call i64 @llvm.expect
-  if (__builtin_expect (x, 1))
-    return 0;
-  return x;
-}
+int switch_cond(int x) {
+// ALL-LABEL: define i32 @switch_cond
+// O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 5)
+// O0-NOT:    @llvm.expect
 
-// CHECK: define i32 @test2
-int test2(int x) {
-// CHECK_O0-NOT: call i64 @llvm.expect
   switch(__builtin_expect(x, 5)) {
   default:
     return 0;
@@ -53,3 +77,4 @@ int test2(int x) {
 
   return 0;
 }
+