1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3*67e74705SXin Li // 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*67e74705SXin Li // 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*67e74705SXin Li // 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*67e74705SXin Li // 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
7*67e74705SXin Li
8*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s -check-prefix=TLS-CHECK
9*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
10*67e74705SXin Li // 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*67e74705SXin Li // 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*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -fblocks -DBLOCKS -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=TLS-BLOCKS %s
13*67e74705SXin Li // 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
14*67e74705SXin Li // expected-no-diagnostics
15*67e74705SXin Li #ifndef ARRAY
16*67e74705SXin Li #ifndef HEADER
17*67e74705SXin Li #define HEADER
18*67e74705SXin Li
19*67e74705SXin Li volatile int g __attribute__((aligned(128))) = 1212;
20*67e74705SXin Li #pragma omp threadprivate(g)
21*67e74705SXin Li
22*67e74705SXin Li template <class T>
23*67e74705SXin Li struct S {
24*67e74705SXin Li T f;
SS25*67e74705SXin Li S(T a) : f(a + g) {}
SS26*67e74705SXin Li S() : f(g) {}
operator =S27*67e74705SXin Li S &operator=(const S &) { return *this; };
operator TS28*67e74705SXin Li operator T() { return T(); }
~SS29*67e74705SXin Li ~S() {}
30*67e74705SXin Li };
31*67e74705SXin Li
32*67e74705SXin Li // CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
33*67e74705SXin Li // CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
34*67e74705SXin Li // CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
35*67e74705SXin Li // TLS-CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
36*67e74705SXin Li // TLS-CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
37*67e74705SXin Li // TLS-CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
38*67e74705SXin Li
39*67e74705SXin Li // CHECK-DAG: [[T_VAR:@.+]] = internal global i{{[0-9]+}} 1122,
40*67e74705SXin Li // CHECK-DAG: [[VEC:@.+]] = internal global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2],
41*67e74705SXin Li // CHECK-DAG: [[S_ARR:@.+]] = internal global [2 x [[S_FLOAT_TY]]] zeroinitializer,
42*67e74705SXin Li // CHECK-DAG: [[VAR:@.+]] = internal global [[S_FLOAT_TY]] zeroinitializer,
43*67e74705SXin Li // CHECK-DAG: [[TMAIN_T_VAR:@.+]] = linkonce_odr global i{{[0-9]+}} 333,
44*67e74705SXin Li // CHECK-DAG: [[TMAIN_VEC:@.+]] = linkonce_odr global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 3, i{{[0-9]+}} 3],
45*67e74705SXin Li // CHECK-DAG: [[TMAIN_S_ARR:@.+]] = linkonce_odr global [2 x [[S_INT_TY]]] zeroinitializer,
46*67e74705SXin Li // CHECK-DAG: [[TMAIN_VAR:@.+]] = linkonce_odr global [[S_INT_TY]] zeroinitializer,
47*67e74705SXin Li // TLS-CHECK-DAG: [[T_VAR:@.+]] = internal thread_local global i{{[0-9]+}} 1122,
48*67e74705SXin Li // TLS-CHECK-DAG: [[VEC:@.+]] = internal thread_local global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2],
49*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR:@.+]] = internal thread_local global [2 x [[S_FLOAT_TY]]] zeroinitializer,
50*67e74705SXin Li // TLS-CHECK-DAG: [[VAR:@.+]] = internal thread_local global [[S_FLOAT_TY]] zeroinitializer,
51*67e74705SXin Li // TLS-CHECK-DAG: [[TMAIN_T_VAR:@.+]] = linkonce_odr thread_local global i{{[0-9]+}} 333,
52*67e74705SXin Li // TLS-CHECK-DAG: [[TMAIN_VEC:@.+]] = linkonce_odr thread_local global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 3, i{{[0-9]+}} 3],
53*67e74705SXin Li // TLS-CHECK-DAG: [[TMAIN_S_ARR:@.+]] = linkonce_odr thread_local global [2 x [[S_INT_TY]]] zeroinitializer,
54*67e74705SXin Li // TLS-CHECK-DAG: [[TMAIN_VAR:@.+]] = linkonce_odr thread_local global [[S_INT_TY]] zeroinitializer,
55*67e74705SXin Li
56*67e74705SXin Li template <typename T>
tmain()57*67e74705SXin Li T tmain() {
58*67e74705SXin Li S<T> test;
59*67e74705SXin Li test = S<T>();
60*67e74705SXin Li static T t_var __attribute__((aligned(128))) = 333;
61*67e74705SXin Li static T vec[] __attribute__((aligned(128))) = {3, 3};
62*67e74705SXin Li static S<T> s_arr[] __attribute__((aligned(128))) = {1, 2};
63*67e74705SXin Li static S<T> var __attribute__((aligned(128))) (3);
64*67e74705SXin Li #pragma omp threadprivate(t_var, vec, s_arr, var)
65*67e74705SXin Li #pragma omp parallel copyin(t_var, vec, s_arr, var)
66*67e74705SXin Li {
67*67e74705SXin Li vec[0] = t_var;
68*67e74705SXin Li s_arr[0] = var;
69*67e74705SXin Li }
70*67e74705SXin Li #pragma omp parallel copyin(t_var)
71*67e74705SXin Li {}
72*67e74705SXin Li return T();
73*67e74705SXin Li }
74*67e74705SXin Li
main()75*67e74705SXin Li int main() {
76*67e74705SXin Li #ifdef LAMBDA
77*67e74705SXin Li // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212,
78*67e74705SXin Li // LAMBDA-LABEL: @main
79*67e74705SXin Li // LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
80*67e74705SXin Li // TLS-LAMBDA: [[G:@.+]] = {{.*}}thread_local {{.*}}global i{{[0-9]+}} 1212,
81*67e74705SXin Li // TLS-LAMBDA-LABEL: @main
82*67e74705SXin Li // TLS-LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
83*67e74705SXin Li [&]() {
84*67e74705SXin Li // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
85*67e74705SXin Li // LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
86*67e74705SXin Li
87*67e74705SXin Li // TLS-LAMBDA: [[G_CPY_VAL:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR:@.+]]()
88*67e74705SXin Li // TLS-LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G_CPY_VAL]])
89*67e74705SXin Li
90*67e74705SXin Li #pragma omp parallel copyin(g)
91*67e74705SXin Li {
92*67e74705SXin Li // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
93*67e74705SXin Li // TLS-LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
94*67e74705SXin Li
95*67e74705SXin Li // threadprivate_g = g;
96*67e74705SXin Li // LAMBDA: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
97*67e74705SXin Li // LAMBDA: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
98*67e74705SXin Li // LAMBDA: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
99*67e74705SXin Li // LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
100*67e74705SXin Li // LAMBDA: [[NOT_MASTER]]
101*67e74705SXin Li // LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]], align 128
102*67e74705SXin Li // LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
103*67e74705SXin Li // LAMBDA: [[DONE]]
104*67e74705SXin Li
105*67e74705SXin Li // TLS-LAMBDA-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
106*67e74705SXin Li // TLS-LAMBDA-DAG: [[G_CAPTURE_DST:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR]]()
107*67e74705SXin Li // TLS-LAMBDA-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
108*67e74705SXin Li // TLS-LAMBDA-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
109*67e74705SXin Li // TLS-LAMBDA: icmp ne i{{[0-9]+}} {{%.+}}, {{%.+}}
110*67e74705SXin Li // TLS-LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
111*67e74705SXin Li // TLS-LAMBDA: [[NOT_MASTER]]
112*67e74705SXin Li // TLS-LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
113*67e74705SXin Li // TLS-LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
114*67e74705SXin Li // TLS-LAMBDA: [[DONE]]
115*67e74705SXin Li
116*67e74705SXin Li // LAMBDA: call {{.*}}void @__kmpc_barrier(
117*67e74705SXin Li // TLS-LAMBDA: call {{.*}}void @__kmpc_barrier(
118*67e74705SXin Li g = 1;
119*67e74705SXin Li // LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
120*67e74705SXin Li // TLS-LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
121*67e74705SXin Li
122*67e74705SXin Li // TLS-LAMBDA: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]()
123*67e74705SXin Li // TLS-LAMBDA: ret i{{[0-9]+}}* [[G]]
124*67e74705SXin Li // TLS-LAMBDA: }
125*67e74705SXin Li
126*67e74705SXin Li [&]() {
127*67e74705SXin Li // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
128*67e74705SXin Li // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
129*67e74705SXin Li g = 2;
130*67e74705SXin Li // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
131*67e74705SXin Li
132*67e74705SXin Li // TLS-LAMBDA: [[G_CAPTURE_DST:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR]]()
133*67e74705SXin Li // TLS-LAMBDA: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
134*67e74705SXin Li }();
135*67e74705SXin Li }
136*67e74705SXin Li }();
137*67e74705SXin Li return 0;
138*67e74705SXin Li #elif defined(BLOCKS)
139*67e74705SXin Li // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
140*67e74705SXin Li // BLOCKS-LABEL: @main
141*67e74705SXin Li // BLOCKS: call {{.*}}void {{%.+}}(i8
142*67e74705SXin Li
143*67e74705SXin Li // TLS-BLOCKS: [[G:@.+]] = {{.*}}thread_local {{.*}}global i{{[0-9]+}} 1212,
144*67e74705SXin Li // TLS-BLOCKS-LABEL: @main
145*67e74705SXin Li // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
146*67e74705SXin Li ^{
147*67e74705SXin Li // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
148*67e74705SXin Li // BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
149*67e74705SXin Li
150*67e74705SXin Li // TLS-BLOCKS: [[G_CPY_VAL:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR:@.+]]()
151*67e74705SXin Li // TLS-BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G_CPY_VAL]])
152*67e74705SXin Li
153*67e74705SXin Li #pragma omp parallel copyin(g)
154*67e74705SXin Li {
155*67e74705SXin Li // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
156*67e74705SXin Li // TLS-BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
157*67e74705SXin Li
158*67e74705SXin Li // threadprivate_g = g;
159*67e74705SXin Li // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
160*67e74705SXin Li // BLOCKS: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
161*67e74705SXin Li // BLOCKS: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
162*67e74705SXin Li // BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
163*67e74705SXin Li // BLOCKS: [[NOT_MASTER]]
164*67e74705SXin Li // BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]], align 128
165*67e74705SXin Li // BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
166*67e74705SXin Li // BLOCKS: [[DONE]]
167*67e74705SXin Li
168*67e74705SXin Li // TLS-BLOCKS-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
169*67e74705SXin Li // TLS-BLOCKS-DAG: [[G_CAPTURE_DST:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR]]()
170*67e74705SXin Li // TLS-BLOCKS-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
171*67e74705SXin Li // TLS-BLOCKS-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
172*67e74705SXin Li // TLS-BLOCKS: icmp ne i{{[0-9]+}} {{%.+}}, {{%.+}}
173*67e74705SXin Li // TLS-BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
174*67e74705SXin Li // TLS-BLOCKS: [[NOT_MASTER]]
175*67e74705SXin Li // TLS-BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
176*67e74705SXin Li // TLS-BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
177*67e74705SXin Li // TLS-BLOCKS: [[DONE]]
178*67e74705SXin Li
179*67e74705SXin Li // BLOCKS: call {{.*}}void @__kmpc_barrier(
180*67e74705SXin Li // TLS-BLOCKS: call {{.*}}void @__kmpc_barrier(
181*67e74705SXin Li g = 1;
182*67e74705SXin Li // BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}*
183*67e74705SXin Li // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
184*67e74705SXin Li // BLOCKS: call {{.*}}void {{%.+}}(i8
185*67e74705SXin Li
186*67e74705SXin Li // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR]]()
187*67e74705SXin Li // TLS-BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_CAPTURE_DST]]
188*67e74705SXin Li // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
189*67e74705SXin Li // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
190*67e74705SXin Li
191*67e74705SXin Li // TLS-BLOCKS: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]()
192*67e74705SXin Li // TLS-BLOCKS: ret i{{[0-9]+}}* [[G]]
193*67e74705SXin Li // TLS-BLOCKS: }
194*67e74705SXin Li ^{
195*67e74705SXin Li // BLOCKS: define {{.+}} void {{@.+}}(i8*
196*67e74705SXin Li // TLS-BLOCKS: define {{.+}} void {{@.+}}(i8*
197*67e74705SXin Li g = 2;
198*67e74705SXin Li // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
199*67e74705SXin Li // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
200*67e74705SXin Li // BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}*
201*67e74705SXin Li // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
202*67e74705SXin Li // BLOCKS: ret
203*67e74705SXin Li
204*67e74705SXin Li // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
205*67e74705SXin Li // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call{{( cxx_fast_tlscc)?}} i{{[0-9]+}}* [[G_CTOR]]()
206*67e74705SXin Li // TLS-BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]]
207*67e74705SXin Li // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
208*67e74705SXin Li // TLS-BLOCKS: ret
209*67e74705SXin Li }();
210*67e74705SXin Li }
211*67e74705SXin Li }();
212*67e74705SXin Li return 0;
213*67e74705SXin Li #else
214*67e74705SXin Li S<float> test;
215*67e74705SXin Li test = S<float>();
216*67e74705SXin Li static int t_var = 1122;
217*67e74705SXin Li static int vec[] = {1, 2};
218*67e74705SXin Li static S<float> s_arr[] = {1, 2};
219*67e74705SXin Li static S<float> var(3);
220*67e74705SXin Li #pragma omp threadprivate(t_var, vec, s_arr, var)
221*67e74705SXin Li #pragma omp parallel copyin(t_var, vec, s_arr, var)
222*67e74705SXin Li {
223*67e74705SXin Li vec[0] = t_var;
224*67e74705SXin Li s_arr[0] = var;
225*67e74705SXin Li }
226*67e74705SXin Li #pragma omp parallel copyin(t_var)
227*67e74705SXin Li {}
228*67e74705SXin Li return tmain<int>();
229*67e74705SXin Li #endif
230*67e74705SXin Li }
231*67e74705SXin Li
232*67e74705SXin Li // CHECK-LABEL: @main
233*67e74705SXin Li // CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
234*67e74705SXin Li // CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
235*67e74705SXin Li // CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 0, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*)* [[MAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*))
236*67e74705SXin Li // CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 0, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*)* [[MAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*))
237*67e74705SXin Li // CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
238*67e74705SXin Li // CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
239*67e74705SXin Li // CHECK: ret
240*67e74705SXin Li
241*67e74705SXin Li // TLS-CHECK-LABEL: @main
242*67e74705SXin Li // TLS-CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
243*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
244*67e74705SXin Li // TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 4, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, i32*, [2 x i32]*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]*)* [[MAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*),
245*67e74705SXin Li // 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]+}}*, i32*)* [[MAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*),
246*67e74705SXin Li // TLS-CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
247*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
248*67e74705SXin Li // TLS-CHECK: ret
249*67e74705SXin Li
250*67e74705SXin Li // CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
251*67e74705SXin Li // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
252*67e74705SXin Li // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
253*67e74705SXin Li // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
254*67e74705SXin Li
255*67e74705SXin Li // TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
256*67e74705SXin Li // TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
257*67e74705SXin Li
258*67e74705SXin Li // threadprivate_t_var = t_var;
259*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
260*67e74705SXin Li // CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
261*67e74705SXin Li // CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
262*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
263*67e74705SXin Li // CHECK: [[NOT_MASTER]]
264*67e74705SXin Li // CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
265*67e74705SXin Li // CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
266*67e74705SXin Li
267*67e74705SXin Li // TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
268*67e74705SXin Li // TLS-CHECK: [[MASTER_REF2:%.+]] = load [2 x i32]*, [2 x i32]** %
269*67e74705SXin Li // TLS-CHECK: [[MASTER_REF3:%.+]] = load [2 x [[S_FLOAT_TY]]]*, [2 x [[S_FLOAT_TY]]]** %
270*67e74705SXin Li // TLS-CHECK: [[MASTER_REF4:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
271*67e74705SXin Li
272*67e74705SXin Li // TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
273*67e74705SXin Li // TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
274*67e74705SXin Li // TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
275*67e74705SXin Li // TLS-CHECK: [[NOT_MASTER]]
276*67e74705SXin Li // TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
277*67e74705SXin Li // TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
278*67e74705SXin Li
279*67e74705SXin Li // threadprivate_vec = vec;
280*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VEC]]
281*67e74705SXin Li // CHECK: call void @llvm.memcpy{{.*}}(i8* %{{.+}}, i8* bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*),
282*67e74705SXin Li
283*67e74705SXin Li // TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF2]] to i8*
284*67e74705SXin Li // TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*), i8* [[MASTER_CAST]]
285*67e74705SXin Li
286*67e74705SXin Li // threadprivate_s_arr = s_arr;
287*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[S_ARR]]
288*67e74705SXin Li // 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
289*67e74705SXin Li // CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
290*67e74705SXin Li // CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
291*67e74705SXin Li // CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
292*67e74705SXin Li // CHECK: [[S_ARR_BODY]]
293*67e74705SXin Li // CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
294*67e74705SXin Li // CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
295*67e74705SXin Li
296*67e74705SXin Li // TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_FLOAT_TY]]]* [[MASTER_REF3]] to [[S_FLOAT_TY]]*
297*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_FLOAT_TY]]* {{.*}}[[MASTER_CAST]]
298*67e74705SXin Li // 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)
299*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
300*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
301*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
302*67e74705SXin Li // 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)
303*67e74705SXin Li // TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
304*67e74705SXin Li // TLS-CHECK: [[ARR_DONE]]
305*67e74705SXin Li
306*67e74705SXin Li // threadprivate_var = var;
307*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VAR]]
308*67e74705SXin Li // CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{%.+}}, [[S_FLOAT_TY]]* {{.*}}[[VAR]])
309*67e74705SXin Li // CHECK: [[DONE]]
310*67e74705SXin Li
311*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.*}}[[VAR]], [[S_FLOAT_TY]]* {{.*}}[[MASTER_REF4]])
312*67e74705SXin Li
313*67e74705SXin Li // CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
314*67e74705SXin Li // CHECK: ret void
315*67e74705SXin Li
316*67e74705SXin Li // TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
317*67e74705SXin Li // TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
318*67e74705SXin Li // TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
319*67e74705SXin Li // TLS-CHECK: ret void
320*67e74705SXin Li
321*67e74705SXin Li // CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
322*67e74705SXin Li // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
323*67e74705SXin Li // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
324*67e74705SXin Li // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
325*67e74705SXin Li
326*67e74705SXin Li // TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
327*67e74705SXin Li // TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
328*67e74705SXin Li
329*67e74705SXin Li // threadprivate_t_var = t_var;
330*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
331*67e74705SXin Li // CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
332*67e74705SXin Li // CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
333*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
334*67e74705SXin Li // CHECK: [[NOT_MASTER]]
335*67e74705SXin Li // CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
336*67e74705SXin Li // CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
337*67e74705SXin Li // CHECK: [[DONE]]
338*67e74705SXin Li
339*67e74705SXin Li // TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
340*67e74705SXin Li
341*67e74705SXin Li // TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
342*67e74705SXin Li // TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
343*67e74705SXin Li // TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
344*67e74705SXin Li // TLS-CHECK: [[NOT_MASTER]]
345*67e74705SXin Li // TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
346*67e74705SXin Li // TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
347*67e74705SXin Li // TLS-CHECK: [[DONE]]
348*67e74705SXin Li
349*67e74705SXin Li // CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
350*67e74705SXin Li // CHECK: ret void
351*67e74705SXin Li
352*67e74705SXin Li // TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
353*67e74705SXin Li // TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
354*67e74705SXin Li // TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
355*67e74705SXin Li // TLS-CHECK: ret void
356*67e74705SXin Li
357*67e74705SXin Li // CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
358*67e74705SXin Li // CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
359*67e74705SXin Li // CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
360*67e74705SXin Li // CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 0, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*)* [[TMAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*))
361*67e74705SXin Li // CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 0, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*)* [[TMAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*))
362*67e74705SXin Li // CHECK: call {{.*}} [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
363*67e74705SXin Li // CHECK: ret
364*67e74705SXin Li
365*67e74705SXin Li // TLS-CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
366*67e74705SXin Li // TLS-CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
367*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
368*67e74705SXin Li // TLS-CHECK: call {{.*}}void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 4, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, i32*, [2 x i32]*, [2 x [[S_INT_TY]]]*, [[S_INT_TY]]*)* [[TMAIN_MICROTASK:@.+]] to void (i32*, i32*, ...)*),
369*67e74705SXin Li // 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]+}}*, i32*)* [[TMAIN_MICROTASK1:@.+]] to void (i32*, i32*, ...)*),
370*67e74705SXin Li //
371*67e74705SXin Li // CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
372*67e74705SXin Li // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
373*67e74705SXin Li // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
374*67e74705SXin Li // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
375*67e74705SXin Li //
376*67e74705SXin Li // TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
377*67e74705SXin Li // TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
378*67e74705SXin Li
379*67e74705SXin Li // threadprivate_t_var = t_var;
380*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
381*67e74705SXin Li // CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
382*67e74705SXin Li // CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
383*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
384*67e74705SXin Li // CHECK: [[NOT_MASTER]]
385*67e74705SXin Li // CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]], align 128
386*67e74705SXin Li // CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
387*67e74705SXin Li
388*67e74705SXin Li // TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
389*67e74705SXin Li // TLS-CHECK: [[MASTER_REF1:%.+]] = load [2 x i32]*, [2 x i32]** %
390*67e74705SXin Li // TLS-CHECK: [[MASTER_REF2:%.+]] = load [2 x [[S_INT_TY]]]*, [2 x [[S_INT_TY]]]** %
391*67e74705SXin Li // TLS-CHECK: [[MASTER_REF3:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** %
392*67e74705SXin Li
393*67e74705SXin Li // TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
394*67e74705SXin Li // TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
395*67e74705SXin Li // TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
396*67e74705SXin Li // TLS-CHECK: [[NOT_MASTER]]
397*67e74705SXin Li // TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]],
398*67e74705SXin Li // TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]], align 128
399*67e74705SXin Li
400*67e74705SXin Li // threadprivate_vec = vec;
401*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VEC]]
402*67e74705SXin Li // CHECK: call {{.*}}void @llvm.memcpy{{.*}}(i8* %{{.+}}, i8* bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*),
403*67e74705SXin Li
404*67e74705SXin Li // TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF1]] to i8*
405*67e74705SXin Li // TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*), i8* [[MASTER_CAST]]
406*67e74705SXin Li
407*67e74705SXin Li // threadprivate_s_arr = s_arr;
408*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_S_ARR]]
409*67e74705SXin Li // 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
410*67e74705SXin Li // CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
411*67e74705SXin Li // CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
412*67e74705SXin Li // CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
413*67e74705SXin Li // CHECK: [[S_ARR_BODY]]
414*67e74705SXin Li // CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
415*67e74705SXin Li // CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
416*67e74705SXin Li
417*67e74705SXin Li // TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_INT_TY]]]* [[MASTER_REF2]] to [[S_INT_TY]]*
418*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_INT_TY]]* {{.*}}[[MASTER_CAST]]
419*67e74705SXin Li // 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)
420*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
421*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
422*67e74705SXin Li // TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
423*67e74705SXin Li // 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)
424*67e74705SXin Li // TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
425*67e74705SXin Li // TLS-CHECK: [[ARR_DONE]]
426*67e74705SXin Li
427*67e74705SXin Li // threadprivate_var = var;
428*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VAR]]
429*67e74705SXin Li // CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{%.+}}, [[S_INT_TY]]* {{.*}}[[TMAIN_VAR]])
430*67e74705SXin Li // CHECK: [[DONE]]
431*67e74705SXin Li
432*67e74705SXin Li // TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.*}}[[TMAIN_VAR]], [[S_INT_TY]]* {{.*}}[[MASTER_REF3]])
433*67e74705SXin Li
434*67e74705SXin Li // CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
435*67e74705SXin Li // CHECK: ret void
436*67e74705SXin Li
437*67e74705SXin Li // TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
438*67e74705SXin Li // TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
439*67e74705SXin Li // TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
440*67e74705SXin Li // TLS-CHECK: ret void
441*67e74705SXin Li
442*67e74705SXin Li // CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
443*67e74705SXin Li // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
444*67e74705SXin Li // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
445*67e74705SXin Li // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
446*67e74705SXin Li
447*67e74705SXin Li // TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
448*67e74705SXin Li // TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
449*67e74705SXin Li
450*67e74705SXin Li // threadprivate_t_var = t_var;
451*67e74705SXin Li // CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
452*67e74705SXin Li // CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
453*67e74705SXin Li // CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
454*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
455*67e74705SXin Li // CHECK: [[NOT_MASTER]]
456*67e74705SXin Li // CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]],
457*67e74705SXin Li // CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
458*67e74705SXin Li // CHECK: [[DONE]]
459*67e74705SXin Li
460*67e74705SXin Li // TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
461*67e74705SXin Li
462*67e74705SXin Li // TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
463*67e74705SXin Li // TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
464*67e74705SXin Li // TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
465*67e74705SXin Li // TLS-CHECK: [[NOT_MASTER]]
466*67e74705SXin Li // TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
467*67e74705SXin Li // TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]]
468*67e74705SXin Li // TLS-CHECK: [[DONE]]
469*67e74705SXin Li
470*67e74705SXin Li // CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
471*67e74705SXin Li // CHECK: ret void
472*67e74705SXin Li
473*67e74705SXin Li // TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
474*67e74705SXin Li // TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
475*67e74705SXin Li // TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
476*67e74705SXin Li // TLS-CHECK: ret void
477*67e74705SXin Li
478*67e74705SXin Li #endif
479*67e74705SXin Li #else
480*67e74705SXin Li // ARRAY-LABEL: array_func
481*67e74705SXin Li // TLS-ARRAY-LABEL: array_func
482*67e74705SXin Li
483*67e74705SXin Li struct St {
484*67e74705SXin Li int a, b;
StSt485*67e74705SXin Li St() : a(0), b(0) {}
operator =St486*67e74705SXin Li St &operator=(const St &) { return *this; };
~StSt487*67e74705SXin Li ~St() {}
488*67e74705SXin Li };
489*67e74705SXin Li
array_func()490*67e74705SXin Li void array_func() {
491*67e74705SXin Li static int a[2];
492*67e74705SXin Li static St s[2];
493*67e74705SXin Li // ARRAY: @__kmpc_fork_call(
494*67e74705SXin Li // ARRAY: call i8* @__kmpc_threadprivate_cached(
495*67e74705SXin Li // ARRAY: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.+}}, i8* bitcast ([2 x i32]* @{{.+}} to i8*), i64 8, i32 4, i1 false)
496*67e74705SXin Li // ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
497*67e74705SXin Li
498*67e74705SXin Li // TLS-ARRAY: @__kmpc_fork_call(
499*67e74705SXin Li // TLS-ARRAY: [[REFT:%.+]] = load [2 x i32]*, [2 x i32]** [[ADDR:%.+]],
500*67e74705SXin Li // TLS-ARRAY: [[REF:%.+]] = bitcast [2 x i32]* [[REFT]] to i8*
501*67e74705SXin Li // TLS-ARRAY: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast ([2 x i32]* @{{.+}} to i8*), i8* [[REF]], i64 8, i32 4, i1 false)
502*67e74705SXin Li // TLS-ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
503*67e74705SXin Li
504*67e74705SXin Li #pragma omp threadprivate(a, s)
505*67e74705SXin Li #pragma omp parallel copyin(a, s)
506*67e74705SXin Li ;
507*67e74705SXin Li }
508*67e74705SXin Li #endif
509*67e74705SXin Li
510*67e74705SXin Li
511