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