1*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=50 -emit-llvm -o - %s | FileCheck %s 2*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -fopenmp -triple x86_64-apple-darwin10 -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 3*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -fopenmp -triple x86_64-apple-darwin10 -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 4*e46f0feeSAlexey Bataev 5*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fopenmp-version=50 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 6*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -triple x86_64-apple-darwin10 -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 7*e46f0feeSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -triple x86_64-apple-darwin10 -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s 8*e46f0feeSAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 9*e46f0feeSAlexey Bataev // expected-no-diagnostics 10*e46f0feeSAlexey Bataev 11*e46f0feeSAlexey Bataev #ifndef HEADER 12*e46f0feeSAlexey Bataev #define HEADER 13*e46f0feeSAlexey Bataev 14*e46f0feeSAlexey Bataev // CHECK-DAG: [[MAIN_A:@.+]] = internal global i8* null, 15*e46f0feeSAlexey Bataev // CHECK-DAG: [[TMAIN_A:@.+]] = linkonce_odr global i8* null, 16*e46f0feeSAlexey Bataev 17*e46f0feeSAlexey Bataev typedef void *omp_depend_t; 18*e46f0feeSAlexey Bataev 19*e46f0feeSAlexey Bataev void foo() {} 20*e46f0feeSAlexey Bataev 21*e46f0feeSAlexey Bataev template <class T> 22*e46f0feeSAlexey Bataev T tmain(T argc) { 23*e46f0feeSAlexey Bataev static T a; 24*e46f0feeSAlexey Bataev #pragma omp depobj(a) depend(in:argc) 25*e46f0feeSAlexey Bataev #pragma omp depobj(argc) destroy 26*e46f0feeSAlexey Bataev #pragma omp depobj(argc) update(inout) 27*e46f0feeSAlexey Bataev return argc; 28*e46f0feeSAlexey Bataev } 29*e46f0feeSAlexey Bataev 30*e46f0feeSAlexey Bataev int main(int argc, char **argv) { 31*e46f0feeSAlexey Bataev static omp_depend_t a; 32*e46f0feeSAlexey Bataev omp_depend_t b; 33*e46f0feeSAlexey Bataev #pragma omp depobj(a) depend(out:argc, argv) 34*e46f0feeSAlexey Bataev #pragma omp depobj(b) destroy 35*e46f0feeSAlexey Bataev #pragma omp depobj(b) update(mutexinoutset) 36*e46f0feeSAlexey Bataev (void)tmain(a), tmain(b); 37*e46f0feeSAlexey Bataev return 0; 38*e46f0feeSAlexey Bataev } 39*e46f0feeSAlexey Bataev 40*e46f0feeSAlexey Bataev // CHECK-LABEL: @main 41*e46f0feeSAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( 42*e46f0feeSAlexey Bataev // CHECK: [[DEP_ADDR_VOID:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 72, i8* null) 43*e46f0feeSAlexey Bataev // CHECK: [[DEP_ADDR:%.+]] = bitcast i8* [[DEP_ADDR_VOID]] to [3 x %struct.kmp_depend_info]* 44*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0 45*e46f0feeSAlexey Bataev // CHECK: [[SZ_BASE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0 46*e46f0feeSAlexey Bataev // CHECK: store i64 2, i64* [[SZ_BASE]], 47*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1 48*e46f0feeSAlexey Bataev // CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0 49*e46f0feeSAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[ADDR]], 50*e46f0feeSAlexey Bataev // CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1 51*e46f0feeSAlexey Bataev // CHECK: store i64 4, i64* [[SZ_ADDR]], 52*e46f0feeSAlexey Bataev // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2 53*e46f0feeSAlexey Bataev // CHECK: store i8 3, i8* [[FLAGS_ADDR]], 54*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 2 55*e46f0feeSAlexey Bataev // CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0 56*e46f0feeSAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[ADDR]], 57*e46f0feeSAlexey Bataev // CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1 58*e46f0feeSAlexey Bataev // CHECK: store i64 8, i64* [[SZ_ADDR]], 59*e46f0feeSAlexey Bataev // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2 60*e46f0feeSAlexey Bataev // CHECK: store i8 3, i8* [[FLAGS_ADDR]], 61*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0 62*e46f0feeSAlexey Bataev // CHECK: [[DEP:%.+]] = bitcast %struct.kmp_depend_info* [[BASE_ADDR]] to i8* 63*e46f0feeSAlexey Bataev // CHECK: store i8* [[DEP]], i8** [[MAIN_A]], 64*e46f0feeSAlexey Bataev 65*e46f0feeSAlexey Bataev // CHECK-LABEL: tmain 66*e46f0feeSAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( 67*e46f0feeSAlexey Bataev // CHECK: [[DEP_ADDR_VOID:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 48, i8* null) 68*e46f0feeSAlexey Bataev // CHECK: [[DEP_ADDR:%.+]] = bitcast i8* [[DEP_ADDR_VOID]] to [2 x %struct.kmp_depend_info]* 69*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0 70*e46f0feeSAlexey Bataev // CHECK: [[SZ_BASE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0 71*e46f0feeSAlexey Bataev // CHECK: store i64 1, i64* [[SZ_BASE]], 72*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1 73*e46f0feeSAlexey Bataev // CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0 74*e46f0feeSAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[ADDR]], 75*e46f0feeSAlexey Bataev // CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1 76*e46f0feeSAlexey Bataev // CHECK: store i64 8, i64* [[SZ_ADDR]], 77*e46f0feeSAlexey Bataev // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2 78*e46f0feeSAlexey Bataev // CHECK: store i8 1, i8* [[FLAGS_ADDR]], 79*e46f0feeSAlexey Bataev // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0 80*e46f0feeSAlexey Bataev // CHECK: [[DEP:%.+]] = bitcast %struct.kmp_depend_info* [[BASE_ADDR]] to i8* 81*e46f0feeSAlexey Bataev // CHECK: store i8* [[DEP]], i8** [[TMAIN_A]], 82*e46f0feeSAlexey Bataev 83*e46f0feeSAlexey Bataev #endif 84