|
| 1 | +// Test IR generation of the builtin without evaluating the LLVM intrinsic. |
| 2 | +// RUN: %clang_cc1 -triple x86_64-linux-gnu -Werror -std=c++20 -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-CODEGEN |
| 3 | +// RUN: %clang_cc1 -triple x86_64-linux-gnu -Werror -std=c++20 -emit-llvm -falloc-token-max=2 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-LOWER |
| 4 | + |
| 5 | +extern "C" void *my_malloc(unsigned long, unsigned long); |
| 6 | + |
| 7 | +struct NoPtr { |
| 8 | + int x; |
| 9 | + long y; |
| 10 | +}; |
| 11 | + |
| 12 | +struct WithPtr { |
| 13 | + int a; |
| 14 | + char *buf; |
| 15 | +}; |
| 16 | + |
| 17 | +int unevaluated_fn(); |
| 18 | + |
| 19 | +// CHECK-LABEL: @_Z16test_builtin_intv( |
| 20 | +unsigned long test_builtin_int() { |
| 21 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_INT:[0-9]+]]) |
| 22 | + // CHECK-LOWER: ret i64 0 |
| 23 | + return __builtin_infer_alloc_token(sizeof(1)); |
| 24 | +} |
| 25 | + |
| 26 | +// CHECK-LABEL: @_Z16test_builtin_ptrv( |
| 27 | +unsigned long test_builtin_ptr() { |
| 28 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_PTR:[0-9]+]]) |
| 29 | + // CHECK-LOWER: ret i64 1 |
| 30 | + return __builtin_infer_alloc_token(sizeof(int *)); |
| 31 | +} |
| 32 | + |
| 33 | +// CHECK-LABEL: @_Z25test_builtin_struct_noptrv( |
| 34 | +unsigned long test_builtin_struct_noptr() { |
| 35 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_NOPTR:[0-9]+]]) |
| 36 | + // CHECK-LOWER: ret i64 0 |
| 37 | + return __builtin_infer_alloc_token(sizeof(NoPtr)); |
| 38 | +} |
| 39 | + |
| 40 | +// CHECK-LABEL: @_Z25test_builtin_struct_w_ptrv( |
| 41 | +unsigned long test_builtin_struct_w_ptr() { |
| 42 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_WITHPTR:[0-9]+]]) |
| 43 | + // CHECK-LOWER: ret i64 1 |
| 44 | + return __builtin_infer_alloc_token(sizeof(WithPtr), 123); |
| 45 | +} |
| 46 | + |
| 47 | +// CHECK-LABEL: @_Z24test_builtin_unevaluatedv( |
| 48 | +unsigned long test_builtin_unevaluated() { |
| 49 | + // CHECK-NOT: call{{.*}}unevaluated_fn |
| 50 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_INT:[0-9]+]]) |
| 51 | + // CHECK-LOWER: ret i64 0 |
| 52 | + return __builtin_infer_alloc_token(sizeof(int) * unevaluated_fn()); |
| 53 | +} |
| 54 | + |
| 55 | +// CHECK-LABEL: @_Z36test_builtin_unsequenced_unevaluatedi( |
| 56 | +void test_builtin_unsequenced_unevaluated(int x) { |
| 57 | + // CHECK: add nsw |
| 58 | + // CHECK-NOT: add nsw |
| 59 | + // CHECK-CODEGEN: %[[REG:[0-9]+]] = call i64 @llvm.alloc.token.id.i64(metadata ![[MD_UNKNOWN:[0-9]+]]) |
| 60 | + // CHECK-CODEGEN: call{{.*}}@my_malloc({{.*}}, i64 noundef %[[REG]]) |
| 61 | + // CHECK-LOWER: call{{.*}}@my_malloc({{.*}}, i64 noundef 0) |
| 62 | + my_malloc(++x, __builtin_infer_alloc_token(++x)); |
| 63 | +} |
| 64 | + |
| 65 | +// CHECK-LABEL: @_Z20test_builtin_unknownv( |
| 66 | +unsigned long test_builtin_unknown() { |
| 67 | + // CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[MD_UNKNOWN:[0-9]+]]) |
| 68 | + // CHECK-LOWER: ret i64 0 |
| 69 | + return __builtin_infer_alloc_token(4096); |
| 70 | +} |
| 71 | + |
| 72 | +// CHECK-CODEGEN: ![[MD_INT]] = !{!"int", i1 false} |
| 73 | +// CHECK-CODEGEN: ![[MD_PTR]] = !{!"int *", i1 true} |
| 74 | +// CHECK-CODEGEN: ![[MD_NOPTR]] = !{!"NoPtr", i1 false} |
| 75 | +// CHECK-CODEGEN: ![[MD_WITHPTR]] = !{!"WithPtr", i1 true} |
| 76 | +// CHECK-CODEGEN: ![[MD_UNKNOWN]] = !{} |
0 commit comments