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 |
16 | template <class T> |
17 | struct S { |
18 | T f; |
19 | S(T a) : f(a) {} |
20 | S() : f() {} |
21 | operator T() { return T(); } |
22 | ~S() {} |
23 | }; |
24 | |
25 | volatile int g __attribute__((aligned(128))) = 1212; |
26 | |
27 | struct 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 | |
53 | template<typename T> |
54 | struct 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]+}} } |
86 | template <typename T> |
87 | T 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 | |
102 | int 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 | |