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