Clang Project

clang_source_code/test/OpenMP/parallel_private_codegen.cpp
1// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -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 %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=LAMBDA %s
5// RUN: %clang_cc1 -verify -fopenmp -x c++ -fblocks -DBLOCKS -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck -check-prefix=BLOCKS %s
6
7// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
8// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
9// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
10// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++11 -DLAMBDA -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
11// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -fblocks -DBLOCKS -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
12// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
13// expected-no-diagnostics
14#ifndef HEADER
15#define HEADER
16template <class T>
17struct S {
18  T f;
19  S(T a) : f(a) {}
20  S() : f() {}
21  operator T() { return T(); }
22  ~S() {}
23};
24
25volatile int g __attribute__((aligned(128))) = 1212;
26
27struct SS {
28  int a;
29  int b : 4;
30  int &c;
31  SS(int &d) : a(0), b(0), c(d) {
32#pragma omp parallel private(a, b, c)
33#ifdef LAMBDA
34    [&]() {
35      ++this->a, --b, (this)->c /= 1;
36#pragma omp parallel private(a, b, c)
37      ++(this)->a, --b, this->c /= 1;
38    }();
39#elif defined(BLOCKS)
40    ^{
41      ++a;
42      --this->b;
43      (this)->c /= 1;
44#pragma omp parallel private(a, b, c)
45      ++(this)->a, --b, this->c /= 1;
46    }();
47#else
48    ++this->a, --b, c /= 1;
49#endif
50  }
51};
52
53template<typename T>
54struct SST {
55  T a;
56  SST() : a(T()) {
57#pragma omp parallel private(a)
58#ifdef LAMBDA
59    [&]() {
60      [&]() {
61        ++this->a;
62#pragma omp parallel private(a)
63        ++(this)->a;
64      }();
65    }();
66#elif defined(BLOCKS)
67    ^{
68      ^{
69        ++a;
70#pragma omp parallel private(a)
71        ++(this)->a;
72      }();
73    }();
74#else
75    ++(this)->a;
76#endif
77  }
78};
79
80// CHECK: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
81// LAMBDA: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
82// BLOCKS: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
83// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
84// CHECK: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
85// CHECK: [[SST_TY:%.+]] = type { i{{[0-9]+}} }
86template <typename T>
87T tmain() {
88  S<T> test;
89  SST<T> sst;
90  T t_var __attribute__((aligned(128))) = T();
91  T vec[] __attribute__((aligned(128))) = {1, 2};
92  S<T> s_arr[] __attribute__((aligned(128))) = {1, 2};
93  S<T> var __attribute__((aligned(128))) (3);
94#pragma omp parallel private(t_var, vec, s_arr, var)
95  {
96    vec[0] = t_var;
97    s_arr[0] = var;
98  }
99  return T();
100}
101
102int main() {
103  static int sivar;
104  SS ss(sivar);
105#ifdef LAMBDA
106  // LAMBDA: [[G:@.+]] = {{(dso_local )?}}global i{{[0-9]+}} 1212,
107  // LAMBDA-LABEL: @main
108  // LAMBDA: alloca [[SS_TY]],
109  // LAMBDA: alloca [[CAP_TY:%.+]],
110  // LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@[^(]+]]([[CAP_TY]]*
111  [&]() {
112  // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
113  // LAMBDA-NOT: = getelementptr inbounds %{{.+}},
114  // LAMBDA: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
115#pragma omp parallel private(g, sivar)
116  {
117    // LAMBDA: define {{.+}} @{{.+}}([[SS_TY]]*
118    // LAMBDA: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
119    // LAMBDA: store i8
120    // 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
121    // LAMBDA: ret
122
123    // LAMBDA: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
124    // LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %
125    // LAMBDA: call{{.*}} void
126    // LAMBDA: ret void
127
128    // LAMBDA: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
129    // LAMBDA: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
130    // LAMBDA: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
131    // LAMBDA: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
132    // LAMBDA: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
133    // LAMBDA: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
134    // LAMBDA-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
135    // LAMBDA-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
136    // LAMBDA-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
137    // LAMBDA-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
138    // LAMBDA-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
139    // LAMBDA-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
140    // LAMBDA-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
141    // LAMBDA-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
142    // LAMBDA-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
143    // LAMBDA-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
144    // LAMBDA-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
145    // LAMBDA-NEXT: ret void
146
147    // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
148    // LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
149    // LAMBDA: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
150    g = 1;
151    sivar = 2;
152    // LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
153    // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]],
154    // LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
155    // LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
156
157    // LAMBDA: [[SIVAR_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
158    // LAMBDA: store i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]], i{{[0-9]+}}** [[SIVAR_PRIVATE_ADDR_REF]]
159
160    // LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
161    [&]() {
162      // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
163      // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
164      g = 2;
165      sivar = 4;
166      // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
167      // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
168      // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]]
169      // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]]
170      // LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
171      // LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]]
172      // LAMBDA: store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIVAR_REF]]
173    }();
174  }
175  }();
176  return 0;
177#elif defined(BLOCKS)
178  // BLOCKS: [[G:@.+]] = {{(dso_local )?}}global i{{[0-9]+}} 1212,
179  // BLOCKS-LABEL: @main
180  // BLOCKS: call
181  // BLOCKS: call{{.*}} void {{%.+}}(i8
182  ^{
183  // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
184  // BLOCKS-NOT: = getelementptr inbounds %{{.+}},
185  // BLOCKS: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
186#pragma omp parallel private(g, sivar)
187  {
188    // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
189    // BLOCKS: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
190    // BLOCKS: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
191    g = 1;
192    sivar = 20;
193    // BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
194    // BLOCKS: store i{{[0-9]+}} 20, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]],
195    // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
196    // BLOCKS: i{{[0-9]+}}* [[G_PRIVATE_ADDR]]
197    // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
198    // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
199    // BLOCKS: i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]]
200    // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
201    // BLOCKS: call{{.*}} void {{%.+}}(i8
202    ^{
203      // BLOCKS: define {{.+}} void {{@.+}}(i8*
204      g = 2;
205      sivar = 40;
206      // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
207      // BLOCKS: store i{{[0-9]+}} 2, i{{[0-9]+}}*
208      // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
209      // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
210      // BLOCKS: store i{{[0-9]+}} 40, i{{[0-9]+}}*
211      // BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}}
212      // BLOCKS: ret
213    }();
214  }
215  }();
216  return 0;
217// BLOCKS: define {{.+}} @{{.+}}([[SS_TY]]*
218// BLOCKS: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
219// BLOCKS: store i8
220// 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
221// BLOCKS: ret
222
223// BLOCKS: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
224// BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %
225// BLOCKS: call{{.*}} void
226// BLOCKS: ret void
227
228// BLOCKS: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
229// BLOCKS: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
230// BLOCKS: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
231// BLOCKS: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
232// BLOCKS: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
233// BLOCKS: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
234// BLOCKS-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
235// BLOCKS-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
236// BLOCKS-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
237// BLOCKS-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
238// BLOCKS-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
239// BLOCKS-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
240// BLOCKS-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
241// BLOCKS-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
242// BLOCKS-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
243// BLOCKS-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
244// BLOCKS-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
245// BLOCKS-NEXT: ret void
246#else
247  S<float> test;
248  int t_var = 0;
249  int vec[] = {1, 2};
250  S<float> s_arr[] = {1, 2};
251  S<float> var(3);
252#pragma omp parallel private(t_var, vec, s_arr, var, sivar)
253  {
254    vec[0] = t_var;
255    s_arr[0] = var;
256    sivar = 3;
257  }
258  return tmain<int>();
259#endif
260}
261
262// CHECK: define i{{[0-9]+}} @main()
263// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
264// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
265// 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
266// CHECK: = call i{{.+}} [[TMAIN_INT:@.+]]()
267// CHECK: call void [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
268// CHECK: ret
269//
270// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
271// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
272// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
273// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
274// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
275// CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}},
276// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
277// CHECK-NOT: [[T_VAR_PRIV]]
278// CHECK-NOT: [[VEC_PRIV]]
279// CHECK: {{.+}}:
280// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_FLOAT_TY]]*
281// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[S_ARR_PRIV_ITEM]])
282// CHECK-NOT: [[T_VAR_PRIV]]
283// CHECK-NOT: [[VEC_PRIV]]
284// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
285// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
286// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
287// CHECK: ret void
288
289// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
290// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
291// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR:@.+]]([[S_INT_TY]]* [[TEST]])
292// 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
293// CHECK: call void [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
294// CHECK: ret
295//
296// CHECK: define {{.+}} @{{.+}}([[SS_TY]]*
297// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
298// CHECK: store i8
299// 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
300// CHECK: ret
301
302// CHECK: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
303// CHECK: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
304// CHECK: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
305// CHECK: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
306// CHECK: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
307// CHECK: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
308// CHECK-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
309// CHECK-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
310// CHECK-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
311// CHECK-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
312// CHECK-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
313// CHECK-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
314// CHECK-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
315// CHECK-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
316// CHECK-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
317// CHECK-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
318// CHECK-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
319// CHECK-NEXT: ret void
320
321// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
322// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, align 128
323// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], align 128
324// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], align 128
325// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], align 128
326// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
327// CHECK-NOT: [[T_VAR_PRIV]]
328// CHECK-NOT: [[VEC_PRIV]]
329// CHECK-NOT: [[SIVAR_PRIV]]
330// CHECK: {{.+}}:
331// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_INT_TY]]*
332// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[S_ARR_PRIV_ITEM]])
333// CHECK-NOT: [[T_VAR_PRIV]]
334// CHECK-NOT: [[VEC_PRIV]]
335// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]])
336// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
337// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]*
338// CHECK: ret void
339
340// CHECK: define {{.+}} @{{.+}}([[SST_TY]]* %
341// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
342// 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]+}}*, [[SST_TY]]*)* [[SST_MICROTASK:@.+]] to void
343// CHECK: ret
344
345// CHECK: define internal void [[SST_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SST_TY]]* %{{.+}})
346// CHECK: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
347// CHECK: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REF:%.+]],
348// CHECK-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REF]],
349// CHECK-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
350// CHECK-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
351// CHECK-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
352// CHECK-NEXT: ret void
353
354#endif
355
356