xref: /llvm-project/clang/test/CodeGen/builtin-expect.c (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O1 -disable-llvm-passes | FileCheck %s --check-prefix=ALL --check-prefix=O1
2 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=ALL --check-prefix=O0
3 
4 // In all tests, make sure that no expect is generated if optimizations are off.
5 // If optimizations are on, generate the correct expect and preserve other necessary operations.
6 
expect_taken(int x)7 int expect_taken(int x) {
8 // ALL-LABEL: define{{.*}} i32 @expect_taken
9 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 1)
10 // O0-NOT:    @llvm.expect
11 
12   if (__builtin_expect (x, 1))
13     return 0;
14   return x;
15 }
16 
17 
expect_not_taken(int x)18 int expect_not_taken(int x) {
19 // ALL-LABEL: define{{.*}} i32 @expect_not_taken
20 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 0)
21 // O0-NOT:    @llvm.expect
22 
23   if (__builtin_expect (x, 0))
24     return 0;
25   return x;
26 }
27 
28 
29 int x;
30 int y(void);
31 void foo(void);
32 
expect_value_side_effects(void)33 void expect_value_side_effects(void) {
34 // ALL-LABEL: define{{.*}} void @expect_value_side_effects()
35 // ALL:       [[CALL:%.*]] = call i32 @y
36 // O1:        [[SEXT:%.*]] = sext i32 [[CALL]] to i64
37 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 [[SEXT]])
38 // O0-NOT:    @llvm.expect
39 
40   if (__builtin_expect (x, y()))
41     foo ();
42 }
43 
44 
45 // Make sure that issigprocmask() is called before bar()?
46 // There's no compare, so there's nothing to expect?
47 void isigprocmask(void);
48 long bar(void);
49 
main(void)50 int main(void) {
51 // ALL-LABEL: define{{.*}} i32 @main()
52 // ALL:       call void @isigprocmask()
53 // ALL:       [[CALL:%.*]] = call i64 @bar()
54 // O1:        call i64 @llvm.expect.i64(i64 0, i64 [[CALL]])
55 // O0-NOT:    @llvm.expect
56 
57   (void) __builtin_expect((isigprocmask(), 0), bar());
58 }
59 
60 
switch_cond(int x)61 int switch_cond(int x) {
62 // ALL-LABEL: define{{.*}} i32 @switch_cond
63 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 5)
64 // O0-NOT:    @llvm.expect
65 
66   switch(__builtin_expect(x, 5)) {
67   default:
68     return 0;
69   case 0:
70   case 1:
71   case 2:
72     return 1;
73   case 5:
74     return 5;
75   };
76 
77   return 0;
78 }
79 
variable_expected(int stuff)80 int variable_expected(int stuff) {
81 // ALL-LABEL: define{{.*}} i32 @variable_expected(
82 // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 {{%.*}})
83 // O0-NOT: @llvm.expect
84 
85   int res = 0;
86 
87   switch (__builtin_expect(stuff, stuff)) {
88   case 0:
89     res = 1;
90     break;
91   default:
92     break;
93   }
94 
95   return res;
96 }
97