1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -triple x86_64-apple-darwin10.6.0 -emit-llvm -o - %s | FileCheck %s
2*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -triple x86_64-apple-darwin10.6.0 -x c++ -std=c++11 -emit-pch -o %t %s
3*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -triple x86_64-apple-darwin10.6.0 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
5*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
6*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
74f680db2SAlexey Bataev 
8*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -triple x86_64-apple-darwin10.6.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
9*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -triple x86_64-apple-darwin10.6.0 -x c++ -std=c++11 -emit-pch -o %t %s
10*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -triple x86_64-apple-darwin10.6.0 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
11*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
12*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
13*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
144f680db2SAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
154f680db2SAlexey Bataev // expected-no-diagnostics
164f680db2SAlexey Bataev 
174f680db2SAlexey Bataev #ifndef HEADER
184f680db2SAlexey Bataev #define HEADER
194f680db2SAlexey Bataev 
206cf7b715SAlexey Bataev enum omp_allocator_handle_t {
216cf7b715SAlexey Bataev   omp_null_allocator = 0,
226cf7b715SAlexey Bataev   omp_default_mem_alloc = 1,
236cf7b715SAlexey Bataev   omp_large_cap_mem_alloc = 2,
246cf7b715SAlexey Bataev   omp_const_mem_alloc = 3,
256cf7b715SAlexey Bataev   omp_high_bw_mem_alloc = 4,
266cf7b715SAlexey Bataev   omp_low_lat_mem_alloc = 5,
276cf7b715SAlexey Bataev   omp_cgroup_mem_alloc = 6,
286cf7b715SAlexey Bataev   omp_pteam_mem_alloc = 7,
296cf7b715SAlexey Bataev   omp_thread_mem_alloc = 8,
306cf7b715SAlexey Bataev   KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__
316cf7b715SAlexey Bataev };
324f680db2SAlexey Bataev 
334f680db2SAlexey Bataev struct St {
344f680db2SAlexey Bataev   int a;
354f680db2SAlexey Bataev };
364f680db2SAlexey Bataev 
374f680db2SAlexey Bataev struct St1 {
384f680db2SAlexey Bataev   int a;
394f680db2SAlexey Bataev   static int b;
404f680db2SAlexey Bataev #pragma omp allocate(b) allocator(omp_default_mem_alloc)
414f680db2SAlexey Bataev } d;
424f680db2SAlexey Bataev 
43282555adSAlexey Bataev int a, b, c;
444f680db2SAlexey Bataev #pragma omp allocate(a) allocator(omp_large_cap_mem_alloc)
45282555adSAlexey Bataev #pragma omp allocate(b) allocator(omp_const_mem_alloc)
46282555adSAlexey Bataev #pragma omp allocate(d, c) allocator(omp_high_bw_mem_alloc)
474f680db2SAlexey Bataev 
484f680db2SAlexey Bataev template <class T>
494f680db2SAlexey Bataev struct ST {
504f680db2SAlexey Bataev   static T m;
514f680db2SAlexey Bataev #pragma omp allocate(m) allocator(omp_low_lat_mem_alloc)
524f680db2SAlexey Bataev };
534f680db2SAlexey Bataev 
foo()544f680db2SAlexey Bataev template <class T> T foo() {
554f680db2SAlexey Bataev   T v;
564f680db2SAlexey Bataev #pragma omp allocate(v) allocator(omp_cgroup_mem_alloc)
574f680db2SAlexey Bataev   v = ST<T>::m;
584f680db2SAlexey Bataev   return v;
594f680db2SAlexey Bataev }
604f680db2SAlexey Bataev 
614f680db2SAlexey Bataev namespace ns {
624f680db2SAlexey Bataev int a;
634f680db2SAlexey Bataev }
644f680db2SAlexey Bataev #pragma omp allocate(ns::a) allocator(omp_pteam_mem_alloc)
654f680db2SAlexey Bataev 
664f680db2SAlexey Bataev // CHECK-NOT:  call {{.+}} {{__kmpc_alloc|__kmpc_free}}
674f680db2SAlexey Bataev 
main()684f680db2SAlexey Bataev int main() {
694f680db2SAlexey Bataev   static int a;
704f680db2SAlexey Bataev #pragma omp allocate(a) allocator(omp_thread_mem_alloc)
714f680db2SAlexey Bataev   a = 2;
724f680db2SAlexey Bataev   double b = 3;
734f680db2SAlexey Bataev #pragma omp allocate(b)
744f680db2SAlexey Bataev   return (foo<int>());
754f680db2SAlexey Bataev }
764f680db2SAlexey Bataev 
777df2371bSDavid Pagan // CHECK-LABEL: define {{[^@]+}}@main
787df2371bSDavid Pagan // CHECK-SAME: () #[[ATTR0:[0-9]+]] {
797df2371bSDavid Pagan // CHECK-NEXT:  entry:
807df2371bSDavid Pagan // CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
817df2371bSDavid Pagan // CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
827df2371bSDavid Pagan // CHECK-NEXT:    store i32 0, i32* [[RETVAL]], align 4
837df2371bSDavid Pagan // CHECK-NEXT:    store i32 2, i32* @_ZZ4mainE1a, align 4
847df2371bSDavid Pagan // CHECK-NEXT:    [[DOTB__VOID_ADDR:%.*]] = call i8* @__kmpc_alloc(i32 [[TMP0]], i64 8, i8* null)
857df2371bSDavid Pagan // CHECK-NEXT:    [[DOTB__ADDR:%.*]] = bitcast i8* [[DOTB__VOID_ADDR]] to double*
867df2371bSDavid Pagan // CHECK-NEXT:    store double 3.000000e+00, double* [[DOTB__ADDR]], align 8
871b1c8d83Shyeongyu kim // CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z3fooIiET_v()
887df2371bSDavid Pagan // CHECK-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
897df2371bSDavid Pagan // CHECK-NEXT:    [[TMP1:%.*]] = bitcast double* [[DOTB__ADDR]] to i8*
907df2371bSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP1]], i8* null)
917df2371bSDavid Pagan // CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[RETVAL]], align 4
927df2371bSDavid Pagan // CHECK-NEXT:    ret i32 [[TMP2]]
937df2371bSDavid Pagan 
94084b0c2fSAlexey Bataev // CHECK: define {{.*}}i32 @{{.+}}foo{{.+}}()
954f680db2SAlexey Bataev // CHECK:      [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @{{.+}})
966cf7b715SAlexey Bataev // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 4, i8* inttoptr (i64 6 to i8*))
974f680db2SAlexey Bataev // CHECK-NEXT: [[V_ADDR:%.+]] = bitcast i8* [[V_VOID_ADDR]] to i32*
984f680db2SAlexey Bataev // CHECK-NOT:  {{__kmpc_alloc|__kmpc_free}}
994f680db2SAlexey Bataev // CHECK:      store i32 %{{.+}}, i32* [[V_ADDR]],
1004f680db2SAlexey Bataev // CHECK-NEXT: [[V_VAL:%.+]] = load i32, i32* [[V_ADDR]],
101738bab74SAlexey Bataev // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = bitcast i32* [[V_ADDR]] to i8*
1026cf7b715SAlexey Bataev // CHECK-NEXT: call void @__kmpc_free(i32 [[GTID]], i8* [[V_VOID_ADDR]], i8* inttoptr (i64 6 to i8*))
1034f680db2SAlexey Bataev // CHECK-NOT:  {{__kmpc_alloc|__kmpc_free}}
1044f680db2SAlexey Bataev // CHECK:      ret i32 [[V_VAL]]
1054f680db2SAlexey Bataev 
1064f680db2SAlexey Bataev // CHECK-NOT:  call {{.+}} {{__kmpc_alloc|__kmpc_free}}
1074f680db2SAlexey Bataev extern template int ST<int>::m;
108366f4d45SAlexey Bataev 
1091b1c8d83Shyeongyu kim // CHECK: define{{.*}} void @{{.+}}bar{{.+}}(i32 noundef %{{.+}}, float* noundef {{.+}})
bar(int a,float & z)110366f4d45SAlexey Bataev void bar(int a, float &z) {
111366f4d45SAlexey Bataev // CHECK: [[A_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID:%.+]], i64 4, i8* inttoptr (i64 1 to i8*))
112366f4d45SAlexey Bataev // CHECK: [[A_ADDR:%.+]] = bitcast i8* [[A_VOID_PTR]] to i32*
113366f4d45SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* [[A_ADDR]],
114366f4d45SAlexey Bataev // CHECK: [[Z_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 8, i8* inttoptr (i64 1 to i8*))
115366f4d45SAlexey Bataev // CHECK: [[Z_ADDR:%.+]] = bitcast i8* [[Z_VOID_PTR]] to float**
116366f4d45SAlexey Bataev // CHECK: store float* %{{.+}}, float** [[Z_ADDR]],
117366f4d45SAlexey Bataev #pragma omp allocate(a, z) allocator(omp_default_mem_alloc)
118738bab74SAlexey Bataev   // CHECK-NEXT: [[Z_VOID_PTR:%.+]] = bitcast float** [[Z_ADDR]] to i8*
119366f4d45SAlexey Bataev   // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[Z_VOID_PTR]], i8* inttoptr (i64 1 to i8*))
120738bab74SAlexey Bataev   // CHECK-NEXT: [[A_VOID_PTR:%.+]] = bitcast i32* [[A_ADDR]] to i8*
121366f4d45SAlexey Bataev   // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[A_VOID_PTR]], i8* inttoptr (i64 1 to i8*))
122366f4d45SAlexey Bataev   // CHECK: ret void
123366f4d45SAlexey Bataev }
1244f680db2SAlexey Bataev #endif
125