98 lines · cpp
1// To test IR generation of the builtin without evaluating the LLVM intrinsic,2// we set the mode to a stateful mode, which prohibits constant evaluation.3// RUN: %clang_cc1 -triple x86_64-linux-gnu -Werror -std=c++20 -emit-llvm -falloc-token-mode=random -disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-CODEGEN4// 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-LOWER5 6extern "C" void *my_malloc(unsigned long, unsigned long);7 8struct NoPtr {9 int x;10 long y;11};12 13struct WithPtr {14 int a;15 char *buf;16};17 18int unevaluated_fn();19 20// CHECK-LABEL: @_Z16test_builtin_intv(21// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_INT:[0-9]+]])22// CHECK-LOWER: ret i64 023unsigned long test_builtin_int() {24 return __builtin_infer_alloc_token(sizeof(1));25}26 27// CHECK-LABEL: @_Z16test_builtin_ptrv(28// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_PTR:[0-9]+]])29// CHECK-LOWER: ret i64 130unsigned long test_builtin_ptr() {31 return __builtin_infer_alloc_token(sizeof(int *));32}33 34// CHECK-LABEL: @_Z25test_builtin_struct_noptrv(35// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_NOPTR:[0-9]+]])36// CHECK-LOWER: ret i64 037unsigned long test_builtin_struct_noptr() {38 return __builtin_infer_alloc_token(sizeof(NoPtr));39}40 41// CHECK-LABEL: @_Z25test_builtin_struct_w_ptrv(42// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_WITHPTR:[0-9]+]])43// CHECK-LOWER: ret i64 144unsigned long test_builtin_struct_w_ptr() {45 return __builtin_infer_alloc_token(sizeof(WithPtr), 123);46}47 48// CHECK-LABEL: @_Z24test_builtin_unevaluatedv(49// CHECK-NOT: call{{.*}}unevaluated_fn50// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_INT:[0-9]+]])51// CHECK-LOWER: ret i64 052unsigned long test_builtin_unevaluated() {53 return __builtin_infer_alloc_token(sizeof(int) * unevaluated_fn());54}55 56// CHECK-LABEL: @_Z36test_builtin_unsequenced_unevaluatedi(57// CHECK: add nsw58// CHECK-NOT: add nsw59// CHECK-CODEGEN: %[[REG:[0-9]+]] = call i64 @llvm.alloc.token.id.i64(metadata ![[META_UNKNOWN:[0-9]+]])60// CHECK-CODEGEN: call{{.*}}@my_malloc({{.*}}, i64 noundef %[[REG]])61// CHECK-LOWER: call{{.*}}@my_malloc({{.*}}, i64 noundef 0)62void test_builtin_unsequenced_unevaluated(int x) {63 my_malloc(++x, __builtin_infer_alloc_token(++x));64}65 66// CHECK-LABEL: @_Z20test_builtin_unknownv(67// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_UNKNOWN:[0-9]+]])68// CHECK-LOWER: ret i64 069unsigned long test_builtin_unknown() {70 return __builtin_infer_alloc_token(4096);71}72 73// Test template instantiation.74template <typename T>75constexpr unsigned long get_token() {76 return __builtin_infer_alloc_token(sizeof(T));77}78 79// CHECK-LABEL: @_Z13get_token_intv()80// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_INT]])81// CHECK-LOWER: ret i64 082unsigned long get_token_int() {83 return get_token<int>();84}85 86// CHECK-LABEL: @_Z13get_token_ptrv()87// CHECK-CODEGEN: call i64 @llvm.alloc.token.id.i64(metadata ![[META_PTR]])88// CHECK-LOWER: ret i64 189unsigned long get_token_ptr() {90 return get_token<int *>();91}92 93// CHECK-CODEGEN: ![[META_INT]] = !{!"int", i1 false}94// CHECK-CODEGEN: ![[META_PTR]] = !{!"int *", i1 true}95// CHECK-CODEGEN: ![[META_NOPTR]] = !{!"NoPtr", i1 false}96// CHECK-CODEGEN: ![[META_WITHPTR]] = !{!"WithPtr", i1 true}97// CHECK-CODEGEN: ![[META_UNKNOWN]] = !{}98