1de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -emit-llvm -o - %s | FileCheck %s 2de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -x c++ -std=c++11 -emit-pch -o %t %s 3de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 4de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s 5de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s 6de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 7de59f564SAaron Ballman 8de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 9de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -x c++ -std=c++11 -emit-pch -o %t %s 10de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -triple x86_64-apple-darwin10.6.0 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s 11de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 12de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s 13de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -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 14de59f564SAaron Ballman // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 15de59f564SAaron Ballman // expected-no-diagnostics 16de59f564SAaron Ballman 17de59f564SAaron Ballman #ifndef HEADER 18de59f564SAaron Ballman #define HEADER 19de59f564SAaron Ballman 20de59f564SAaron Ballman enum omp_allocator_handle_t { 21de59f564SAaron Ballman omp_null_allocator = 0, 22de59f564SAaron Ballman omp_default_mem_alloc = 1, 23de59f564SAaron Ballman omp_large_cap_mem_alloc = 2, 24de59f564SAaron Ballman omp_const_mem_alloc = 3, 25de59f564SAaron Ballman omp_high_bw_mem_alloc = 4, 26de59f564SAaron Ballman omp_low_lat_mem_alloc = 5, 27de59f564SAaron Ballman omp_cgroup_mem_alloc = 6, 28de59f564SAaron Ballman omp_pteam_mem_alloc = 7, 29de59f564SAaron Ballman omp_thread_mem_alloc = 8, 30de59f564SAaron Ballman KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__ 31de59f564SAaron Ballman }; 32de59f564SAaron Ballman 33de59f564SAaron Ballman struct St{ 34de59f564SAaron Ballman int a; 35de59f564SAaron Ballman }; 36de59f564SAaron Ballman 37de59f564SAaron Ballman struct St1{ 38de59f564SAaron Ballman int a; 39de59f564SAaron Ballman static int b; 40de59f564SAaron Ballman [[omp::directive(allocate(b) allocator(omp_default_mem_alloc))]]; 41de59f564SAaron Ballman } d; 42de59f564SAaron Ballman 43de59f564SAaron Ballman int a, b, c; 44de59f564SAaron Ballman [[omp::directive(allocate(a) allocator(omp_large_cap_mem_alloc)), 45de59f564SAaron Ballman directive(allocate(b) allocator(omp_const_mem_alloc)), 46de59f564SAaron Ballman directive(allocate(d, c) allocator(omp_high_bw_mem_alloc))]]; 47de59f564SAaron Ballman 48de59f564SAaron Ballman template <class T> 49de59f564SAaron Ballman struct ST { 50de59f564SAaron Ballman static T m; 51de59f564SAaron Ballman [[omp::directive(allocate(m) allocator(omp_low_lat_mem_alloc))]]; 52de59f564SAaron Ballman }; 53de59f564SAaron Ballman 54de59f564SAaron Ballman template <class T> T foo() { 55de59f564SAaron Ballman T v; 56de59f564SAaron Ballman [[omp::directive(allocate(v) allocator(omp_cgroup_mem_alloc))]]; 57de59f564SAaron Ballman v = ST<T>::m; 58de59f564SAaron Ballman return v; 59de59f564SAaron Ballman } 60de59f564SAaron Ballman 61de59f564SAaron Ballman namespace ns{ 62de59f564SAaron Ballman int a; 63de59f564SAaron Ballman } 64de59f564SAaron Ballman [[omp::directive(allocate(ns::a) allocator(omp_pteam_mem_alloc))]]; 65de59f564SAaron Ballman 66de59f564SAaron Ballman // CHECK-NOT: call {{.+}} {{__kmpc_alloc|__kmpc_free}} 67de59f564SAaron Ballman 68de59f564SAaron Ballman // CHECK-LABEL: @main 69de59f564SAaron Ballman int main () { 70de59f564SAaron Ballman static int a; 71de59f564SAaron Ballman [[omp::directive(allocate(a) allocator(omp_thread_mem_alloc))]]; 72de59f564SAaron Ballman a=2; 73de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 74de59f564SAaron Ballman // CHECK: alloca double, 75de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 76de59f564SAaron Ballman double b = 3; 77de59f564SAaron Ballman [[omp::directive(allocate(b))]]; 78de59f564SAaron Ballman return (foo<int>()); 79de59f564SAaron Ballman } 80de59f564SAaron Ballman 81de59f564SAaron Ballman // CHECK: define {{.*}}i32 @{{.+}}foo{{.+}}() 82de59f564SAaron Ballman // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @{{.+}}) 83de59f564SAaron Ballman // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 4, i8* inttoptr (i64 6 to i8*)) 84de59f564SAaron Ballman // CHECK-NEXT: [[V_ADDR:%.+]] = bitcast i8* [[V_VOID_ADDR]] to i32* 85de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 86de59f564SAaron Ballman // CHECK: store i32 %{{.+}}, i32* [[V_ADDR]], 87de59f564SAaron Ballman // CHECK-NEXT: [[V_VAL:%.+]] = load i32, i32* [[V_ADDR]], 88de59f564SAaron Ballman // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = bitcast i32* [[V_ADDR]] to i8* 89de59f564SAaron Ballman // CHECK-NEXT: call void @__kmpc_free(i32 [[GTID]], i8* [[V_VOID_ADDR]], i8* inttoptr (i64 6 to i8*)) 90de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 91de59f564SAaron Ballman // CHECK: ret i32 [[V_VAL]] 92de59f564SAaron Ballman 93de59f564SAaron Ballman // CHECK-NOT: call {{.+}} {{__kmpc_alloc|__kmpc_free}} 94de59f564SAaron Ballman extern template int ST<int>::m; 95de59f564SAaron Ballman 96*fd9b0999Shyeongyu kim // CHECK: define{{.*}} void @{{.+}}bar{{.+}}(i32 %{{.+}}, float* {{.+}}) 97de59f564SAaron Ballman void bar(int a, float &z) { 98de59f564SAaron Ballman // CHECK: [[A_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID:%.+]], i64 4, i8* inttoptr (i64 1 to i8*)) 99de59f564SAaron Ballman // CHECK: [[A_ADDR:%.+]] = bitcast i8* [[A_VOID_PTR]] to i32* 100de59f564SAaron Ballman // CHECK: store i32 %{{.+}}, i32* [[A_ADDR]], 101de59f564SAaron Ballman // CHECK: [[Z_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 8, i8* inttoptr (i64 1 to i8*)) 102de59f564SAaron Ballman // CHECK: [[Z_ADDR:%.+]] = bitcast i8* [[Z_VOID_PTR]] to float** 103de59f564SAaron Ballman // CHECK: store float* %{{.+}}, float** [[Z_ADDR]], 104de59f564SAaron Ballman [[omp::directive(allocate(a,z) allocator(omp_default_mem_alloc))]]; 105de59f564SAaron Ballman // CHECK-NEXT: [[Z_VOID_PTR:%.+]] = bitcast float** [[Z_ADDR]] to i8* 106de59f564SAaron Ballman // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[Z_VOID_PTR]], i8* inttoptr (i64 1 to i8*)) 107de59f564SAaron Ballman // CHECK-NEXT: [[A_VOID_PTR:%.+]] = bitcast i32* [[A_ADDR]] to i8* 108de59f564SAaron Ballman // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[A_VOID_PTR]], i8* inttoptr (i64 1 to i8*)) 109de59f564SAaron Ballman // CHECK: ret void 110de59f564SAaron Ballman } 111de59f564SAaron Ballman #endif 112de59f564SAaron Ballman 113