|
1 | | -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs |
2 | 1 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++14 -emit-llvm -o - %s | FileCheck %s |
3 | 2 |
|
4 | | -constexpr int b = 10; |
5 | | -int test_char_cast() { |
6 | | - const int f = (__builtin_assume_dereferenceable((char*)&b + 1, 3), 12); |
7 | | - return f; |
| 3 | +int b = 10; |
| 4 | +const int f = (__builtin_assume_dereferenceable((char*)&b + 1, 3), 12); |
| 5 | +int use_f = f; |
| 6 | + |
| 7 | +constexpr int g = 20; |
| 8 | +const int h = (__builtin_assume_dereferenceable((char*)&g + 1, 2), 42); |
| 9 | +int use_h = h; |
| 10 | + |
| 11 | +constexpr char arr[] = "hello"; |
| 12 | +constexpr const char* ptr = arr + 1; |
| 13 | +constexpr int fully_constexpr() { |
| 14 | + __builtin_assume_dereferenceable(ptr, 2); |
| 15 | + return 100; |
8 | 16 | } |
| 17 | +constexpr int i = fully_constexpr(); |
| 18 | +int use_i = i; |
9 | 19 |
|
10 | | -constexpr long long ll = 100; |
11 | | -int test_void_cast() { |
12 | | - const int h = (__builtin_assume_dereferenceable((void*)&ll, 8), 99); |
13 | | - return h; |
| 20 | +void test_integral_ptr() { |
| 21 | + __builtin_assume_dereferenceable((int*)0x1234, 4); |
14 | 22 | } |
15 | 23 |
|
16 | | -constexpr int gb = 10; |
17 | | -const int gf = (__builtin_assume_dereferenceable((char*)&gb + 1, 3), 12); |
18 | | -int ga = gf; |
| 24 | +void test_nullptr() { |
| 25 | + __builtin_assume_dereferenceable(nullptr, 0); |
| 26 | +} |
19 | 27 |
|
20 | | -// CHECK-LABEL: test_char_castv |
21 | | -// CHECK: [[F:%.*]] = alloca i32, align 4 |
22 | | -// CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr getelementptr inbounds (i8, ptr @_ZL1b, i64 1), i64 3) ] |
23 | | -// CHECK-NEXT: store i32 12, ptr [[F]], align 4 |
24 | | -// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[F]], align 4 |
25 | | -// CHECK-NEXT: ret i32 [[TMP0]] |
26 | | -// |
27 | | -// |
28 | | -// CHECK-LABEL: test_void_castv |
29 | | -// CHECK: [[H:%.*]] = alloca i32, align 4 |
30 | | -// CHECK-NEXT: store i32 99, ptr [[H]], align 4 |
31 | | -// CHECK-NEXT: ret i32 99 |
32 | | -// |
| 28 | +void test_zero_size() { |
| 29 | + int x = 10; |
| 30 | + __builtin_assume_dereferenceable(&x, 0); |
| 31 | +} |
| 32 | + |
| 33 | +void test_function_ptr() { |
| 34 | + __builtin_assume_dereferenceable((void*)&test_zero_size, 8); |
| 35 | +} |
| 36 | + |
| 37 | +// CHECK: @use_i = global i32 100 |
33 | 38 | // |
34 | | -// CHECK-LABEL: __cxx_global_var_init |
35 | | -// CHECK: [[TMP0:%.*]] = load i32, ptr @_ZL2gf, align 4 |
36 | | -// CHECK-NEXT: store i32 [[TMP0]], ptr @ga, align 4 |
37 | | -// CHECK-NEXT: ret void |
| 39 | +// CHECK: @{{_Z[0-9]+}}test_integral_ptrv |
| 40 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr inttoptr (i64 4660 to ptr), i64 4) ] |
38 | 41 | // |
| 42 | +// CHECK: @{{_Z[0-9]+}}test_nullptrv |
| 43 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr null, i64 0) ] |
39 | 44 | // |
40 | | -// CHECK-LABEL: __cxx_global_var_init.1 |
41 | | -// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr getelementptr inbounds (i8, ptr @_ZL2gb, i64 1), i64 3) ] |
42 | | -// CHECK-NEXT: store i32 12, ptr @_ZL2gf, align 4 |
43 | | -// CHECK-NEXT: ret void |
| 45 | +// CHECK: @{{_Z[0-9]+}}test_zero_sizev |
| 46 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr {{%.*}}, i64 0) ] |
44 | 47 | // |
| 48 | +// CHECK: @{{_Z[0-9]+}}test_function_ptrv |
| 49 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr @{{_Z[0-9]+}}test_zero_sizev, i64 8) ] |
45 | 50 | // |
46 | | -// CHECK-LABEL: _GLOBAL__sub_I_builtin_assume_dereferenceable_constexpr.cpp |
47 | | -// CHECK: call void @__cxx_global_var_init.1() |
48 | | -// CHECK-NEXT: call void @__cxx_global_var_init() |
49 | | -// CHECK-NEXT: ret void |
| 51 | +// CHECK: __cxx_global_var_init |
| 52 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr getelementptr inbounds (i8, ptr @b, i64 1), i64 3) ] |
50 | 53 | // |
| 54 | +// CHECK: __cxx_global_var_init |
| 55 | +// CHECK: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr getelementptr inbounds (i8, ptr @{{_ZL[0-9]+}}g, i64 1), i64 2) ] |
| 56 | +// CHECK: store i32 42, ptr @{{_ZL[0-9]+}}h |
0 commit comments