Clang Project

clang_source_code/test/CodeGen/builtin-unpredictable.c
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
10extern "C" {
11#endif
12
13void foo();
14void 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
27int 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