r266788 - [builtin_expect] tighten checks, add test, add comments

Sanjay Patel via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 19 11:17:34 PDT 2016


Author: spatel
Date: Tue Apr 19 13:17:34 2016
New Revision: 266788

URL: http://llvm.org/viewvc/llvm-project?rev=266788&view=rev
Log:
[builtin_expect] tighten checks, add test, add comments

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

Modified: cfe/trunk/test/CodeGen/builtin-expect.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtin-expect.c?rev=266788&r1=266787&r2=266788&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/builtin-expect.c (original)
+++ cfe/trunk/test/CodeGen/builtin-expect.c Tue Apr 19 13:17:34 2016
@@ -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;
 }
+




More information about the cfe-commits mailing list