1 // Test target codegen - host bc file has to be created first.
2 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
3 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s
4 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
5 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s
6 // RUN: %clang_cc1 -verify -fopenmp -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s
7 // expected-no-diagnostics
8 #ifndef HEADER
9 #define HEADER
10 
11 // CHECK-NOT: @__omp_offloading_{{.+}}_exec_mode = weak constant i8 1
12 // CHECK-DAG: [[DISTR_LIGHT:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2050, i32 3, i32 0, i8* getelementptr inbounds
13 // CHECK-DAG: [[FOR_LIGHT:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 3, i32 0, i8* getelementptr inbounds
14 // CHECK-DAG: [[LIGHT:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 3, i32 0, i8* getelementptr inbounds
15 // CHECK-DAG: [[DISTR_FULL:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2050, i32 1, i32 0, i8* getelementptr inbounds
16 // CHECK-DAG: [[FULL:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 1, i32 0, i8* getelementptr inbounds
17 // CHECK-DAG: [[BAR_LIGHT:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 66, i32 3, i32 0, i8* getelementptr inbounds
18 // CHECK-DAG: [[BAR_FULL:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 66, i32 1, i32 0, i8* getelementptr inbounds
19 // CHECK-NOT: @__omp_offloading_{{.+}}_exec_mode = weak constant i8 1
20 
21 void foo() {
22 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
23 // CHECK-DAG: [[DISTR_LIGHT]]
24 // CHECK-DAG: [[FOR_LIGHT]]
25 // CHECK-DAG: [[LIGHT]]
26 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
27 // CHECK-DAG: [[DISTR_LIGHT]]
28 // CHECK-DAG: [[FOR_LIGHT]]
29 // CHECK-DAG: [[LIGHT]]
30 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
31 // CHECK-DAG: [[DISTR_LIGHT]]
32 // CHECK-DAG: [[FOR_LIGHT]]
33 // CHECK-DAG: [[LIGHT]]
34 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
35 // CHECK-DAG: [[DISTR_FULL]]
36 // CHECK-DAG: [[FULL]]
37 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
38 // CHECK-DAG: [[DISTR_FULL]]
39 // CHECK-DAG: [[FULL]]
40 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
41 // CHECK-DAG: [[DISTR_FULL]]
42 // CHECK-DAG: [[FULL]]
43 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
44 // CHECK-DAG: [[DISTR_FULL]]
45 // CHECK-DAG: [[FULL]]
46 #pragma omp target teams distribute parallel for simd
47   for (int i = 0; i < 10; ++i)
48     ;
49 #pragma omp target teams distribute parallel for simd schedule(static)
50   for (int i = 0; i < 10; ++i)
51     ;
52 #pragma omp target teams distribute parallel for simd schedule(static, 1)
53   for (int i = 0; i < 10; ++i)
54     ;
55 #pragma omp target teams distribute parallel for simd schedule(auto)
56   for (int i = 0; i < 10; ++i)
57     ;
58 #pragma omp target teams distribute parallel for simd schedule(runtime)
59   for (int i = 0; i < 10; ++i)
60     ;
61 #pragma omp target teams distribute parallel for simd schedule(dynamic)
62   for (int i = 0; i < 10; ++i)
63     ;
64 #pragma omp target teams distribute parallel for simd schedule(guided)
65   for (int i = 0; i < 10; ++i)
66     ;
67 int a;
68 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
69 // CHECK-DAG: [[DISTR_LIGHT]]
70 // CHECK-DAG: [[FOR_LIGHT]]
71 // CHECK-DAG: [[LIGHT]]
72 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
73 // CHECK-DAG: [[DISTR_LIGHT]]
74 // CHECK-DAG: [[FOR_LIGHT]]
75 // CHECK-DAG: [[LIGHT]]
76 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
77 // CHECK-DAG: [[DISTR_LIGHT]]
78 // CHECK-DAG: [[FOR_LIGHT]]
79 // CHECK-DAG: [[LIGHT]]
80 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
81 // CHECK-DAG: [[DISTR_FULL]]
82 // CHECK-DAG: [[FULL]]
83 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
84 // CHECK-DAG: [[DISTR_FULL]]
85 // CHECK-DAG: [[FULL]]
86 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
87 // CHECK-DAG: [[DISTR_FULL]]
88 // CHECK-DAG: [[FULL]]
89 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
90 // CHECK-DAG: [[DISTR_FULL]]
91 // CHECK-DAG: [[FULL]]
92 #pragma omp target teams distribute parallel for lastprivate(a)
93   for (int i = 0; i < 10; ++i)
94     a = i;
95 #pragma omp target teams distribute parallel for schedule(static)
96   for (int i = 0; i < 10; ++i)
97     ;
98 #pragma omp target teams distribute parallel for schedule(static, 1)
99   for (int i = 0; i < 10; ++i)
100     ;
101 #pragma omp target teams distribute parallel for schedule(auto)
102   for (int i = 0; i < 10; ++i)
103     ;
104 #pragma omp target teams distribute parallel for schedule(runtime)
105   for (int i = 0; i < 10; ++i)
106     ;
107 #pragma omp target teams distribute parallel for schedule(dynamic)
108   for (int i = 0; i < 10; ++i)
109     ;
110 #pragma omp target teams distribute parallel for schedule(guided)
111   for (int i = 0; i < 10; ++i)
112     ;
113 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
114 // CHECK-DAG: [[DISTR_LIGHT]]
115 // CHECK-DAG: [[FOR_LIGHT]]
116 // CHECK-DAG: [[LIGHT]]
117 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
118 // CHECK-DAG: [[DISTR_LIGHT]]
119 // CHECK-DAG: [[FOR_LIGHT]]
120 // CHECK-DAG: [[LIGHT]]
121 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
122 // CHECK-DAG: [[DISTR_LIGHT]]
123 // CHECK-DAG: [[FOR_LIGHT]]
124 // CHECK-DAG: [[LIGHT]]
125 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
126 // CHECK-DAG: [[DISTR_FULL]]
127 // CHECK-DAG: [[FULL]]
128 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
129 // CHECK-DAG: [[DISTR_FULL]]
130 // CHECK-DAG: [[FULL]]
131 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
132 // CHECK-DAG: [[DISTR_FULL]]
133 // CHECK-DAG: [[FULL]]
134 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
135 // CHECK-DAG: [[DISTR_FULL]]
136 // CHECK-DAG: [[FULL]]
137 #pragma omp target teams
138    {
139      int b;
140 #pragma omp distribute parallel for simd
141   for (int i = 0; i < 10; ++i)
142     ;
143   ;
144    }
145 #pragma omp target teams
146    {
147      int b[] = {2, 3, sizeof(int)};
148 #pragma omp distribute parallel for simd schedule(static)
149   for (int i = 0; i < 10; ++i)
150     ;
151    }
152 #pragma omp target teams
153    {
154      int b;
155 #pragma omp distribute parallel for simd schedule(static, 1)
156   for (int i = 0; i < 10; ++i)
157     ;
158   int &c = b;
159    }
160 #pragma omp target teams
161 #pragma omp distribute parallel for simd schedule(auto)
162   for (int i = 0; i < 10; ++i)
163     ;
164 #pragma omp target teams
165 #pragma omp distribute parallel for simd schedule(runtime)
166   for (int i = 0; i < 10; ++i)
167     ;
168 #pragma omp target teams
169 #pragma omp distribute parallel for simd schedule(dynamic)
170   for (int i = 0; i < 10; ++i)
171     ;
172 #pragma omp target teams
173 #pragma omp distribute parallel for simd schedule(guided)
174   for (int i = 0; i < 10; ++i)
175     ;
176 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
177 // CHECK-DAG: [[DISTR_LIGHT]]
178 // CHECK-DAG: [[FOR_LIGHT]]
179 // CHECK-DAG: [[LIGHT]]
180 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
181 // CHECK-DAG: [[DISTR_LIGHT]]
182 // CHECK-DAG: [[FOR_LIGHT]]
183 // CHECK-DAG: [[LIGHT]]
184 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
185 // CHECK-DAG: [[DISTR_LIGHT]]
186 // CHECK-DAG: [[FOR_LIGHT]]
187 // CHECK-DAG: [[LIGHT]]
188 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
189 // CHECK-DAG: [[DISTR_FULL]]
190 // CHECK-DAG: [[FULL]]
191 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
192 // CHECK-DAG: [[DISTR_FULL]]
193 // CHECK-DAG: [[FULL]]
194 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
195 // CHECK-DAG: [[DISTR_FULL]]
196 // CHECK-DAG: [[FULL]]
197 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
198 // CHECK-DAG: [[DISTR_FULL]]
199 // CHECK-DAG: [[FULL]]
200 #pragma omp target teams
201 #pragma omp distribute parallel for
202   for (int i = 0; i < 10; ++i)
203     ;
204 #pragma omp target teams
205 #pragma omp distribute parallel for schedule(static)
206   for (int i = 0; i < 10; ++i)
207     ;
208 #pragma omp target teams
209 #pragma omp distribute parallel for schedule(static, 1)
210   for (int i = 0; i < 10; ++i)
211     ;
212 #pragma omp target teams
213 #pragma omp distribute parallel for schedule(auto)
214   for (int i = 0; i < 10; ++i)
215     ;
216 #pragma omp target teams
217 #pragma omp distribute parallel for schedule(runtime)
218   for (int i = 0; i < 10; ++i)
219     ;
220 #pragma omp target teams
221 #pragma omp distribute parallel for schedule(dynamic)
222   for (int i = 0; i < 10; ++i)
223     ;
224 #pragma omp target teams
225 #pragma omp distribute parallel for schedule(guided)
226   for (int i = 0; i < 10; ++i)
227     ;
228 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
229 // CHECK-DAG: [[DISTR_LIGHT]]
230 // CHECK-DAG: [[FOR_LIGHT]]
231 // CHECK-DAG: [[LIGHT]]
232 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
233 // CHECK-DAG: [[DISTR_LIGHT]]
234 // CHECK-DAG: [[FOR_LIGHT]]
235 // CHECK-DAG: [[LIGHT]]
236 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
237 // CHECK-DAG: [[DISTR_LIGHT]]
238 // CHECK-DAG: [[FOR_LIGHT]]
239 // CHECK-DAG: [[LIGHT]]
240 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
241 // CHECK-DAG: [[DISTR_FULL]]
242 // CHECK-DAG: [[FULL]]
243 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
244 // CHECK-DAG: [[DISTR_FULL]]
245 // CHECK-DAG: [[FULL]]
246 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
247 // CHECK-DAG: [[DISTR_FULL]]
248 // CHECK-DAG: [[FULL]]
249 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
250 // CHECK-DAG: [[DISTR_FULL]]
251 // CHECK-DAG: [[FULL]]
252 #pragma omp target
253 #pragma omp teams
254 #pragma omp distribute parallel for
255   for (int i = 0; i < 10; ++i)
256     ;
257 #pragma omp target
258 #pragma omp teams
259 #pragma omp distribute parallel for schedule(static)
260   for (int i = 0; i < 10; ++i)
261     ;
262 #pragma omp target
263 #pragma omp teams
264 #pragma omp distribute parallel for schedule(static, 1)
265   for (int i = 0; i < 10; ++i)
266     ;
267 #pragma omp target
268 #pragma omp teams
269 #pragma omp distribute parallel for schedule(auto)
270   for (int i = 0; i < 10; ++i)
271     ;
272 #pragma omp target
273 #pragma omp teams
274 #pragma omp distribute parallel for schedule(runtime)
275   for (int i = 0; i < 10; ++i)
276     ;
277 #pragma omp target
278 #pragma omp teams
279 #pragma omp distribute parallel for schedule(dynamic)
280   for (int i = 0; i < 10; ++i)
281     ;
282 #pragma omp target
283 #pragma omp teams
284 #pragma omp distribute parallel for schedule(guided)
285   for (int i = 0; i < 10; ++i)
286     ;
287 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
288 // CHECK-DAG: [[FOR_LIGHT]]
289 // CHECK-DAG: [[LIGHT]]
290 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
291 // CHECK-DAG: [[FOR_LIGHT]]
292 // CHECK-DAG: [[LIGHT]]
293 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
294 // CHECK-DAG: [[FOR_LIGHT]]
295 // CHECK-DAG: [[LIGHT]]
296 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
297 // CHECK-DAG: [[FULL]]
298 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
299 // CHECK-DAG: [[FULL]]
300 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
301 // CHECK-DAG: [[FULL]]
302 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
303 // CHECK-DAG: [[FULL]]
304 #pragma omp target parallel for
305   for (int i = 0; i < 10; ++i)
306     ;
307 #pragma omp target parallel for schedule(static)
308   for (int i = 0; i < 10; ++i)
309     ;
310 #pragma omp target parallel for schedule(static, 1)
311   for (int i = 0; i < 10; ++i)
312     ;
313 #pragma omp target parallel for schedule(auto)
314   for (int i = 0; i < 10; ++i)
315     ;
316 #pragma omp target parallel for schedule(runtime)
317   for (int i = 0; i < 10; ++i)
318     ;
319 #pragma omp target parallel for schedule(dynamic)
320   for (int i = 0; i < 10; ++i)
321     ;
322 #pragma omp target parallel for schedule(guided)
323   for (int i = 0; i < 10; ++i)
324     ;
325 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
326 // CHECK-DAG: [[FOR_LIGHT]]
327 // CHECK-DAG: [[LIGHT]]
328 // CHECK-DAG: [[BAR_LIGHT]]
329 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
330 // CHECK-DAG: [[FOR_LIGHT]]
331 // CHECK-DAG: [[LIGHT]]
332 // CHECK-DAG: [[BAR_LIGHT]]
333 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
334 // CHECK-DAG: [[FOR_LIGHT]]
335 // CHECK-DAG: [[LIGHT]]
336 // CHECK-DAG: [[BAR_LIGHT]]
337 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
338 // CHECK-DAG: [[FULL]]
339 // CHECK-DAG: [[BAR_FULL]]
340 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
341 // CHECK-DAG: [[FULL]]
342 // CHECK-DAG: [[BAR_FULL]]
343 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
344 // CHECK-DAG: [[FULL]]
345 // CHECK-DAG: [[BAR_FULL]]
346 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
347 // CHECK-DAG: [[FULL]]
348 // CHECK-DAG: [[BAR_FULL]]
349 #pragma omp target parallel
350 #pragma omp for simd
351   for (int i = 0; i < 10; ++i)
352     ;
353 #pragma omp target parallel
354 #pragma omp for simd schedule(static)
355   for (int i = 0; i < 10; ++i)
356     ;
357 #pragma omp target parallel
358 #pragma omp for simd schedule(static, 1)
359   for (int i = 0; i < 10; ++i)
360     ;
361 #pragma omp target parallel
362 #pragma omp for simd schedule(auto)
363   for (int i = 0; i < 10; ++i)
364     ;
365 #pragma omp target parallel
366 #pragma omp for simd schedule(runtime)
367   for (int i = 0; i < 10; ++i)
368     ;
369 #pragma omp target parallel
370 #pragma omp for simd schedule(dynamic)
371   for (int i = 0; i < 10; ++i)
372     ;
373 #pragma omp target parallel
374 #pragma omp for simd schedule(guided)
375   for (int i = 0; i < 10; ++i)
376     ;
377 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
378 // CHECK-DAG: [[FULL]]
379 // CHECK-DAG: [[BAR_FULL]]
380 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
381 // CHECK-DAG: [[FOR_LIGHT]]
382 // CHECK-DAG: [[LIGHT]]
383 // CHECK-DAG: [[BAR_LIGHT]]
384 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
385 // CHECK-DAG: [[FOR_LIGHT]]
386 // CHECK-DAG: [[LIGHT]]
387 // CHECK-DAG: [[BAR_LIGHT]]
388 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
389 // CHECK-DAG: [[FULL]]
390 // CHECK-DAG: [[BAR_FULL]]
391 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
392 // CHECK-DAG: [[FULL]]
393 // CHECK-DAG: [[BAR_FULL]]
394 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
395 // CHECK-DAG: [[FULL]]
396 // CHECK-DAG: [[BAR_FULL]]
397 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
398 // CHECK-DAG: [[FULL]]
399 // CHECK-DAG: [[BAR_FULL]]
400 #pragma omp target
401 #pragma omp parallel
402 #pragma omp for simd ordered
403   for (int i = 0; i < 10; ++i)
404     ;
405 #pragma omp target
406 #pragma omp parallel
407 #pragma omp for simd schedule(static)
408   for (int i = 0; i < 10; ++i)
409     ;
410 #pragma omp target
411 #pragma omp parallel
412 #pragma omp for simd schedule(static, 1)
413   for (int i = 0; i < 10; ++i)
414     ;
415 #pragma omp target
416 #pragma omp parallel
417 #pragma omp for simd schedule(auto)
418   for (int i = 0; i < 10; ++i)
419     ;
420 #pragma omp target
421 #pragma omp parallel
422 #pragma omp for simd schedule(runtime)
423   for (int i = 0; i < 10; ++i)
424     ;
425 #pragma omp target
426 #pragma omp parallel
427 #pragma omp for simd schedule(dynamic)
428   for (int i = 0; i < 10; ++i)
429     ;
430 #pragma omp target
431 #pragma omp parallel
432 #pragma omp for simd schedule(guided)
433   for (int i = 0; i < 10; ++i)
434     ;
435 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
436 // CHECK-DAG: [[FOR_LIGHT]]
437 // CHECK-DAG: [[LIGHT]]
438 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
439 // CHECK-DAG: [[FOR_LIGHT]]
440 // CHECK-DAG: [[LIGHT]]
441 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 0, i16 0)
442 // CHECK-DAG: [[FOR_LIGHT]]
443 // CHECK-DAG: [[LIGHT]]
444 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
445 // CHECK-DAG: [[FULL]]
446 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
447 // CHECK-DAG: [[FULL]]
448 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
449 // CHECK-DAG: [[FULL]]
450 // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 {{.+}})
451 // CHECK-DAG: [[FULL]]
452 #pragma omp target
453 #pragma omp parallel for
454   for (int i = 0; i < 10; ++i)
455     ;
456 #pragma omp target
457 #pragma omp parallel for schedule(static)
458   for (int i = 0; i < 10; ++i)
459     ;
460 #pragma omp target
461 #pragma omp parallel for schedule(static, 1)
462   for (int i = 0; i < 10; ++i)
463     ;
464 #pragma omp target
465 #pragma omp parallel for schedule(auto)
466   for (int i = 0; i < 10; ++i)
467     ;
468 #pragma omp target
469 #pragma omp parallel for schedule(runtime)
470   for (int i = 0; i < 10; ++i)
471     ;
472 #pragma omp target
473 #pragma omp parallel for schedule(dynamic)
474   for (int i = 0; i < 10; ++i)
475     ;
476 #pragma omp target
477 #pragma omp parallel for schedule(guided)
478   for (int i = 0; i < 10; ++i)
479     ;
480 }
481 
482 #endif
483 
484