blob: 3a99a67954632194cbded9ad88ab82b61c76b1e6 [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
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000020volatile int g __attribute__((aligned(128))) = 1212;
Alexey Bataevf56f98c2015-04-16 05:39:01 +000021#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>();
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000061 static T t_var __attribute__((aligned(128))) = 333;
62 static T vec[] __attribute__((aligned(128))) = {3, 3};
63 static S<T> s_arr[] __attribute__((aligned(128))) = {1, 2};
64 static S<T> var __attribute__((aligned(128))) (3);
Alexey Bataevf56f98c2015-04-16 05:39:01 +000065#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 Antaod31d4c12015-07-27 17:30:41 +000081 // TLS-LAMBDA: [[G:@.+]] = {{.*}}thread_local {{.*}}global i{{[0-9]+}} 1212,
Samuel Antao9c75cfe2015-07-27 16:38:06 +000082 // TLS-LAMBDA-LABEL: @main
83 // TLS-LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
Alexey Bataevf56f98c2015-04-16 05:39:01 +000084 [&]() {
85 // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
Alexey Bataev2377fe92015-09-10 08:12:02 +000086 // LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +000087
Alexey Bataev2377fe92015-09-10 08:12:02 +000088 // TLS-LAMBDA: [[G_CPY_VAL:%.+]] = call i{{[0-9]+}}* [[G_CTOR:@.+]]()
89 // TLS-LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G_CPY_VAL]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +000090
91 // TLS-LAMBDA: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]() {
92 // TLS-LAMBDA: ret i{{[0-9]+}}* [[G]]
93 // TLS-LAMBDA: }
94
Alexey Bataevf56f98c2015-04-16 05:39:01 +000095#pragma omp parallel copyin(g)
96 {
Alexey Bataev2377fe92015-09-10 08:12:02 +000097 // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
98 // TLS-LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +000099
100 // threadprivate_g = g;
David Blaikieea3e51d2015-06-29 17:29:50 +0000101 // LAMBDA: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000102 // LAMBDA: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
103 // LAMBDA: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
104 // LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
105 // LAMBDA: [[NOT_MASTER]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000106 // LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]], align 128
107 // LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000108 // LAMBDA: [[DONE]]
109
Alexey Bataev2377fe92015-09-10 08:12:02 +0000110 // TLS-LAMBDA-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
Samuel Antaod31d4c12015-07-27 17:30:41 +0000111 // TLS-LAMBDA-DAG: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
112 // TLS-LAMBDA-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
113 // TLS-LAMBDA-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
Samuel Antaobc47f8f2015-07-27 17:49:18 +0000114 // TLS-LAMBDA: icmp ne i{{[0-9]+}} {{%.+}}, {{%.+}}
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000115 // TLS-LAMBDA: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
116 // TLS-LAMBDA: [[NOT_MASTER]]
117 // TLS-LAMBDA: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000118 // TLS-LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000119 // TLS-LAMBDA: [[DONE]]
120
Alexey Bataev25e5b442015-09-15 12:52:43 +0000121 // LAMBDA: call {{.*}}void @__kmpc_barrier(
122 // TLS-LAMBDA: call {{.*}}void @__kmpc_barrier(
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000123 g = 1;
David Blaikieea3e51d2015-06-29 17:29:50 +0000124 // LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000125 // TLS-LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000126 [&]() {
127 // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
128 // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
129 g = 2;
130 // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000131
132 // TLS-LAMBDA: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000133 // TLS-LAMBDA: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000134 }();
135 }
136 }();
137 return 0;
138#elif defined(BLOCKS)
139 // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
140 // BLOCKS-LABEL: @main
David Blaikieea3e51d2015-06-29 17:29:50 +0000141 // BLOCKS: call {{.*}}void {{%.+}}(i8
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000142
Samuel Antaobc47f8f2015-07-27 17:49:18 +0000143 // TLS-BLOCKS: [[G:@.+]] = {{.*}}thread_local {{.*}}global i{{[0-9]+}} 1212,
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000144 // TLS-BLOCKS-LABEL: @main
145 // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000146 ^{
147 // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000148 // BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000149
Alexey Bataev2377fe92015-09-10 08:12:02 +0000150 // TLS-BLOCKS: [[G_CPY_VAL:%.+]] = call i{{[0-9]+}}* [[G_CTOR:@.+]]()
151 // TLS-BLOCKS: call {{.*}}void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G_CPY_VAL]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000152
153 // TLS-BLOCKS: define {{.*}}i{{[0-9]+}}* [[G_CTOR]]() {
154 // TLS-BLOCKS: ret i{{[0-9]+}}* [[G]]
155 // TLS-BLOCKS: }
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000156#pragma omp parallel copyin(g)
157 {
Alexey Bataev2377fe92015-09-10 08:12:02 +0000158 // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
159 // TLS-BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000160
161 // threadprivate_g = g;
David Blaikieea3e51d2015-06-29 17:29:50 +0000162 // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000163 // BLOCKS: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
164 // BLOCKS: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[G]] to i{{[0-9]+}}), %{{.+}}
165 // BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
166 // BLOCKS: [[NOT_MASTER]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000167 // BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G]], align 128
168 // BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000169 // BLOCKS: [[DONE]]
170
Alexey Bataev2377fe92015-09-10 08:12:02 +0000171 // TLS-BLOCKS-DAG: [[G_CAPTURE_SRC:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
Samuel Antaod31d4c12015-07-27 17:30:41 +0000172 // TLS-BLOCKS-DAG: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
173 // TLS-BLOCKS-DAG: [[G_CAPTURE_SRCC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_SRC]] to i{{[0-9]+}}
174 // TLS-BLOCKS-DAG: [[G_CAPTURE_DSTC:%.+]] = ptrtoint i{{[0-9]+}}* [[G_CAPTURE_DST]] to i{{[0-9]+}}
Samuel Antaobc47f8f2015-07-27 17:49:18 +0000175 // TLS-BLOCKS: icmp ne i{{[0-9]+}} {{%.+}}, {{%.+}}
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000176 // TLS-BLOCKS: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
177 // TLS-BLOCKS: [[NOT_MASTER]]
178 // TLS-BLOCKS: load i{{[0-9]+}}, i{{[0-9]+}}* [[G_CAPTURE_SRC]],
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000179 // TLS-BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000180 // TLS-BLOCKS: [[DONE]]
181
Alexey Bataev25e5b442015-09-15 12:52:43 +0000182 // BLOCKS: call {{.*}}void @__kmpc_barrier(
183 // TLS-BLOCKS: call {{.*}}void @__kmpc_barrier(
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000184 g = 1;
185 // BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}*
186 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
David Blaikieea3e51d2015-06-29 17:29:50 +0000187 // BLOCKS: call {{.*}}void {{%.+}}(i8
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000188
189 // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
190 // TLS-BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_CAPTURE_DST]]
191 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
192 // TLS-BLOCKS: call {{.*}}void {{%.+}}(i8
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000193 ^{
194 // BLOCKS: define {{.+}} void {{@.+}}(i8*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000195 // TLS-BLOCKS: define {{.+}} void {{@.+}}(i8*
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000196 g = 2;
197 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
David Blaikieea3e51d2015-06-29 17:29:50 +0000198 // BLOCKS: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[G]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000199 // BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}*
200 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
201 // BLOCKS: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000202
203 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
204 // TLS-BLOCKS: [[G_CAPTURE_DST:%.+]] = call i{{[0-9]+}}* [[G_CTOR]]()
205 // TLS-BLOCKS: store volatile i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_CAPTURE_DST]]
206 // TLS-BLOCKS-NOT: [[G]]{{[[^:word:]]}}
207 // TLS-BLOCKS: ret
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000208 }();
209 }
210 }();
211 return 0;
212#else
213 S<float> test;
214 test = S<float>();
215 static int t_var = 1122;
216 static int vec[] = {1, 2};
217 static S<float> s_arr[] = {1, 2};
218 static S<float> var(3);
219#pragma omp threadprivate(t_var, vec, s_arr, var)
220#pragma omp parallel copyin(t_var, vec, s_arr, var)
221 {
222 vec[0] = t_var;
223 s_arr[0] = var;
224 }
225#pragma omp parallel copyin(t_var)
226 {}
227 return tmain<int>();
228#endif
229}
230
231// CHECK-LABEL: @main
232// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
233// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000234// 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*, ...)*))
235// 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*, ...)*))
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000236// CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
237// CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
238// CHECK: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000239
240// TLS-CHECK-LABEL: @main
241// TLS-CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
242// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[TEST]], [[S_FLOAT_TY]]*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000243// 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*, ...)*),
244// 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*, ...)*),
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000245// TLS-CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
246// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
247// TLS-CHECK: ret
248
Alexey Bataev2377fe92015-09-10 08:12:02 +0000249// CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000250// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
251// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
252// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
253
Alexey Bataev2377fe92015-09-10 08:12:02 +0000254// TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000255// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
256
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000257// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000258// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000259// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
260// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
261// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
262// CHECK: [[NOT_MASTER]]
263// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
264// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
265
Alexey Bataev2377fe92015-09-10 08:12:02 +0000266// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
267// TLS-CHECK: [[MASTER_REF2:%.+]] = load [2 x i32]*, [2 x i32]** %
268// TLS-CHECK: [[MASTER_REF3:%.+]] = load [2 x [[S_FLOAT_TY]]]*, [2 x [[S_FLOAT_TY]]]** %
269// TLS-CHECK: [[MASTER_REF4:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
270
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000271// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
272// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
273// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
274// TLS-CHECK: [[NOT_MASTER]]
275// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
276// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
277
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000278// threadprivate_vec = vec;
David Blaikieea3e51d2015-06-29 17:29:50 +0000279// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VEC]]
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000280// CHECK: call void @llvm.memcpy{{.*}}(i8* align 4 %{{.+}}, i8* align 4 bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*),
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000281
Alexey Bataev2377fe92015-09-10 08:12:02 +0000282// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF2]] to i8*
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000283// TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* align 4 bitcast ([2 x i{{[0-9]+}}]* [[VEC]] to i8*), i8* align 4 [[MASTER_CAST]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000284
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000285// threadprivate_s_arr = s_arr;
David Blaikieea3e51d2015-06-29 17:29:50 +0000286// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[S_ARR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000287// 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
288// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
289// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
290// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
291// CHECK: [[S_ARR_BODY]]
292// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
293// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
294
Alexey Bataev2377fe92015-09-10 08:12:02 +0000295// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_FLOAT_TY]]]* [[MASTER_REF3]] to [[S_FLOAT_TY]]*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000296// TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_FLOAT_TY]]* {{.*}}[[MASTER_CAST]]
297// 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)
298// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
299// TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
300// TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
301// 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)
302// TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
303// TLS-CHECK: [[ARR_DONE]]
304
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000305// threadprivate_var = var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000306// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000307// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{%.+}}, [[S_FLOAT_TY]]* {{.*}}[[VAR]])
308// CHECK: [[DONE]]
309
Alexey Bataev2377fe92015-09-10 08:12:02 +0000310// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.*}}[[VAR]], [[S_FLOAT_TY]]* {{.*}}[[MASTER_REF4]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000311
Alexey Bataev25e5b442015-09-15 12:52:43 +0000312// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000313// CHECK: ret void
314
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000315// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
316// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
Alexey Bataev25e5b442015-09-15 12:52:43 +0000317// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000318// TLS-CHECK: ret void
319
Alexey Bataev2377fe92015-09-10 08:12:02 +0000320// CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000321// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
322// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
323// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
324
Alexey Bataev2377fe92015-09-10 08:12:02 +0000325// TLS-CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000326// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
327
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000328// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000329// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000330// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
331// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}}), %{{.+}}
332// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
333// CHECK: [[NOT_MASTER]]
334// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
335// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
336// CHECK: [[DONE]]
337
Alexey Bataev2377fe92015-09-10 08:12:02 +0000338// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
339
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000340// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
341// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[T_VAR]] to i{{[0-9]+}})
342// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
343// TLS-CHECK: [[NOT_MASTER]]
344// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
345// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
346// TLS-CHECK: [[DONE]]
347
Alexey Bataev25e5b442015-09-15 12:52:43 +0000348// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000349// CHECK: ret void
350
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000351// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
352// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
Alexey Bataev25e5b442015-09-15 12:52:43 +0000353// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000354// TLS-CHECK: ret void
355
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000356// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
357// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
358// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000359// 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*, ...)*))
360// 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*, ...)*))
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000361// CHECK: call {{.*}} [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
362// CHECK: ret
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000363
364// TLS-CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
365// TLS-CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
366// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[TEST]], [[S_INT_TY]]*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000367// 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*, ...)*),
368// 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*, ...)*),
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000369//
Alexey Bataev2377fe92015-09-10 08:12:02 +0000370// CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000371// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
372// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
373// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000374//
Alexey Bataev2377fe92015-09-10 08:12:02 +0000375// TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000376// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000377
378// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000379// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000380// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
381// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
382// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
383// CHECK: [[NOT_MASTER]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000384// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]], align 128
385// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}}, align 128
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000386
Alexey Bataev2377fe92015-09-10 08:12:02 +0000387// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
388// TLS-CHECK: [[MASTER_REF1:%.+]] = load [2 x i32]*, [2 x i32]** %
389// TLS-CHECK: [[MASTER_REF2:%.+]] = load [2 x [[S_INT_TY]]]*, [2 x [[S_INT_TY]]]** %
390// TLS-CHECK: [[MASTER_REF3:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** %
391
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000392// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
393// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
394// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
395// TLS-CHECK: [[NOT_MASTER]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000396// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]],
397// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]], align 128
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000398
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000399// threadprivate_vec = vec;
David Blaikieea3e51d2015-06-29 17:29:50 +0000400// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VEC]]
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000401// CHECK: call {{.*}}void @llvm.memcpy{{.*}}(i8* align 128 %{{.+}}, i8* align 128 bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*),
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000402
Alexey Bataev2377fe92015-09-10 08:12:02 +0000403// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x i32]* [[MASTER_REF1]] to i8*
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000404// TLS-CHECK: call void @llvm.memcpy{{.*}}(i8* align 128 bitcast ([2 x i{{[0-9]+}}]* [[TMAIN_VEC]] to i8*), i8* align 128 [[MASTER_CAST]]
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000405
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000406// threadprivate_s_arr = s_arr;
David Blaikieea3e51d2015-06-29 17:29:50 +0000407// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_S_ARR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000408// 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
409// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
410// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
411// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
412// CHECK: [[S_ARR_BODY]]
413// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
414// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
415
Alexey Bataev2377fe92015-09-10 08:12:02 +0000416// TLS-CHECK: [[MASTER_CAST:%.+]] = bitcast [2 x [[S_INT_TY]]]* [[MASTER_REF2]] to [[S_INT_TY]]*
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000417// TLS-CHECK-DAG: [[S_ARR_SRC_BEGIN:%.+]] = phi [[S_INT_TY]]* {{.*}}[[MASTER_CAST]]
418// 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)
419// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
420// TLS-CHECK-DAG: [[S_ARR_SRC_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_SRC_BEGIN]], i{{[0-9]+}} 1
421// TLS-CHECK-DAG: [[S_ARR_DST_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_DST_BEGIN]], i{{[0-9]+}} 1
422// 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)
423// TLS-CHECK: br i1 %{{.*}}, label %[[ARR_DONE:.+]], label {{.*}}
424// TLS-CHECK: [[ARR_DONE]]
425
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000426// threadprivate_var = var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000427// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000428// CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{%.+}}, [[S_INT_TY]]* {{.*}}[[TMAIN_VAR]])
429// CHECK: [[DONE]]
430
Alexey Bataev2377fe92015-09-10 08:12:02 +0000431// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.*}}[[TMAIN_VAR]], [[S_INT_TY]]* {{.*}}[[MASTER_REF3]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000432
Alexey Bataev25e5b442015-09-15 12:52:43 +0000433// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000434// CHECK: ret void
435
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000436// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
437// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
Alexey Bataev25e5b442015-09-15 12:52:43 +0000438// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000439// TLS-CHECK: ret void
440
Alexey Bataev2377fe92015-09-10 08:12:02 +0000441// CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000442// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
443// CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
444// CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
445
Alexey Bataev2377fe92015-09-10 08:12:02 +0000446// TLS-CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000447// TLS-CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
448
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000449// threadprivate_t_var = t_var;
David Blaikieea3e51d2015-06-29 17:29:50 +0000450// CHECK: call {{.*}}i8* @__kmpc_threadprivate_cached({{.+}} [[TMAIN_T_VAR]]
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000451// CHECK: ptrtoint i{{[0-9]+}}* %{{.+}} to i{{[0-9]+}}
452// CHECK: icmp ne i{{[0-9]+}} ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}}), %{{.+}}
453// CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
454// CHECK: [[NOT_MASTER]]
455// CHECK: load i{{[0-9]+}}, i{{[0-9]+}}* [[TMAIN_T_VAR]],
456// CHECK: store i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* %{{.+}},
457// CHECK: [[DONE]]
458
Alexey Bataev2377fe92015-09-10 08:12:02 +0000459// TLS-CHECK: [[MASTER_REF:%.+]] = load i32*, i32** %
460
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000461// TLS-CHECK: [[MASTER_LONG:%.+]] = ptrtoint i32* [[MASTER_REF]] to i{{[0-9]+}}
462// TLS-CHECK: icmp ne i{{[0-9]+}} [[MASTER_LONG]], ptrtoint (i{{[0-9]+}}* [[TMAIN_T_VAR]] to i{{[0-9]+}})
463// TLS-CHECK: br i1 %{{.+}}, label %[[NOT_MASTER:.+]], label %[[DONE:.+]]
464// TLS-CHECK: [[NOT_MASTER]]
465// TLS-CHECK: [[MASTER_VAL:%.+]] = load i32, i32* [[MASTER_REF]]
466// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]]
467// TLS-CHECK: [[DONE]]
468
Alexey Bataev25e5b442015-09-15 12:52:43 +0000469// CHECK: call {{.*}}void @__kmpc_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]],
Alexey Bataev25e5b442015-09-15 12:52:43 +0000474// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000475// TLS-CHECK: ret void
476
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000477#endif
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000478#else
479// ARRAY-LABEL: array_func
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000480// TLS-ARRAY-LABEL: array_func
481
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000482struct St {
483 int a, b;
484 St() : a(0), b(0) {}
485 St &operator=(const St &) { return *this; };
486 ~St() {}
487};
488
489void array_func() {
490 static int a[2];
491 static St s[2];
492// ARRAY: @__kmpc_fork_call(
493// ARRAY: call i8* @__kmpc_threadprivate_cached(
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000494// ARRAY: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.+}}, i8* align 4 bitcast ([2 x i32]* @{{.+}} to i8*), i64 8, i1 false)
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000495// ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000496
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000497// TLS-ARRAY: @__kmpc_fork_call(
Alexey Bataev2377fe92015-09-10 08:12:02 +0000498// TLS-ARRAY: [[REFT:%.+]] = load [2 x i32]*, [2 x i32]** [[ADDR:%.+]],
499// TLS-ARRAY: [[REF:%.+]] = bitcast [2 x i32]* [[REFT]] to i8*
Pete Cooper7bfd5cb2015-11-18 22:18:45 +0000500// TLS-ARRAY: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 bitcast ([2 x i32]* @{{.+}} to i8*), i8* align 4 [[REF]], i64 8, i1 false)
Samuel Antao9c75cfe2015-07-27 16:38:06 +0000501// TLS-ARRAY: call dereferenceable(8) %struct.St* @{{.+}}(%struct.St* %{{.+}}, %struct.St* dereferenceable(8) %{{.+}})
502
Alexey Bataev1d9c15c2015-05-19 12:31:28 +0000503#pragma omp threadprivate(a, s)
504#pragma omp parallel copyin(a, s)
505 ;
506}
507#endif
508
Alexey Bataevf56f98c2015-04-16 05:39:01 +0000509