blob: ede42c224ab49d1960f8b15f5c6a223504e9aa4d [file] [log] [blame]
Samuel Antaof8b50122015-07-13 22:54:53 +00001// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -DLAMBDA -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=LAMBDA %s
5// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -fblocks -DBLOCKS -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=BLOCKS %s
6// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=ARRAY %s
Samuel Antao9c75cfe2015-07-27 16:38:06 +00007
8// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s -check-prefix=TLS-CHECK
9// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
10// RUN: %clang_cc1 -fopenmp -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TLS-CHECK
11// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -DLAMBDA -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=TLS-LAMBDA %s
12// RUN: %clang_cc1 -verify -fopenmp -x c++ -fblocks -DBLOCKS -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=TLS-BLOCKS %s
13// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -DARRAY -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck -check-prefix=TLS-ARRAY %s
Samuel Antao2e2d6802015-07-27 16:59:45 +000014// REQUIRES: tls
Alexey Bataevf56f98c2015-04-16 05:39:01 +000015// expected-no-diagnostics
Alexey Bataev1d9c15c2015-05-19 12:31:28 +000016#ifndef ARRAY
Alexey Bataevf56f98c2015-04-16 05:39:01 +000017#ifndef HEADER
18#define HEADER
19
20volatile int g = 1212;
21#pragma omp threadprivate(g)
22
23template <class T>
24struct S {
25 T f;
26 S(T a) : f(a + g) {}
27 S() : f(g) {}
28 S &operator=(const S &) { return *this; };
29 operator T() { return T(); }
30 ~S() {}
31};
32
33// CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
34// CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
35// CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
Samuel Antao9c75cfe2015-07-27 16:38:06 +000036// TLS-CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
37// TLS-CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
38// TLS-CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
Alexey Bataevf56f98c2015-04-16 05:39:01 +000039
40// CHECK-DAG: [[T_VAR:@.+]] = internal global i{{[0-9]+}} 1122,
41// CHECK-DAG: [[VEC:@.+]] = internal global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2],
42// CHECK-DAG: [[S_ARR:@.+]] = internal global [2 x [[S_FLOAT_TY]]] zeroinitializer,
43// CHECK-DAG: [[VAR:@.+]] = internal global [[S_FLOAT_TY]] zeroinitializer,
44// CHECK-DAG: [[TMAIN_T_VAR:@.+]] = linkonce_odr global i{{[0-9]+}} 333,
45// CHECK-DAG: [[TMAIN_VEC:@.+]] = linkonce_odr global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 3, i{{[0-9]+}} 3],
46// CHECK-DAG: [[TMAIN_S_ARR:@.+]] = linkonce_odr global [2 x [[S_INT_TY]]] zeroinitializer,
47// CHECK-DAG: [[TMAIN_VAR:@.+]] = linkonce_odr global [[S_INT_TY]] zeroinitializer,
Samuel Antao9c75cfe2015-07-27 16:38:06 +000048// TLS-CHECK-DAG: [[T_VAR:@.+]] = internal thread_local global i{{[0-9]+}} 1122,
49// TLS-CHECK-DAG: [[VEC:@.+]] = internal thread_local global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2],
50// TLS-CHECK-DAG: [[S_ARR:@.+]] = internal thread_local global [2 x [[S_FLOAT_TY]]] zeroinitializer,
51// TLS-CHECK-DAG: [[VAR:@.+]] = internal thread_local global [[S_FLOAT_TY]] zeroinitializer,
52// TLS-CHECK-DAG: [[TMAIN_T_VAR:@.+]] = linkonce_odr thread_local global i{{[0-9]+}} 333,
53// TLS-CHECK-DAG: [[TMAIN_VEC:@.+]] = linkonce_odr thread_local global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 3, i{{[0-9]+}} 3],
54// TLS-CHECK-DAG: [[TMAIN_S_ARR:@.+]] = linkonce_odr thread_local global [2 x [[S_INT_TY]]] zeroinitializer,
55// TLS-CHECK-DAG: [[TMAIN_VAR:@.+]] = linkonce_odr thread_local global [[S_INT_TY]] zeroinitializer,
56
Alexey Bataevf56f98c2015-04-16 05:39:01 +000057template <typename T>
58T tmain() {
59 S<T> test;
60 test = S<T>();
61 static T t_var = 333;
62 static T vec[] = {3, 3};
63 static S<T> s_arr[] = {1, 2};
64 static S<T> var(3);
65#pragma omp threadprivate(t_var, vec, s_arr, var)
66#pragma omp parallel copyin(t_var, vec, s_arr, var)
67 {
68 vec[0] = t_var;
69 s_arr[0] = var;
70 }
71#pragma omp parallel copyin(t_var)
72 {}
73 return T();
74}
75
76int main() {
77#ifdef LAMBDA
78 // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212,
79 // LAMBDA-LABEL: @main
David Blaikieea3e51d2015-06-29 17:29:50 +000080 // LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
Samuel Antao9c75cfe2015-07-27 16:38:06 +000081 // TLS-LAMBDA: [[G_CAPTURE_TY:%.+]] = type { i{{[0-9]+}}* }
Samuel Antaod31d4c12015-07-27 17:30:41 +000082 // TLS-LAMBDA: [[G:@.+]] = {{.*}}thread_local {{.*}}global i{{[0-9]+}} 1212,
Samuel Antao9c75cfe2015-07-27 16:38:06 +000083 // TLS-LAMBDA-LABEL: @main
84 // TLS-LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
Alexey Bataevf56f98c2015-04-16 05:39:01 +000085 [&]() {
86 // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
David Blaikieea3e51d2015-06-29 17:29:50 +000087 // LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8*
Samuel Antao9c75cfe2015-07-27 16:38:06 +000088
89 // TLS-LAMBDA-DAG: [[G_CPY_ADDR:%.+]] = getelementptr inbounds [[G_CAPTURE_TY]], [[G_CAPTURE_TY]]* [[G_CAPTURE:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
90 // TLS-LAMBDA-DAG: [[G_CPY_VAL:%.+]] = call i{{[0-9]+}}* [[G_CTOR:@.+]]()
91 // TLS-LAMBDA: store i{{[0-9]+}}* [[G_CPY_VAL]], i{{[0-9]+}}** [[G_CPY_ADDR]]
92 // TLS-LAMBDA: [[G_CAPTURE_CAST:%.+]] = bitcast [[G_CAPTURE_TY]]* [[G_CAPTURE]] to i8*
93 // TLS-LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[G_CAPTURE_CAST]]
94
95 // TLS-LAMBDA: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]() {
96 // TLS-LAMBDA: ret i{{[0-9]+}}* [[G]]
97 // TLS-LAMBDA: }
98
Alexey Bataevf56f98c2015-04-16 05:39:01 +000099#pragma omp parallel copyin(g)
100 {
101 // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000102 // TLS-LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, [[G_CAPTURE_TY]]* [[ARG:%.+]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000103
104 // threadprivate_g = g;
David Blaikieea3e51d2015-06-29 17:29:50 +0000105 // LAMBDA: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000106 // LAMBDA: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
107 // LAMBDA: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
108 // LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
109 // LAMBDA: [[NOT_MASTER]]
110 // LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]],
111 // LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
112 // LAMBDA: [[DONE]]
113
Samuel Antaod31d4c12015-07-27 17:30:41 +0000114 // TLS-LAMBDA-DAG: [[G_CAPTURE_FIELD:%.+]] = getelementptr inbounds [[G_CAPTURE_TY]], [[G_CAPTURE_TY]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
115 // TLS-LAMBDA-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_CAPTURE_FIELD]]
116 // TLS-LAMBDA-DAG: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
117 // TLS-LAMBDA-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
118 // TLS-LAMBDA-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
119 // TLS-LAMBDA: icmp ne i{{[0-9]+}} [[G_CAPTURE_SRCC]], [[G_CAPTURE_DSTC]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000120 // TLS-LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
121 // TLS-LAMBDA: [[NOT_MASTER]]
122 // TLS-LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
123 // TLS-LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]],
124 // TLS-LAMBDA: [[DONE]]
125
David Blaikieea3e51d2015-06-29 17:29:50 +0000126 // LAMBDA: call {{.*}}i32 @__kmpc_cancel_barrier(
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000127 // TLS-LAMBDA: call {{.*}}i32 @__kmpc_cancel_barrier(
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000128 g = 1;
David Blaikieea3e51d2015-06-29 17:29:50 +0000129 // LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000130 // TLS-LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000131 [&]() {
132 // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
133 // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
134 g = 2;
135 // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000136
137 // TLS-LAMBDA: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
138 // TLS-LAMBDA: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000139 }();
140 }
141 }();
142 return 0;
143#elif defined(BLOCKS)
144 // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
145 // BLOCKS-LABEL: @main
David Blaikieea3e51d2015-06-29 17:29:50 +0000146 // BLOCKS: call {{.*}}void {{%.+}}(i8
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000147
148 // TLS-BLOCKS: [[G_CAPTURE_TY:%.+]] = type { i{{[0-9]+}}* }
149 // TLS-BLOCKS: [[G:@.+]] = thread_local global i{{[0-9]+}} 1212,
150 // TLS-BLOCKS-LABEL: @main
151 // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000152 ^{
153 // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
David Blaikieea3e51d2015-06-29 17:29:50 +0000154 // BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000155
156 // TLS-BLOCKS-DAG: [[G_CPY_ADDR:%.+]] = getelementptr inbounds [[G_CAPTURE_TY]], [[G_CAPTURE_TY]]* [[G_CAPTURE:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
157 // TLS-BLOCKS-DAG: [[G_CPY_VAL:%.+]] = call i{{[0-9]+}}* [[G_CTOR:@.+]]()
158 // TLS-BLOCKS: store i{{[0-9]+}}* [[G_CPY_VAL]], i{{[0-9]+}}** [[G_CPY_ADDR]]
159 // TLS-BLOCKS: [[G_CAPTURE_CAST:%.+]] = bitcast [[G_CAPTURE_TY]]* [[G_CAPTURE]] to i8*
160 // TLS-BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[G_CAPTURE_CAST]]
161
162 // TLS-BLOCKS: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]() {
163 // TLS-BLOCKS: ret i{{[0-9]+}}* [[G]]
164 // TLS-BLOCKS: }
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000165#pragma omp parallel copyin(g)
166 {
167 // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000168 // TLS-BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, [[G_CAPTURE_TY]]* [[ARG:%.+]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000169
170 // threadprivate_g = g;
David Blaikieea3e51d2015-06-29 17:29:50 +0000171 // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000172 // BLOCKS: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
173 // BLOCKS: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
174 // BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
175 // BLOCKS: [[NOT_MASTER]]
176 // BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]],
177 // BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
178 // BLOCKS: [[DONE]]
179
Samuel Antaod31d4c12015-07-27 17:30:41 +0000180 // TLS-BLOCKS-DAG: [[G_CAPTURE_FIELD:%.+]] = getelementptr inbounds [[G_CAPTURE_TY]], [[G_CAPTURE_TY]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
181 // TLS-BLOCKS-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_CAPTURE_FIELD]]
182 // TLS-BLOCKS-DAG: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
183 // TLS-BLOCKS-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
184 // TLS-BLOCKS-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
185 // TLS-BLOCKS: icmp ne i{{[0-9]+}} [[G_CAPTURE_SRCC]], [[G_CAPTURE_DSTC]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000186 // TLS-BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
187 // TLS-BLOCKS: [[NOT_MASTER]]
188 // TLS-BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
189 // TLS-BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]],
190 // TLS-BLOCKS: [[DONE]]
191
David Blaikieea3e51d2015-06-29 17:29:50 +0000192 // BLOCKS: call {{.*}}i32 @__kmpc_cancel_barrier(
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000193 // TLS-BLOCKS: call {{.*}}i32 @__kmpc_cancel_barrier(
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000194 g = 1;
195 // BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}*
196 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
David Blaikieea3e51d2015-06-29 17:29:50 +0000197 // BLOCKS: call {{.*}}void {{%.+}}(i8
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000198
199 // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
200 // TLS-BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_CAPTURE_DST]]
201 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
202 // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000203 ^{
204 // BLOCKS: define {{.+}} void {{@.+}}(i8*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000205 // TLS-BLOCKS: define {{.+}} void {{@.+}}(i8*
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000206 g = 2;
207 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
David Blaikieea3e51d2015-06-29 17:29:50 +0000208 // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000209 // BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}*
210 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
211 // BLOCKS: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000212
213 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
214 // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
215 // TLS-BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]]
216 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
217 // TLS-BLOCKS: ret
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000218 }();
219 }
220 }();
221 return 0;
222#else
223 S<float> test;
224 test = S<float>();
225 static int t_var = 1122;
226 static int vec[] = {1, 2};
227 static S<float> s_arr[] = {1, 2};
228 static S<float> var(3);
229#pragma omp threadprivate(t_var, vec, s_arr, var)
230#pragma omp parallel copyin(t_var, vec, s_arr, var)
231 {
232 vec[0] = t_var;
233 s_arr[0] = var;
234 }
235#pragma omp parallel copyin(t_var)
236 {}
237 return tmain<int>();
238#endif
239}
240
241// CHECK-LABEL: @main
242// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
243// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
David Blaikieea3e51d2015-06-29 17:29:50 +0000244// CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[MAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
245// CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[MAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000246// CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
247// CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
248// CHECK: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000249
250// TLS-CHECK-LABEL: @main
251// TLS-CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
252// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
253// TLS-CHECK-DAG: store i{{[0-9]+}}* [[T_VAR]], i{{[0-9]+}}** [[T_VAR_FIELD:%.+]],
254// TLS-CHECK-DAG: store [2 x i{{[0-9]+}}]* [[VEC]], [2 x i{{[0-9]+}}]** [[VEC_FIELD:%.+]],
255// TLS-CHECK-DAG: store [2 x [[S_FLOAT_TY]]]* [[S_ARR]], [2 x [[S_FLOAT_TY]]]** [[S_ARR_FIELD:%.+]],
256// TLS-CHECK-DAG: store [[S_FLOAT_TY]]* [[VAR]], [[S_FLOAT_TY]]** [[VAR_FIELD:%.+]],
257// TLS-CHECK-DAG: [[T_VAR_FIELD]] = getelementptr inbounds {{.*}}
258// TLS-CHECK-DAG: [[VEC_FIELD]] = getelementptr inbounds {{.*}}
259// TLS-CHECK-DAG: [[S_ARR_FIELD]] = getelementptr inbounds {{.*}}
260// TLS-CHECK-DAG: [[VAR_FIELD]] = getelementptr inbounds {{.*}}
261// TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[MAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
262// TLS-CHECK-DAG: store i{{[0-9]+}}* [[T_VAR]], i{{[0-9]+}}** [[T_VAR_FIELD:%.+]],
263// TLS-CHECK-DAG: [[T_VAR_FIELD]] = getelementptr inbounds {{.*}}
264// TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[MAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
265// TLS-CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
266// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
267// TLS-CHECK: ret
268
David Blaikieea3e51d2015-06-29 17:29:50 +0000269// CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000270// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
271// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
272// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
273
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000274// TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
275// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
276
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000277// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000278// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000279// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
280// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
281// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
282// CHECK: [[NOT_MASTER]]
283// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
284// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
285
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000286// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
287// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** [[MASTER_FIELD]]
288// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
289// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
290// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
291// TLS-CHECK: [[NOT_MASTER]]
292// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
293// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
294
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000295// threadprivate_vec = vec;
David Blaikieea3e51d2015-06-29 17:29:50 +0000296// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VEC]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000297// CHECK: call void @llvm.memcpy{{.*}}(i8* %{{.+}}, i8* bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*),
298
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000299// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
300// TLS-CHECK: [[MASTER_REF:%.+]] = load [2 x i32]*, [2 x i32]** [[MASTER_FIELD]]
301// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF]] to i8*
302// TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*), i8* [[MASTER_CAST]]
303
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000304// threadprivate_s_arr = s_arr;
David Blaikieea3e51d2015-06-29 17:29:50 +0000305// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[S_ARR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000306// CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* {{%.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
307// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
308// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
309// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
310// CHECK: [[S_ARR_BODY]]
311// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
312// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
313
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000314// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
315// TLS-CHECK: [[MASTER_REF:%.+]] = load [2 x [[S_FLOAT_TY]]]*, [2 x [[S_FLOAT_TY]]]** [[MASTER_FIELD]]
316// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_FLOAT_TY]]]* [[MASTER_REF]] to [[S_FLOAT_TY]]*
317// TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_FLOAT_TY]]* {{.*}}[[MASTER_CAST]]
318// TLS-CHECK-DAG: [[S_ARR_DST_BEGIN:%.+]] = phi [[S_FLOAT_TY]]* {{.*}}getelementptr inbounds ([2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0)
319// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
320// TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
321// TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
322// TLS-CHECK: icmp eq [[S_FLOAT_TY]]* [[S_ARR_DST_END]], getelementptr ([[S_FLOAT_TY]], [[S_FLOAT_TY]]* getelementptr inbounds ([2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0), i{{[0-9]+}} 2)
323// TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
324// TLS-CHECK: [[ARR_DONE]]
325
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000326// threadprivate_var = var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000327// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000328// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{%.+}}, [[S_FLOAT_TY]]* {{.*}}[[VAR]])
329// CHECK: [[DONE]]
330
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000331// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
332// TLS-CHECK: [[MASTER_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** [[MASTER_FIELD]]
333// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.*}}[[VAR]], [[S_FLOAT_TY]]* {{.*}}[[MASTER_REF]])
334
David Blaikieea3e51d2015-06-29 17:29:50 +0000335// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000336// CHECK: ret void
337
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000338// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
339// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
340// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
341// TLS-CHECK: ret void
342
David Blaikieea3e51d2015-06-29 17:29:50 +0000343// CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000344// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
345// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
346// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
347
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000348// TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
349// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
350
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000351// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000352// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000353// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
354// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
355// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
356// CHECK: [[NOT_MASTER]]
357// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
358// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
359// CHECK: [[DONE]]
360
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000361// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
362// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** [[MASTER_FIELD]]
363// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
364// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
365// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
366// TLS-CHECK: [[NOT_MASTER]]
367// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
368// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
369// TLS-CHECK: [[DONE]]
370
David Blaikieea3e51d2015-06-29 17:29:50 +0000371// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000372// CHECK: ret void
373
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000374// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
375// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
376// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
377// TLS-CHECK: ret void
378
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000379// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
380// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
381// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
David Blaikieea3e51d2015-06-29 17:29:50 +0000382// CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[TMAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
383// CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[TMAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000384// CHECK: call {{.*}} [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
385// CHECK: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000386
387// TLS-CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
388// TLS-CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
389// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
390// TLS-CHECK-DAG: store i{{[0-9]+}}* [[TMAIN_T_VAR]], i{{[0-9]+}}** [[T_VAR_FIELD:%.+]],
391// TLS-CHECK-DAG: store [2 x i{{[0-9]+}}]* [[TMAIN_VEC]], [2 x i{{[0-9]+}}]** [[VEC_FIELD:%.+]],
392// TLS-CHECK-DAG: store [2 x [[S_INT_TY]]]* [[TMAIN_S_ARR]], [2 x [[S_INT_TY]]]** [[S_ARR_FIELD:%.+]],
393// TLS-CHECK-DAG: store [[S_INT_TY]]* [[TMAIN_VAR]], [[S_INT_TY]]** [[VAR_FIELD:%.+]],
394// TLS-CHECK-DAG: [[T_VAR_FIELD]] = getelementptr inbounds {{.*}}
395// TLS-CHECK-DAG: [[VEC_FIELD]] = getelementptr inbounds {{.*}}
396// TLS-CHECK-DAG: [[S_ARR_FIELD]] = getelementptr inbounds {{.*}}
397// TLS-CHECK-DAG: [[VAR_FIELD]] = getelementptr inbounds {{.*}}
398// TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[TMAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
399// TLS-CHECK-DAG: store i{{[0-9]+}}* [[TMAIN_T_VAR]], i{{[0-9]+}}** [[T_VAR_FIELD:%.+]],
400// TLS-CHECK-DAG: [[T_VAR_FIELD]] = getelementptr inbounds {{.*}}
401// TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, {{%.+}}*)* [[TMAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*), i8* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000402//
David Blaikieea3e51d2015-06-29 17:29:50 +0000403// CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000404// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
405// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
406// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000407//
408// TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
409// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000410
411// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000412// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000413// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
414// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
415// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
416// CHECK: [[NOT_MASTER]]
417// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]],
418// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
419
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000420// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
421// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** [[MASTER_FIELD]]
422// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
423// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
424// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
425// TLS-CHECK: [[NOT_MASTER]]
426// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
427// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]]
428
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000429// threadprivate_vec = vec;
David Blaikieea3e51d2015-06-29 17:29:50 +0000430// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VEC]]
431// CHECK: call {{.*}}void @llvm.memcpy{{.*}}(i8* %{{.+}}, i8* bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*),
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000432
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000433// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
434// TLS-CHECK: [[MASTER_REF:%.+]] = load [2 x i32]*, [2 x i32]** [[MASTER_FIELD]]
435// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF]] to i8*
436// TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*), i8* [[MASTER_CAST]]
437
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000438// threadprivate_s_arr = s_arr;
David Blaikieea3e51d2015-06-29 17:29:50 +0000439// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_S_ARR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000440// CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* {{%.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
441// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
442// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
443// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
444// CHECK: [[S_ARR_BODY]]
445// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
446// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
447
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000448// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
449// TLS-CHECK: [[MASTER_REF:%.+]] = load [2 x [[S_INT_TY]]]*, [2 x [[S_INT_TY]]]** [[MASTER_FIELD]]
450// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_INT_TY]]]* [[MASTER_REF]] to [[S_INT_TY]]*
451// TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_INT_TY]]* {{.*}}[[MASTER_CAST]]
452// TLS-CHECK-DAG: [[S_ARR_DST_BEGIN:%.+]] = phi [[S_INT_TY]]* {{.*}}getelementptr inbounds ([2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[TMAIN_S_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0)
453// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
454// TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
455// TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
456// TLS-CHECK: icmp eq [[S_INT_TY]]* [[S_ARR_DST_END]], getelementptr ([[S_INT_TY]], [[S_INT_TY]]* getelementptr inbounds ([2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[TMAIN_S_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0), i{{[0-9]+}} 2)
457// TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
458// TLS-CHECK: [[ARR_DONE]]
459
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000460// threadprivate_var = var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000461// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000462// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{%.+}}, [[S_INT_TY]]* {{.*}}[[TMAIN_VAR]])
463// CHECK: [[DONE]]
464
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000465// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
466// TLS-CHECK: [[MASTER_REF:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** [[MASTER_FIELD]]
467// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.*}}[[TMAIN_VAR]], [[S_INT_TY]]* {{.*}}[[MASTER_REF]])
468
David Blaikieea3e51d2015-06-29 17:29:50 +0000469// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000470// CHECK: ret void
471
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000472// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
473// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
474// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
475// TLS-CHECK: ret void
476
David Blaikieea3e51d2015-06-29 17:29:50 +0000477// CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000478// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
479// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
480// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
481
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000482// TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, {{%.+}}* %{{.+}})
483// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
484
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000485// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000486// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000487// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
488// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
489// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
490// CHECK: [[NOT_MASTER]]
491// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]],
492// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
493// CHECK: [[DONE]]
494
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000495// TLS-CHECK: [[MASTER_FIELD:%.+]] = getelementptr inbounds {{.+}}
496// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** [[MASTER_FIELD]]
497// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
498// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
499// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
500// TLS-CHECK: [[NOT_MASTER]]
501// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
502// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]]
503// TLS-CHECK: [[DONE]]
504
David Blaikieea3e51d2015-06-29 17:29:50 +0000505// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000506// CHECK: ret void
507
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000508// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
509// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
510// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
511// TLS-CHECK: ret void
512
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000513#endif
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000514#else
515// ARRAY-LABEL: array_func
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000516// TLS-ARRAY: [[ARR_CAPTURETY:%.+]] = type { [2 x {{.*}}]*, [2 x {{.*}}]* }
517// TLS-ARRAY-LABEL: array_func
518
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000519struct St {
520 int a, b;
521 St() : a(0), b(0) {}
522 St &operator=(const St &) { return *this; };
523 ~St() {}
524};
525
526void array_func() {
527 static int a[2];
528 static St s[2];
529// ARRAY: @__kmpc_fork_call(
530// ARRAY: call i8* @__kmpc_threadprivate_cached(
531// ARRAY: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.+}}, i8* bitcast ([2 x i32]* @{{.+}} to i8*), i64 8, i32 4, i1 false)
532// ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000533
534// TLS-ARRAY-DAG: [[ARR_CAP1:%.+]] = getelementptr inbounds [[ARR_CAPTURETY]], [[ARR_CAPTURETY]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
535// TLS-ARRAY-DAG: [[ARR_CAP2:%.+]] = getelementptr inbounds [[ARR_CAPTURETY]], [[ARR_CAPTURETY]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 1
536// TLS-ARRAY-DAG: store [2 x {{.*}}]* @{{.*}}, [2 x {{.*}}]** [[ARR_CAP1]]
537// TLS-ARRAY-DAG: store [2 x {{.*}}]* @{{.*}}, [2 x {{.*}}]** [[ARR_CAP2]]
538// TLS-ARRAY: @__kmpc_fork_call(
539// TLS-ARRAY-DAG: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast ([2 x i32]* @{{.+}} to i8*), i8* [[REF:%.+]], i64 8, i32 4, i1 false)
540// TLS-ARRAY-DAG: [[REF]] = bitcast [2 x i32]* [[REFT:%.+]] to i8*
541// TLS-ARRAY-DAG: [[REFT]] = load [2 x i32]*, [2 x i32]** [[FIELDADDR:%.+]],
542// TLS-ARRAY-DAG: [[FIELDADDR]] = getelementptr inbounds [[ARR_CAPTURETY]], [[ARR_CAPTURETY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}}
543// TLS-ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
544
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000545#pragma omp threadprivate(a, s)
546#pragma omp parallel copyin(a, s)
547 ;
548}
549#endif
550
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000551