1 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -o - %s -O1 | FileCheck %s |
2 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -o - -x c++ %s -O1 | FileCheck %s |
3 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=CHECK_O0 |
4 | |
5 | // When optimizing, the builtin should be converted to metadata. |
6 | // When not optimizing, there should be no metadata created for the builtin. |
7 | // In both cases, the builtin should be removed from the code. |
8 | |
9 | #ifdef __cplusplus |
10 | extern "C" { |
11 | #endif |
12 | |
13 | void foo(); |
14 | void branch(int x) { |
15 | // CHECK-LABEL: define void @branch( |
16 | |
17 | // CHECK-NOT: builtin_unpredictable |
18 | // CHECK: !unpredictable [[METADATA:.+]] |
19 | |
20 | // CHECK_O0-NOT: builtin_unpredictable |
21 | // CHECK_O0-NOT: !unpredictable |
22 | |
23 | if (__builtin_unpredictable(x > 0)) |
24 | foo (); |
25 | } |
26 | |
27 | int unpredictable_switch(int x) { |
28 | // CHECK-LABEL: @unpredictable_switch( |
29 | |
30 | // CHECK-NOT: builtin_unpredictable |
31 | // CHECK: !unpredictable [[METADATA:.+]] |
32 | |
33 | // CHECK_O0-NOT: builtin_unpredictable |
34 | // CHECK_O0-NOT: !unpredictable |
35 | |
36 | switch(__builtin_unpredictable(x)) { |
37 | default: |
38 | return 0; |
39 | case 0: |
40 | case 1: |
41 | case 2: |
42 | return 1; |
43 | case 5: |
44 | return 5; |
45 | }; |
46 | |
47 | return 0; |
48 | } |
49 | |
50 | #ifdef __cplusplus |
51 | } |
52 | #endif |
53 | |
54 | |
55 | // CHECK: [[METADATA]] = !{} |
56 | |
57 | |