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