1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4 // RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -DLAMBDA -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=LAMBDA %s
5 // RUN: %clang_cc1 -verify -fopenmp -x c++ -fblocks -DBLOCKS -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=BLOCKS %s
6 // expected-no-diagnostics
7 // REQUIRES: x86-registered-target
8 #ifndef HEADER
9 #define HEADER
10 
11 struct SS {
12   int a;
13   int b : 4;
14   int &c;
15   SS(int &d) : a(0), b(0), c(d) {
16 #pragma omp parallel
17 #pragma omp for lastprivate(a, b, c)
18     for (int i = 0; i < 2; ++i)
19 #ifdef LAMBDA
20       [&]() {
21         ++this->a, --b, (this)->c /= 1;
22 #pragma omp parallel
23 #pragma omp for lastprivate(a, b, c)
24         for (int i = 0; i < 2; ++i)
25           ++(this)->a, --b, this->c /= 1;
26       }();
27 #elif defined(BLOCKS)
28       ^{
29         ++a;
30         --this->b;
31         (this)->c /= 1;
32 #pragma omp parallel
33 #pragma omp for lastprivate(a, b, c)
34         for (int i = 0; i < 2; ++i)
35           ++(this)->a, --b, this->c /= 1;
36       }();
37 #else
38       ++this->a, --b, c /= 1;
39 #endif
40   }
41 };
42 
43 template <typename T>
44 struct SST {
45   T a;
46   SST() : a(T()) {
47 #pragma omp parallel
48 #pragma omp for lastprivate(a)
49     for (int i = 0; i < 2; ++i)
50 #ifdef LAMBDA
51       [&]() {
52         [&]() {
53           ++this->a;
54 #pragma omp parallel
55 #pragma omp for lastprivate(a)
56           for (int i = 0; i < 2; ++i)
57             ++(this)->a;
58         }();
59       }();
60 #elif defined(BLOCKS)
61       ^{
62         ^{
63           ++a;
64 #pragma omp parallel
65 #pragma omp for lastprivate(a)
66           for (int i = 0; i < 2; ++i)
67             ++(this)->a;
68         }();
69       }();
70 #else
71       ++(this)->a;
72 #endif
73   }
74 };
75 
76 template <class T>
77 struct S {
78   T f;
79   S(T a) : f(a) {}
80   S() : f() {}
81   S<T> &operator=(const S<T> &);
82   operator T() { return T(); }
83   ~S() {}
84 };
85 
86 volatile int g __attribute__((aligned(128)))= 1212;
87 volatile int &g1 = g;
88 float f;
89 char cnt;
90 
91 // CHECK: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
92 // LAMBDA: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
93 // BLOCKS: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
94 // CHECK: [[S_FLOAT_TY:%.+]] = type { float }
95 // CHECK: [[S_INT_TY:%.+]] = type { i32 }
96 // CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
97 // CHECK-DAG: [[X:@.+]] = global double 0.0
98 // CHECK-DAG: [[F:@.+]] = global float 0.0
99 // CHECK-DAG: [[CNT:@.+]] = global i8 0
100 template <typename T>
101 T tmain() {
102   S<T> test;
103   SST<T> sst;
104   T t_var __attribute__((aligned(128))) = T();
105   T vec[] __attribute__((aligned(128))) = {1, 2};
106   S<T> s_arr[] __attribute__((aligned(128))) = {1, 2};
107   S<T> &var __attribute__((aligned(128))) = test;
108 #pragma omp parallel
109 #pragma omp for lastprivate(t_var, vec, s_arr, var)
110   for (int i = 0; i < 2; ++i) {
111     vec[i] = t_var;
112     s_arr[i] = var;
113   }
114   return T();
115 }
116 
117 namespace A {
118 double x;
119 }
120 namespace B {
121 using A::x;
122 }
123 
124 int main() {
125   static int sivar;
126   SS ss(sivar);
127 #ifdef LAMBDA
128   // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212,
129   // LAMBDA: [[SIVAR:@.+]] = internal global i{{[0-9]+}} 0,
130   // LAMBDA-LABEL: @main
131   // LAMBDA: alloca [[SS_TY]],
132   // LAMBDA: alloca [[CAP_TY:%.+]],
133   // LAMBDA: call void [[OUTER_LAMBDA:@.+]]([[CAP_TY]]*
134   [&]() {
135   // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
136   // LAMBDA: call void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* %{{.+}})
137 #pragma omp parallel
138 #pragma omp for lastprivate(g, g1, sivar)
139   for (int i = 0; i < 2; ++i) {
140     // LAMBDA: define {{.+}} @{{.+}}([[SS_TY]]*
141     // LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
142     // LAMBDA: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
143     // LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
144     // LAMBDA: store i8
145     // LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
146     // LAMBDA: 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
147     // LAMBDA: ret
148 
149     // LAMBDA: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
150     // LAMBDA: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 0
151     // LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
152     // LAMBDA: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
153     // LAMBDA: call void @__kmpc_for_static_init_4(
154     // LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]*
155     // LAMBDA: call{{.*}} void
156     // LAMBDA: call void @__kmpc_for_static_fini(
157     // LAMBDA: br i1
158     // LAMBDA: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
159     // LAMBDA: store i8 %{{.+}}, i8* [[B_REF]],
160     // LAMBDA: br label
161     // LAMBDA: ret void
162 
163     // LAMBDA: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}}, i32* {{.+}}, i32* {{.+}}, i32* {{.+}})
164     // LAMBDA: alloca i{{[0-9]+}},
165     // LAMBDA: alloca i{{[0-9]+}},
166     // LAMBDA: alloca i{{[0-9]+}},
167     // LAMBDA: alloca i{{[0-9]+}},
168     // LAMBDA: alloca i{{[0-9]+}},
169     // LAMBDA: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
170     // LAMBDA: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
171     // LAMBDA: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
172     // LAMBDA: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
173     // LAMBDA: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
174     // LAMBDA: call void @__kmpc_for_static_init_4(
175     // LAMBDA: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
176     // LAMBDA-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
177     // LAMBDA-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
178     // LAMBDA-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
179     // LAMBDA-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
180     // LAMBDA-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
181     // LAMBDA-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
182     // LAMBDA-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
183     // LAMBDA-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
184     // LAMBDA-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
185     // LAMBDA-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
186     // LAMBDA: call void @__kmpc_for_static_fini(
187     // LAMBDA: br i1
188     // LAMBDA: br label
189     // LAMBDA: ret void
190 
191     // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) [[SIVAR:%.+]])
192     // LAMBDA: alloca i{{[0-9]+}},
193     // LAMBDA: alloca i{{[0-9]+}},
194     // LAMBDA: alloca i{{[0-9]+}},
195     // LAMBDA: alloca i{{[0-9]+}},
196     // LAMBDA: alloca i{{[0-9]+}},
197     // LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, align 128
198     // LAMBDA: [[G1_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
199     // LAMBDA: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
200     // LAMBDA: [[SIVAR_PRIVATE_ADDR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %{{.+}},
201 
202     // LAMBDA: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %{{.+}}
203     // LAMBDA: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
204 
205     // LAMBDA: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
206     // LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
207     // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]],
208     // LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
209     // LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
210     // LAMBDA: [[SIVAR_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
211     // LAMBDA: store i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]], i{{[0-9]+}}** [[SIVAR_PRIVATE_ADDR_REF]]
212     // LAMBDA: call void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
213     // LAMBDA: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
214     g = 1;
215     g1 = 1;
216     sivar = 2;
217     // Check for final copying of private values back to original vars.
218     // LAMBDA: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
219     // LAMBDA: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
220     // LAMBDA: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
221     // LAMBDA: [[LAST_THEN]]
222     // Actual copying.
223 
224     // original g=private_g;
225     // LAMBDA: [[G_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
226     // LAMBDA: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
227 
228     // original sivar=private_sivar;
229     // LAMBDA: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]],
230     // LAMBDA: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* %{{.+}},
231     // LAMBDA: br label %[[LAST_DONE]]
232     // LAMBDA: [[LAST_DONE]]
233     // LAMBDA: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
234     [&]() {
235       // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
236       // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
237       g = 2;
238       g1 = 2;
239       sivar = 4;
240       // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
241       // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
242       // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]]
243       // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]]
244       // LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
245       // LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]]
246       // LAMBDA: store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIVAR_REF]]
247     }();
248   }
249   }();
250   return 0;
251 #elif defined(BLOCKS)
252   // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
253   // BLOCKS-LABEL: @main
254   // BLOCKS: call
255   // BLOCKS: call void {{%.+}}(i8
256   ^{
257   // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
258   // BLOCKS: call void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
259 #pragma omp parallel
260 #pragma omp for lastprivate(g, g1, sivar)
261   for (int i = 0; i < 2; ++i) {
262     // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) [[SIVAR:%.+]])
263     // BLOCKS: alloca i{{[0-9]+}},
264     // BLOCKS: alloca i{{[0-9]+}},
265     // BLOCKS: alloca i{{[0-9]+}},
266     // BLOCKS: alloca i{{[0-9]+}},
267     // BLOCKS: alloca i{{[0-9]+}},
268     // BLOCKS: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, align 128
269     // BLOCKS: [[G1_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, align 4
270     // BLOCKS: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
271     // BLOCKS: store i{{[0-9]+}}* [[SIVAR]], i{{[0-9]+}}** [[SIVAR_ADDR:%.+]],
272     // BLOCKS: {{.+}} = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_ADDR]]
273     // BLOCKS: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %{{.+}}
274     // BLOCKS: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
275     // BLOCKS: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
276     // BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
277     // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
278     // BLOCKS: i{{[0-9]+}}* [[G_PRIVATE_ADDR]]
279     // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
280     // BLOCKS: call void {{%.+}}(i8
281     // BLOCKS: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
282     g = 1;
283     g1 = 1;
284     sivar = 2;
285     // Check for final copying of private values back to original vars.
286     // BLOCKS: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
287     // BLOCKS: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
288     // BLOCKS: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
289     // BLOCKS: [[LAST_THEN]]
290     // Actual copying.
291 
292     // original g=private_g;
293     // BLOCKS: [[G_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
294     // BLOCKS: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
295     // BLOCKS: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]],
296     // BLOCKS: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* %{{.+}},
297     // BLOCKS: br label %[[LAST_DONE]]
298     // BLOCKS: [[LAST_DONE]]
299     // BLOCKS: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
300     g = 1;
301     g1 = 1;
302     ^{
303       // BLOCKS: define {{.+}} void {{@.+}}(i8*
304       g = 2;
305       g1 = 1;
306       sivar = 4;
307       // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
308       // BLOCKS: store i{{[0-9]+}} 2, i{{[0-9]+}}*
309       // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
310       // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
311       // BLOCKS: store i{{[0-9]+}} 4, i{{[0-9]+}}*
312       // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
313       // BLOCKS: ret
314     }();
315   }
316   }();
317   return 0;
318 // BLOCKS: define {{.+}} @{{.+}}([[SS_TY]]*
319 // BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
320 // BLOCKS: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
321 // BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
322 // BLOCKS: store i8
323 // BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
324 // BLOCKS: 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
325 // BLOCKS: ret
326 
327 // BLOCKS: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
328 // BLOCKS: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 0
329 // BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
330 // BLOCKS: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
331 // BLOCKS: call void @__kmpc_for_static_init_4(
332 // BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]*
333 // BLOCKS: call{{.*}} void
334 // BLOCKS: call void @__kmpc_for_static_fini(
335 // BLOCKS: br i1
336 // BLOCKS: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
337 // BLOCKS: store i8 %{{.+}}, i8* [[B_REF]],
338 // BLOCKS: br label
339 // BLOCKS: ret void
340 
341 // BLOCKS: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}}, i32* {{.+}}, i32* {{.+}}, i32* {{.+}})
342 // BLOCKS: alloca i{{[0-9]+}},
343 // BLOCKS: alloca i{{[0-9]+}},
344 // BLOCKS: alloca i{{[0-9]+}},
345 // BLOCKS: alloca i{{[0-9]+}},
346 // BLOCKS: alloca i{{[0-9]+}},
347 // BLOCKS: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
348 // BLOCKS: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
349 // BLOCKS: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
350 // BLOCKS: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
351 // BLOCKS: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
352 // BLOCKS: call void @__kmpc_for_static_init_4(
353 // BLOCKS: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
354 // BLOCKS-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
355 // BLOCKS-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
356 // BLOCKS-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
357 // BLOCKS-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
358 // BLOCKS-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
359 // BLOCKS-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
360 // BLOCKS-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
361 // BLOCKS-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
362 // BLOCKS-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
363 // BLOCKS-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
364 // BLOCKS: call void @__kmpc_for_static_fini(
365 // BLOCKS: br i1
366 // BLOCKS: br label
367 // BLOCKS: ret void
368 #else
369   S<float> test;
370   int t_var = 0;
371   int vec[] = {1, 2};
372   S<float> s_arr[] = {1, 2};
373   S<float> var(3);
374 #pragma omp parallel
375 #pragma omp for lastprivate(t_var, vec, s_arr, var, sivar)
376   for (int i = 0; i < 2; ++i) {
377     vec[i] = t_var;
378     s_arr[i] = var;
379     sivar += i;
380   }
381 #pragma omp parallel
382 #pragma omp for lastprivate(A::x, B::x) firstprivate(f) lastprivate(f)
383   for (int i = 0; i < 2; ++i) {
384     A::x++;
385   }
386 #pragma omp parallel
387 #pragma omp for firstprivate(f) lastprivate(f)
388   for (int i = 0; i < 2; ++i) {
389     A::x++;
390   }
391 #pragma omp parallel
392 #pragma omp for lastprivate(cnt)
393   for (cnt = 0; cnt < 2; ++cnt) {
394     A::x++;
395   }
396   return tmain<int>();
397 #endif
398 }
399 
400 // CHECK: define i{{[0-9]+}} @main()
401 // CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
402 // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
403 // CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 5, 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]]*, i32*)* [[MAIN_MICROTASK:@.+]] to void
404 // 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
405 // 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_MICROTASK2:@.+]] to void
406 // 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_MICROTASK3:@.+]] to void
407 // CHECK: = call {{.+}} [[TMAIN_INT:@.+]]()
408 // CHECK: call void [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
409 // CHECK: ret
410 
411 // CHECK: define internal void [[MAIN_MICROTASK]](i32* noalias [[GTID_ADDR:%.+]], i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}}, [2 x i32]* dereferenceable(8) %{{.+}}, [2 x [[S_FLOAT_TY]]]* dereferenceable(8) %{{.+}}, [[S_FLOAT_TY]]* dereferenceable(4) %{{.+}})
412 // CHECK: alloca i{{[0-9]+}},
413 // CHECK: alloca i{{[0-9]+}},
414 // CHECK: alloca i{{[0-9]+}},
415 // CHECK: alloca i{{[0-9]+}},
416 // CHECK: alloca i{{[0-9]+}},
417 // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
418 // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
419 // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
420 // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
421 // CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}},
422 // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
423 
424 // CHECK: [[T_VAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
425 // CHECK: [[VEC_REF:%.+]] = load [2 x i32]*, [2 x i32]** %
426 // CHECK: [[S_ARR_REF:%.+]] = load [2 x [[S_FLOAT_TY]]]*, [2 x [[S_FLOAT_TY]]]** %
427 // CHECK: [[VAR_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
428 
429 // Check for default initialization.
430 // CHECK-NOT: [[T_VAR_PRIV]]
431 // CHECK-NOT: [[VEC_PRIV]]
432 // CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_FLOAT_TY]]*
433 // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[S_ARR_PRIV_ITEM]])
434 // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
435 // CHECK: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 %{{.+}}, i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
436 // <Skip loop body>
437 // CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 %{{.+}})
438 
439 // Check for final copying of private values back to original vars.
440 // CHECK: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
441 // CHECK: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
442 // CHECK: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
443 // CHECK: [[LAST_THEN]]
444 // Actual copying.
445 
446 // original t_var=private_t_var;
447 // CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_PRIV]],
448 // CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_REF]],
449 
450 // original vec[]=private_vec[];
451 // CHECK: [[VEC_DEST:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_REF]] to i8*
452 // CHECK: [[VEC_SRC:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_PRIV]] to i8*
453 // CHECK: call void @llvm.memcpy.{{.+}}(i8* [[VEC_DEST]], i8* [[VEC_SRC]],
454 
455 // original s_arr[]=private_s_arr[];
456 // CHECK: [[S_ARR_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR_REF]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
457 // CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = bitcast [2 x [[S_FLOAT_TY]]]* [[S_ARR_PRIV]] to [[S_FLOAT_TY]]*
458 // CHECK: [[S_ARR_END:%.+]] = getelementptr [[S_FLOAT_TY]], [[S_FLOAT_TY]]* [[S_ARR_BEGIN]], i{{[0-9]+}} 2
459 // CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_FLOAT_TY]]* [[S_ARR_BEGIN]], [[S_ARR_END]]
460 // CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
461 // CHECK: [[S_ARR_BODY]]
462 // CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}})
463 // CHECK: br i1 {{.+}}, label %[[S_ARR_BODY_DONE]], label %[[S_ARR_BODY]]
464 // CHECK: [[S_ARR_BODY_DONE]]
465 
466 // original var=private_var;
467 // CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN:@.+]]([[S_FLOAT_TY]]* [[VAR_REF]], [[S_FLOAT_TY]]* {{.*}} [[VAR_PRIV]])
468 // CHECK: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR_PRIV]],
469 // CHECK: br label %[[LAST_DONE]]
470 // CHECK: [[LAST_DONE]]
471 // CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
472 // CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
473 // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
474 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
475 // CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
476 // CHECK: ret void
477 
478 //
479 // CHECK: define internal void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
480 // CHECK: [[F_PRIV:%.+]] = alloca float,
481 // CHECK-NOT: alloca float
482 // CHECK: [[X_PRIV:%.+]] = alloca double,
483 // CHECK-NOT: alloca float
484 // CHECK-NOT: alloca double
485 
486 // Check for default initialization.
487 // CHECK-NOT: [[X_PRIV]]
488 // CHECK: [[F_VAL:%.+]] = load float, float* [[F]],
489 // CHECK: store float [[F_VAL]], float* [[F_PRIV]],
490 // CHECK-NOT: [[X_PRIV]]
491 
492 // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
493 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
494 // CHECK: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
495 // <Skip loop body>
496 // CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
497 
498 // Check for final copying of private values back to original vars.
499 // CHECK: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
500 // CHECK: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
501 // CHECK: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
502 // CHECK: [[LAST_THEN]]
503 // Actual copying.
504 
505 // original x=private_x;
506 // CHECK: [[X_VAL:%.+]] = load double, double* [[X_PRIV]],
507 // CHECK: store double [[X_VAL]], double* [[X]],
508 
509 // original f=private_f;
510 // CHECK: [[F_VAL:%.+]] = load float, float* [[F_PRIV]],
511 // CHECK: store float [[F_VAL]], float* [[F]],
512 
513 // CHECK-NEXT: br label %[[LAST_DONE]]
514 // CHECK: [[LAST_DONE]]
515 
516 // CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
517 // CHECK: ret void
518 
519 // CHECK: define internal void [[MAIN_MICROTASK2]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
520 // CHECK: [[F_PRIV:%.+]] = alloca float,
521 // CHECK-NOT: alloca float
522 
523 // Check for default initialization.
524 // CHECK: [[F_VAL:%.+]] = load float, float* [[F]],
525 // CHECK: store float [[F_VAL]], float* [[F_PRIV]],
526 
527 // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
528 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
529 // CHECK: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
530 // <Skip loop body>
531 // CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
532 
533 // Check for final copying of private values back to original vars.
534 // CHECK: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
535 // CHECK: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
536 // CHECK: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
537 // CHECK: [[LAST_THEN]]
538 // Actual copying.
539 
540 // original f=private_f;
541 // CHECK: [[F_VAL:%.+]] = load float, float* [[F_PRIV]],
542 // CHECK: store float [[F_VAL]], float* [[F]],
543 
544 // CHECK-NEXT: br label %[[LAST_DONE]]
545 // CHECK: [[LAST_DONE]]
546 
547 // CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
548 // CHECK: ret void
549 
550 // CHECK: define internal void [[MAIN_MICROTASK3]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
551 // CHECK: [[CNT_PRIV:%.+]] = alloca i8,
552 
553 // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
554 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
555 // CHECK: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* [[OMP_LB:%[^,]+]], i32* [[OMP_UB:%[^,]+]], i32* [[OMP_ST:%[^,]+]], i32 1, i32 1)
556 // UB = min(UB, GlobalUB)
557 // CHECK-NEXT: [[UB:%.+]] = load i32, i32* [[OMP_UB]]
558 // CHECK-NEXT: [[UBCMP:%.+]] = icmp sgt i32 [[UB]], 1
559 // CHECK-NEXT: br i1 [[UBCMP]], label [[UB_TRUE:%[^,]+]], label [[UB_FALSE:%[^,]+]]
560 // CHECK: [[UBRESULT:%.+]] = phi i32 [ 1, [[UB_TRUE]] ], [ [[UBVAL:%[^,]+]], [[UB_FALSE]] ]
561 // CHECK-NEXT: store i32 [[UBRESULT]], i32* [[OMP_UB]]
562 // CHECK-NEXT: [[LB:%.+]] = load i32, i32* [[OMP_LB]]
563 // CHECK-NEXT: store i32 [[LB]], i32* [[OMP_IV:[^,]+]]
564 // <Skip loop body>
565 // CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
566 
567 // Check for final copying of private values back to original vars.
568 // CHECK: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
569 // CHECK: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
570 // CHECK: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
571 // CHECK: [[LAST_THEN]]
572 
573 // Calculate private cnt value.
574 // CHECK: store i8 2, i8* [[CNT_PRIV]]
575 // original cnt=private_cnt;
576 // CHECK: [[CNT_VAL:%.+]] = load i8, i8* [[CNT_PRIV]],
577 // CHECK: store i8 [[CNT_VAL]], i8* [[CNT]],
578 
579 // CHECK-NEXT: br label %[[LAST_DONE]]
580 // CHECK: [[LAST_DONE]]
581 
582 // CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
583 // CHECK: ret void
584 
585 // CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
586 // CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
587 // CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR:@.+]]([[S_INT_TY]]* [[TEST]])
588 // 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
589 // CHECK: call void [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
590 // CHECK: ret
591 
592 // CHECK: define {{.+}} @{{.+}}([[SS_TY]]*
593 // CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
594 // CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
595 // CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
596 // CHECK: store i8
597 // CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
598 // 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
599 // CHECK: ret
600 
601 // CHECK: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
602 // CHECK: alloca i{{[0-9]+}},
603 // CHECK: alloca i{{[0-9]+}},
604 // CHECK: alloca i{{[0-9]+}},
605 // CHECK: alloca i{{[0-9]+}},
606 // CHECK: alloca i{{[0-9]+}},
607 // CHECK: alloca i{{[0-9]+}},
608 // CHECK: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
609 // CHECK: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
610 // CHECK: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
611 // CHECK: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
612 // CHECK: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
613 // CHECK: call void @__kmpc_for_static_init_4(
614 // CHECK: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
615 // CHECK-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
616 // CHECK-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
617 // CHECK-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
618 // CHECK-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
619 // CHECK-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
620 // CHECK-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
621 // CHECK-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
622 // CHECK-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
623 // CHECK-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
624 // CHECK-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
625 // CHECK: call void @__kmpc_for_static_fini(
626 // CHECK: br i1
627 // CHECK: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
628 // CHECK: store i8 %{{.+}}, i8* [[B_REF]],
629 // CHECK: br label
630 // CHECK: ret void
631 
632 // CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}}, [2 x i32]* dereferenceable(8) %{{.+}}, [2 x [[S_INT_TY]]]* dereferenceable(8) %{{.+}}, [[S_INT_TY]]* dereferenceable(4) %{{.+}})
633 // CHECK: alloca i{{[0-9]+}},
634 // CHECK: alloca i{{[0-9]+}},
635 // CHECK: alloca i{{[0-9]+}},
636 // CHECK: alloca i{{[0-9]+}},
637 // CHECK: alloca i{{[0-9]+}},
638 // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, align 128
639 // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], align 128
640 // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], align 128
641 // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], align 128
642 // CHECK: [[VAR_PRIV_REF:%.+]] = alloca [[S_INT_TY]]*,
643 // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
644 
645 // CHECK: [[T_VAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
646 // CHECK: [[VEC_REF:%.+]] = load [2 x i{{[0-9]+}}]*, [2 x i{{[0-9]+}}]** %
647 // CHECK: [[S_ARR_REF:%.+]] = load [2 x [[S_INT_TY]]]*, [2 x [[S_INT_TY]]]** %
648 
649 // Check for default initialization.
650 // CHECK-NOT: [[T_VAR_PRIV]]
651 // CHECK-NOT: [[VEC_PRIV]]
652 // CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_INT_TY]]*
653 // CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[S_ARR_PRIV_ITEM]])
654 // CHECK: [[VAR_REF:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** %
655 // CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]])
656 // CHECK: store [[S_INT_TY]]* [[VAR_PRIV]], [[S_INT_TY]]** [[VAR_PRIV_REF]]
657 // CHECK: call {{.+}} @__kmpc_for_static_init_4(%{{.+}}* @{{.+}}, i32 %{{.+}}, i32 34, i32* [[IS_LAST_ADDR:%.+]], i32* %{{.+}}, i32* %{{.+}}, i32* %{{.+}}, i32 1, i32 1)
658 // <Skip loop body>
659 // CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 %{{.+}})
660 
661 // Check for final copying of private values back to original vars.
662 // CHECK: [[IS_LAST_VAL:%.+]] = load i32, i32* [[IS_LAST_ADDR]],
663 // CHECK: [[IS_LAST_ITER:%.+]] = icmp ne i32 [[IS_LAST_VAL]], 0
664 // CHECK: br i1 [[IS_LAST_ITER:%.+]], label %[[LAST_THEN:.+]], label %[[LAST_DONE:.+]]
665 // CHECK: [[LAST_THEN]]
666 // Actual copying.
667 
668 // original t_var=private_t_var;
669 // CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_PRIV]],
670 // CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_REF]],
671 
672 // original vec[]=private_vec[];
673 // CHECK: [[VEC_DEST:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_REF]] to i8*
674 // CHECK: [[VEC_SRC:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_PRIV]] to i8*
675 // CHECK: call void @llvm.memcpy.{{.+}}(i8* [[VEC_DEST]], i8* [[VEC_SRC]],
676 
677 // original s_arr[]=private_s_arr[];
678 // CHECK: [[S_ARR_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_REF]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
679 // CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = bitcast [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]] to [[S_INT_TY]]*
680 // CHECK: [[S_ARR_END:%.+]] = getelementptr [[S_INT_TY]], [[S_INT_TY]]* [[S_ARR_BEGIN]], i{{[0-9]+}} 2
681 // CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_INT_TY]]* [[S_ARR_BEGIN]], [[S_ARR_END]]
682 // CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
683 // CHECK: [[S_ARR_BODY]]
684 // CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}})
685 // CHECK: br i1 {{.+}}, label %[[S_ARR_BODY_DONE]], label %[[S_ARR_BODY]]
686 // CHECK: [[S_ARR_BODY_DONE]]
687 
688 // original var=private_var;
689 // CHECK: [[VAR_PRIV1:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** [[VAR_PRIV_REF]],
690 // CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN:@.+]]([[S_INT_TY]]* [[VAR_REF]], [[S_INT_TY]]* {{.*}} [[VAR_PRIV1]])
691 // CHECK: br label %[[LAST_DONE]]
692 // CHECK: [[LAST_DONE]]
693 // CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
694 // CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]*
695 // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
696 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
697 // CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
698 // CHECK: ret void
699 #endif
700 
701