9#ifndef FORTRAN_SEMANTICS_OPENMP_DIRECTIVE_SETS_H_
10#define FORTRAN_SEMANTICS_OPENMP_DIRECTIVE_SETS_H_
12#include "flang/Common/enum-set.h"
13#include "llvm/Frontend/OpenMP/OMPConstants.h"
16 llvm::omp::Directive_enumSize>;
28static const OmpDirectiveSet topDistributeSet{
29 Directive::OMPD_distribute,
30 Directive::OMPD_distribute_parallel_do,
31 Directive::OMPD_distribute_parallel_do_simd,
32 Directive::OMPD_distribute_simd,
35static const OmpDirectiveSet allDistributeSet{
37 Directive::OMPD_target_teams_distribute,
38 Directive::OMPD_target_teams_distribute_parallel_do,
39 Directive::OMPD_target_teams_distribute_parallel_do_simd,
40 Directive::OMPD_target_teams_distribute_simd,
41 Directive::OMPD_teams_distribute,
42 Directive::OMPD_teams_distribute_parallel_do,
43 Directive::OMPD_teams_distribute_parallel_do_simd,
44 Directive::OMPD_teams_distribute_simd,
48static const OmpDirectiveSet topDoSet{
50 Directive::OMPD_do_simd,
53static const OmpDirectiveSet allDoSet{
55 Directive::OMPD_distribute_parallel_do,
56 Directive::OMPD_distribute_parallel_do_simd,
57 Directive::OMPD_parallel_do,
58 Directive::OMPD_parallel_do_simd,
59 Directive::OMPD_target_parallel_do,
60 Directive::OMPD_target_parallel_do_simd,
61 Directive::OMPD_target_teams_distribute_parallel_do,
62 Directive::OMPD_target_teams_distribute_parallel_do_simd,
63 Directive::OMPD_teams_distribute_parallel_do,
64 Directive::OMPD_teams_distribute_parallel_do_simd,
68static const OmpDirectiveSet topLoopSet{
72static const OmpDirectiveSet allLoopSet{
74 Directive::OMPD_parallel_loop,
75 Directive::OMPD_target_parallel_loop,
76 Directive::OMPD_target_teams_loop,
77 Directive::OMPD_teams_loop,
81static const OmpDirectiveSet topParallelSet{
82 Directive::OMPD_parallel,
83 Directive::OMPD_parallel_do,
84 Directive::OMPD_parallel_do_simd,
85 Directive::OMPD_parallel_loop,
86 Directive::OMPD_parallel_masked,
87 Directive::OMPD_parallel_masked_taskloop,
88 Directive::OMPD_parallel_masked_taskloop_simd,
89 Directive::OMPD_parallel_master,
90 Directive::OMPD_parallel_master_taskloop,
91 Directive::OMPD_parallel_master_taskloop_simd,
92 Directive::OMPD_parallel_sections,
93 Directive::OMPD_parallel_workshare,
96static const OmpDirectiveSet allParallelSet{
98 Directive::OMPD_distribute_parallel_do,
99 Directive::OMPD_distribute_parallel_do_simd,
100 Directive::OMPD_target_parallel,
101 Directive::OMPD_target_parallel_do,
102 Directive::OMPD_target_parallel_do_simd,
103 Directive::OMPD_target_parallel_loop,
104 Directive::OMPD_target_teams_distribute_parallel_do,
105 Directive::OMPD_target_teams_distribute_parallel_do_simd,
106 Directive::OMPD_teams_distribute_parallel_do,
107 Directive::OMPD_teams_distribute_parallel_do_simd,
111static const OmpDirectiveSet topSimdSet{
112 Directive::OMPD_simd,
115static const OmpDirectiveSet allSimdSet{
117 Directive::OMPD_distribute_parallel_do_simd,
118 Directive::OMPD_distribute_simd,
119 Directive::OMPD_do_simd,
120 Directive::OMPD_masked_taskloop_simd,
121 Directive::OMPD_master_taskloop_simd,
122 Directive::OMPD_parallel_do_simd,
123 Directive::OMPD_parallel_masked_taskloop_simd,
124 Directive::OMPD_parallel_master_taskloop_simd,
125 Directive::OMPD_target_parallel_do_simd,
126 Directive::OMPD_target_simd,
127 Directive::OMPD_target_teams_distribute_parallel_do_simd,
128 Directive::OMPD_target_teams_distribute_simd,
129 Directive::OMPD_taskloop_simd,
130 Directive::OMPD_teams_distribute_parallel_do_simd,
131 Directive::OMPD_teams_distribute_simd,
135static const OmpDirectiveSet topTargetSet{
136 Directive::OMPD_target,
137 Directive::OMPD_target_parallel,
138 Directive::OMPD_target_parallel_do,
139 Directive::OMPD_target_parallel_do_simd,
140 Directive::OMPD_target_parallel_loop,
141 Directive::OMPD_target_simd,
142 Directive::OMPD_target_teams,
143 Directive::OMPD_target_teams_distribute,
144 Directive::OMPD_target_teams_distribute_parallel_do,
145 Directive::OMPD_target_teams_distribute_parallel_do_simd,
146 Directive::OMPD_target_teams_distribute_simd,
147 Directive::OMPD_target_teams_loop,
148 Directive::OMPD_target_teams_workdistribute,
151static const OmpDirectiveSet allTargetSet{topTargetSet};
153static const OmpDirectiveSet topTaskloopSet{
154 Directive::OMPD_taskloop,
155 Directive::OMPD_taskloop_simd,
158static const OmpDirectiveSet allTaskloopSet{
160 Directive::OMPD_masked_taskloop,
161 Directive::OMPD_masked_taskloop_simd,
162 Directive::OMPD_master_taskloop,
163 Directive::OMPD_master_taskloop_simd,
164 Directive::OMPD_parallel_masked_taskloop,
165 Directive::OMPD_parallel_masked_taskloop_simd,
166 Directive::OMPD_parallel_master_taskloop,
167 Directive::OMPD_parallel_master_taskloop_simd,
171static const OmpDirectiveSet topTeamsSet{
172 Directive::OMPD_teams,
173 Directive::OMPD_teams_distribute,
174 Directive::OMPD_teams_distribute_parallel_do,
175 Directive::OMPD_teams_distribute_parallel_do_simd,
176 Directive::OMPD_teams_distribute_simd,
177 Directive::OMPD_teams_loop,
178 Directive::OMPD_teams_workdistribute,
181static const OmpDirectiveSet bottomTeamsSet{
182 Directive::OMPD_target_teams,
183 Directive::OMPD_teams,
186static const OmpDirectiveSet allTeamsSet{
188 Directive::OMPD_target_teams,
189 Directive::OMPD_target_teams_distribute,
190 Directive::OMPD_target_teams_distribute_parallel_do,
191 Directive::OMPD_target_teams_distribute_parallel_do_simd,
192 Directive::OMPD_target_teams_distribute_simd,
193 Directive::OMPD_target_teams_loop,
194 Directive::OMPD_target_teams_workdistribute,
203static const OmpDirectiveSet allDistributeParallelDoSet{
204 allDistributeSet & allParallelSet & allDoSet};
205static const OmpDirectiveSet allDistributeParallelDoSimdSet{
206 allDistributeSet & allParallelSet & allDoSet & allSimdSet};
207static const OmpDirectiveSet allDistributeSimdSet{
208 allDistributeSet & allSimdSet};
209static const OmpDirectiveSet allDoSimdSet{allDoSet & allSimdSet};
210static const OmpDirectiveSet allTaskloopSimdSet{allTaskloopSet & allSimdSet};
212static const OmpDirectiveSet compositeConstructSet{
213 Directive::OMPD_distribute_parallel_do,
214 Directive::OMPD_distribute_parallel_do_simd,
215 Directive::OMPD_distribute_simd,
216 Directive::OMPD_do_simd,
217 Directive::OMPD_taskloop_simd,
220static const OmpDirectiveSet blockConstructSet{
221 Directive::OMPD_masked,
222 Directive::OMPD_master,
223 Directive::OMPD_ordered,
224 Directive::OMPD_parallel,
225 Directive::OMPD_parallel_masked,
226 Directive::OMPD_parallel_master,
227 Directive::OMPD_parallel_workshare,
228 Directive::OMPD_scope,
229 Directive::OMPD_single,
230 Directive::OMPD_target,
231 Directive::OMPD_target_data,
232 Directive::OMPD_target_parallel,
233 Directive::OMPD_target_teams,
234 Directive::OMPD_task,
235 Directive::OMPD_taskgroup,
236 Directive::OMPD_teams,
237 Directive::OMPD_workshare,
238 Directive::OMPD_target_teams_workdistribute,
239 Directive::OMPD_teams_workdistribute,
240 Directive::OMPD_workdistribute,
243static const OmpDirectiveSet loopConstructSet{
244 Directive::OMPD_distribute,
245 Directive::OMPD_distribute_parallel_do,
246 Directive::OMPD_distribute_parallel_do_simd,
247 Directive::OMPD_distribute_simd,
249 Directive::OMPD_do_simd,
250 Directive::OMPD_loop,
251 Directive::OMPD_masked_taskloop,
252 Directive::OMPD_masked_taskloop_simd,
253 Directive::OMPD_master_taskloop,
254 Directive::OMPD_master_taskloop_simd,
255 Directive::OMPD_parallel_do,
256 Directive::OMPD_parallel_do_simd,
257 Directive::OMPD_parallel_loop,
258 Directive::OMPD_parallel_masked_taskloop,
259 Directive::OMPD_parallel_masked_taskloop_simd,
260 Directive::OMPD_parallel_master_taskloop,
261 Directive::OMPD_parallel_master_taskloop_simd,
262 Directive::OMPD_simd,
263 Directive::OMPD_target_loop,
264 Directive::OMPD_target_parallel_do,
265 Directive::OMPD_target_parallel_do_simd,
266 Directive::OMPD_target_parallel_loop,
267 Directive::OMPD_target_simd,
268 Directive::OMPD_target_teams_distribute,
269 Directive::OMPD_target_teams_distribute_parallel_do,
270 Directive::OMPD_target_teams_distribute_parallel_do_simd,
271 Directive::OMPD_target_teams_distribute_simd,
272 Directive::OMPD_target_teams_loop,
273 Directive::OMPD_taskloop,
274 Directive::OMPD_taskloop_simd,
275 Directive::OMPD_teams_distribute,
276 Directive::OMPD_teams_distribute_parallel_do,
277 Directive::OMPD_teams_distribute_parallel_do_simd,
278 Directive::OMPD_teams_distribute_simd,
279 Directive::OMPD_teams_loop,
280 Directive::OMPD_fuse,
281 Directive::OMPD_tile,
282 Directive::OMPD_unroll,
283 Directive::OMPD_interchange,
286static const OmpDirectiveSet loopTransformationSet{
287 Directive::OMPD_tile,
288 Directive::OMPD_unroll,
289 Directive::OMPD_fuse,
290 Directive::OMPD_interchange,
293static const OmpDirectiveSet nonPartialVarSet{
294 Directive::OMPD_allocate,
295 Directive::OMPD_allocators,
296 Directive::OMPD_threadprivate,
297 Directive::OMPD_declare_target,
300static const OmpDirectiveSet taskGeneratingSet{
302 Directive::OMPD_task,
306static const OmpDirectiveSet workShareSet{
308 Directive::OMPD_workshare,
309 Directive::OMPD_parallel_workshare,
310 Directive::OMPD_parallel_sections,
311 Directive::OMPD_scope,
312 Directive::OMPD_sections,
313 Directive::OMPD_single,
321static const OmpDirectiveSet scanParentAllowedSet{allDoSet | allSimdSet};
327static const OmpDirectiveSet nestedBarrierErrSet{
329 Directive::OMPD_atomic,
330 Directive::OMPD_critical,
331 Directive::OMPD_master,
332 Directive::OMPD_ordered,
333 } | taskGeneratingSet |
337static const OmpDirectiveSet nestedCancelDoAllowedSet{
338 Directive::OMPD_distribute_parallel_do,
340 Directive::OMPD_parallel_do,
341 Directive::OMPD_target_parallel_do,
342 Directive::OMPD_target_teams_distribute_parallel_do,
343 Directive::OMPD_teams_distribute_parallel_do,
346static const OmpDirectiveSet nestedCancelParallelAllowedSet{
347 Directive::OMPD_parallel,
348 Directive::OMPD_target_parallel,
351static const OmpDirectiveSet nestedCancelSectionsAllowedSet{
352 Directive::OMPD_parallel_sections,
353 Directive::OMPD_sections,
356static const OmpDirectiveSet nestedCancelTaskgroupAllowedSet{
357 Directive::OMPD_task,
358 Directive::OMPD_taskloop,
361static const OmpDirectiveSet nestedMasterErrSet{
363 Directive::OMPD_atomic,
364 } | taskGeneratingSet |
368static const OmpDirectiveSet nestedOrderedDoAllowedSet{
370 Directive::OMPD_parallel_do,
371 Directive::OMPD_target_parallel_do,
374static const OmpDirectiveSet nestedOrderedErrSet{
375 Directive::OMPD_atomic,
376 Directive::OMPD_critical,
377 Directive::OMPD_ordered,
378 Directive::OMPD_task,
379 Directive::OMPD_taskloop,
382static const OmpDirectiveSet nestedOrderedParallelErrSet{
383 Directive::OMPD_parallel,
384 Directive::OMPD_parallel_sections,
385 Directive::OMPD_parallel_workshare,
386 Directive::OMPD_target_parallel,
389static const OmpDirectiveSet nestedReduceWorkshareAllowedSet{
391 Directive::OMPD_do_simd,
392 Directive::OMPD_sections,
395static const OmpDirectiveSet nestedTeamsAllowedSet{
396 Directive::OMPD_workdistribute,
397 Directive::OMPD_distribute,
398 Directive::OMPD_distribute_parallel_do,
399 Directive::OMPD_distribute_parallel_do_simd,
400 Directive::OMPD_distribute_simd,
401 Directive::OMPD_loop,
402 Directive::OMPD_parallel,
403 Directive::OMPD_parallel_do,
404 Directive::OMPD_parallel_do_simd,
405 Directive::OMPD_parallel_master,
406 Directive::OMPD_parallel_master_taskloop,
407 Directive::OMPD_parallel_master_taskloop_simd,
408 Directive::OMPD_parallel_sections,
409 Directive::OMPD_parallel_workshare,
412static const OmpDirectiveSet nestedWorkshareErrSet{
414 Directive::OMPD_atomic,
415 Directive::OMPD_critical,
416 Directive::OMPD_master,
417 Directive::OMPD_ordered,
418 Directive::OMPD_task,
419 Directive::OMPD_taskloop,
428static const OmpDirectiveSet simpleStandaloneNonSimdOnlySet{
429 Directive::OMPD_taskyield,
430 Directive::OMPD_barrier,
431 Directive::OMPD_ordered,
432 Directive::OMPD_target_enter_data,
433 Directive::OMPD_target_exit_data,
434 Directive::OMPD_target_update,
435 Directive::OMPD_taskwait,