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 int main() { 69de59f564SAaron Ballman static int a; 70de59f564SAaron Ballman [[omp::directive(allocate(a) allocator(omp_thread_mem_alloc))]]; 71de59f564SAaron Ballman a = 2; 72de59f564SAaron Ballman double b = 3; 73de59f564SAaron Ballman [[omp::directive(allocate(b))]]; 74de59f564SAaron Ballman return (foo<int>()); 75de59f564SAaron Ballman } 76de59f564SAaron Ballman 77*7df2371bSDavid Pagan // CHECK-LABEL: define {{[^@]+}}@main 78*7df2371bSDavid Pagan // CHECK-SAME: () #[[ATTR0:[0-9]+]] { 79*7df2371bSDavid Pagan // CHECK-NEXT: entry: 80*7df2371bSDavid Pagan // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 81*7df2371bSDavid Pagan // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) 82*7df2371bSDavid Pagan // CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4 83*7df2371bSDavid Pagan // CHECK-NEXT: store i32 2, i32* @_ZZ4mainE1a, align 4 84*7df2371bSDavid Pagan // CHECK-NEXT: [[DOTB__VOID_ADDR:%.*]] = call i8* @__kmpc_alloc(i32 [[TMP0]], i64 8, i8* null) 85*7df2371bSDavid Pagan // CHECK-NEXT: [[DOTB__ADDR:%.*]] = bitcast i8* [[DOTB__VOID_ADDR]] to double* 86*7df2371bSDavid Pagan // CHECK-NEXT: store double 3.000000e+00, double* [[DOTB__ADDR]], align 8 87*7df2371bSDavid Pagan // CHECK-NEXT: [[CALL:%.*]] = call i32 @_Z3fooIiET_v() 88*7df2371bSDavid Pagan // CHECK-NEXT: store i32 [[CALL]], i32* [[RETVAL]], align 4 89*7df2371bSDavid Pagan // CHECK-NEXT: [[TMP1:%.*]] = bitcast double* [[DOTB__ADDR]] to i8* 90*7df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP1]], i8* null) 91*7df2371bSDavid Pagan // CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[RETVAL]], align 4 92*7df2371bSDavid Pagan // CHECK-NEXT: ret i32 [[TMP2]] 93*7df2371bSDavid Pagan 94de59f564SAaron Ballman // CHECK: define {{.*}}i32 @{{.+}}foo{{.+}}() 95de59f564SAaron Ballman // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @{{.+}}) 96de59f564SAaron Ballman // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 4, i8* inttoptr (i64 6 to i8*)) 97de59f564SAaron Ballman // CHECK-NEXT: [[V_ADDR:%.+]] = bitcast i8* [[V_VOID_ADDR]] to i32* 98de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 99de59f564SAaron Ballman // CHECK: store i32 %{{.+}}, i32* [[V_ADDR]], 100de59f564SAaron Ballman // CHECK-NEXT: [[V_VAL:%.+]] = load i32, i32* [[V_ADDR]], 101de59f564SAaron Ballman // CHECK-NEXT: [[V_VOID_ADDR:%.+]] = bitcast i32* [[V_ADDR]] to i8* 102de59f564SAaron Ballman // CHECK-NEXT: call void @__kmpc_free(i32 [[GTID]], i8* [[V_VOID_ADDR]], i8* inttoptr (i64 6 to i8*)) 103de59f564SAaron Ballman // CHECK-NOT: {{__kmpc_alloc|__kmpc_free}} 104de59f564SAaron Ballman // CHECK: ret i32 [[V_VAL]] 105de59f564SAaron Ballman 106de59f564SAaron Ballman // CHECK-NOT: call {{.+}} {{__kmpc_alloc|__kmpc_free}} 107de59f564SAaron Ballman extern template int ST<int>::m; 108de59f564SAaron Ballman 109fd9b0999Shyeongyu kim // CHECK: define{{.*}} void @{{.+}}bar{{.+}}(i32 %{{.+}}, float* {{.+}}) 110de59f564SAaron Ballman void bar(int a, float &z) { 111de59f564SAaron Ballman // CHECK: [[A_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID:%.+]], i64 4, i8* inttoptr (i64 1 to i8*)) 112de59f564SAaron Ballman // CHECK: [[A_ADDR:%.+]] = bitcast i8* [[A_VOID_PTR]] to i32* 113de59f564SAaron Ballman // CHECK: store i32 %{{.+}}, i32* [[A_ADDR]], 114de59f564SAaron Ballman // CHECK: [[Z_VOID_PTR:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 8, i8* inttoptr (i64 1 to i8*)) 115de59f564SAaron Ballman // CHECK: [[Z_ADDR:%.+]] = bitcast i8* [[Z_VOID_PTR]] to float** 116de59f564SAaron Ballman // CHECK: store float* %{{.+}}, float** [[Z_ADDR]], 117de59f564SAaron Ballman [[omp::directive(allocate(a, z) allocator(omp_default_mem_alloc))]]; 118de59f564SAaron Ballman // CHECK-NEXT: [[Z_VOID_PTR:%.+]] = bitcast float** [[Z_ADDR]] to i8* 119de59f564SAaron Ballman // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[Z_VOID_PTR]], i8* inttoptr (i64 1 to i8*)) 120de59f564SAaron Ballman // CHECK-NEXT: [[A_VOID_PTR:%.+]] = bitcast i32* [[A_ADDR]] to i8* 121de59f564SAaron Ballman // CHECK: call void @__kmpc_free(i32 [[GTID]], i8* [[A_VOID_PTR]], i8* inttoptr (i64 1 to i8*)) 122de59f564SAaron Ballman // CHECK: ret void 123de59f564SAaron Ballman } 124de59f564SAaron Ballman #endif 125