FLANG
openmp-directive-sets.h
1//===-- include/flang/Semantics/openmp-directive-sets.h ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef FORTRAN_SEMANTICS_OPENMP_DIRECTIVE_SETS_H_
10#define FORTRAN_SEMANTICS_OPENMP_DIRECTIVE_SETS_H_
11
12#include "llvm/Frontend/OpenMP/OMP.h"
13
14namespace llvm::omp {
15//===----------------------------------------------------------------------===//
16// Directive sets for single directives
17//===----------------------------------------------------------------------===//
18// - top<Directive>Set: The directive appears alone or as the first in a
19// compound construct.
20// - bottom<Directive>Set: The directive appears alone or as the last in a
21// compound construct.
22// - all<Directive>Set: All standalone or compound uses of the directive.
23
24static const llvm::omp::Directives topDistributeSet{
25 Directive::OMPD_distribute,
26 Directive::OMPD_distribute_parallel_do,
27 Directive::OMPD_distribute_parallel_do_simd,
28 Directive::OMPD_distribute_simd,
29};
30
31static const llvm::omp::Directives allDistributeSet{
32 llvm::omp::Directives{
33 Directive::OMPD_target_teams_distribute,
34 Directive::OMPD_target_teams_distribute_parallel_do,
35 Directive::OMPD_target_teams_distribute_parallel_do_simd,
36 Directive::OMPD_target_teams_distribute_simd,
37 Directive::OMPD_teams_distribute,
38 Directive::OMPD_teams_distribute_parallel_do,
39 Directive::OMPD_teams_distribute_parallel_do_simd,
40 Directive::OMPD_teams_distribute_simd,
41 } | topDistributeSet,
42};
43
44static const llvm::omp::Directives topDoSet{
45 Directive::OMPD_do,
46 Directive::OMPD_do_simd,
47};
48
49static const llvm::omp::Directives allDoSet{
50 llvm::omp::Directives{
51 Directive::OMPD_distribute_parallel_do,
52 Directive::OMPD_distribute_parallel_do_simd,
53 Directive::OMPD_parallel_do,
54 Directive::OMPD_parallel_do_simd,
55 Directive::OMPD_target_parallel_do,
56 Directive::OMPD_target_parallel_do_simd,
57 Directive::OMPD_target_teams_distribute_parallel_do,
58 Directive::OMPD_target_teams_distribute_parallel_do_simd,
59 Directive::OMPD_teams_distribute_parallel_do,
60 Directive::OMPD_teams_distribute_parallel_do_simd,
61 } | topDoSet,
62};
63
64static const llvm::omp::Directives topLoopSet{
65 Directive::OMPD_loop,
66};
67
68static const llvm::omp::Directives allLoopSet{
69 llvm::omp::Directives{
70 Directive::OMPD_parallel_loop,
71 Directive::OMPD_target_parallel_loop,
72 Directive::OMPD_target_teams_loop,
73 Directive::OMPD_teams_loop,
74 } | topLoopSet,
75};
76
77static const llvm::omp::Directives topParallelSet{
78 Directive::OMPD_parallel,
79 Directive::OMPD_parallel_do,
80 Directive::OMPD_parallel_do_simd,
81 Directive::OMPD_parallel_loop,
82 Directive::OMPD_parallel_masked,
83 Directive::OMPD_parallel_masked_taskloop,
84 Directive::OMPD_parallel_masked_taskloop_simd,
85 Directive::OMPD_parallel_master,
86 Directive::OMPD_parallel_master_taskloop,
87 Directive::OMPD_parallel_master_taskloop_simd,
88 Directive::OMPD_parallel_sections,
89 Directive::OMPD_parallel_workshare,
90};
91
92static const llvm::omp::Directives allParallelSet{
93 llvm::omp::Directives{
94 Directive::OMPD_distribute_parallel_do,
95 Directive::OMPD_distribute_parallel_do_simd,
96 Directive::OMPD_target_parallel,
97 Directive::OMPD_target_parallel_do,
98 Directive::OMPD_target_parallel_do_simd,
99 Directive::OMPD_target_parallel_loop,
100 Directive::OMPD_target_teams_distribute_parallel_do,
101 Directive::OMPD_target_teams_distribute_parallel_do_simd,
102 Directive::OMPD_teams_distribute_parallel_do,
103 Directive::OMPD_teams_distribute_parallel_do_simd,
104 } | topParallelSet,
105};
106
107static const llvm::omp::Directives topSimdSet{
108 Directive::OMPD_simd,
109};
110
111static const llvm::omp::Directives allSimdSet{
112 llvm::omp::Directives{
113 Directive::OMPD_distribute_parallel_do_simd,
114 Directive::OMPD_distribute_simd,
115 Directive::OMPD_do_simd,
116 Directive::OMPD_masked_taskloop_simd,
117 Directive::OMPD_master_taskloop_simd,
118 Directive::OMPD_parallel_do_simd,
119 Directive::OMPD_parallel_masked_taskloop_simd,
120 Directive::OMPD_parallel_master_taskloop_simd,
121 Directive::OMPD_target_parallel_do_simd,
122 Directive::OMPD_target_simd,
123 Directive::OMPD_target_teams_distribute_parallel_do_simd,
124 Directive::OMPD_target_teams_distribute_simd,
125 Directive::OMPD_taskloop_simd,
126 Directive::OMPD_teams_distribute_parallel_do_simd,
127 Directive::OMPD_teams_distribute_simd,
128 } | topSimdSet,
129};
130
131static const llvm::omp::Directives topTargetSet{
132 Directive::OMPD_target,
133 Directive::OMPD_target_parallel,
134 Directive::OMPD_target_parallel_do,
135 Directive::OMPD_target_parallel_do_simd,
136 Directive::OMPD_target_parallel_loop,
137 Directive::OMPD_target_simd,
138 Directive::OMPD_target_teams,
139 Directive::OMPD_target_teams_distribute,
140 Directive::OMPD_target_teams_distribute_parallel_do,
141 Directive::OMPD_target_teams_distribute_parallel_do_simd,
142 Directive::OMPD_target_teams_distribute_simd,
143 Directive::OMPD_target_teams_loop,
144 Directive::OMPD_target_teams_workdistribute,
145};
146
147static const llvm::omp::Directives allTargetSet{topTargetSet};
148
149static const llvm::omp::Directives topTaskloopSet{
150 Directive::OMPD_taskloop,
151 Directive::OMPD_taskloop_simd,
152};
153
154static const llvm::omp::Directives allTaskloopSet{
155 llvm::omp::Directives{
156 Directive::OMPD_masked_taskloop,
157 Directive::OMPD_masked_taskloop_simd,
158 Directive::OMPD_master_taskloop,
159 Directive::OMPD_master_taskloop_simd,
160 Directive::OMPD_parallel_masked_taskloop,
161 Directive::OMPD_parallel_masked_taskloop_simd,
162 Directive::OMPD_parallel_master_taskloop,
163 Directive::OMPD_parallel_master_taskloop_simd,
164 } | topTaskloopSet,
165};
166
167static const llvm::omp::Directives topTeamsSet{
168 Directive::OMPD_teams,
169 Directive::OMPD_teams_distribute,
170 Directive::OMPD_teams_distribute_parallel_do,
171 Directive::OMPD_teams_distribute_parallel_do_simd,
172 Directive::OMPD_teams_distribute_simd,
173 Directive::OMPD_teams_loop,
174 Directive::OMPD_teams_workdistribute,
175};
176
177static const llvm::omp::Directives bottomTeamsSet{
178 Directive::OMPD_target_teams,
179 Directive::OMPD_teams,
180};
181
182static const llvm::omp::Directives allTeamsSet{
183 llvm::omp::Directives{
184 Directive::OMPD_target_teams,
185 Directive::OMPD_target_teams_distribute,
186 Directive::OMPD_target_teams_distribute_parallel_do,
187 Directive::OMPD_target_teams_distribute_parallel_do_simd,
188 Directive::OMPD_target_teams_distribute_simd,
189 Directive::OMPD_target_teams_loop,
190 Directive::OMPD_target_teams_workdistribute,
191 } | topTeamsSet,
192};
193
194//===----------------------------------------------------------------------===//
195// Directive sets for groups of multiple directives
196//===----------------------------------------------------------------------===//
197
198// Composite constructs
199static const llvm::omp::Directives allDistributeParallelDoSet{
200 allDistributeSet & allParallelSet & allDoSet};
201static const llvm::omp::Directives allDistributeParallelDoSimdSet{
202 allDistributeSet & allParallelSet & allDoSet & allSimdSet};
203static const llvm::omp::Directives allDistributeSimdSet{
204 allDistributeSet & allSimdSet};
205static const llvm::omp::Directives allDoSimdSet{allDoSet & allSimdSet};
206static const llvm::omp::Directives allTaskloopSimdSet{
207 allTaskloopSet & allSimdSet};
208
209static const llvm::omp::Directives compositeConstructSet{
210 Directive::OMPD_distribute_parallel_do,
211 Directive::OMPD_distribute_parallel_do_simd,
212 Directive::OMPD_distribute_simd,
213 Directive::OMPD_do_simd,
214 Directive::OMPD_taskloop_simd,
215};
216
217static const llvm::omp::Directives blockConstructSet{
218 Directive::OMPD_masked,
219 Directive::OMPD_master,
220 Directive::OMPD_ordered_blockassoc,
221 Directive::OMPD_parallel,
222 Directive::OMPD_parallel_masked,
223 Directive::OMPD_parallel_master,
224 Directive::OMPD_parallel_workshare,
225 Directive::OMPD_scope,
226 Directive::OMPD_single,
227 Directive::OMPD_target,
228 Directive::OMPD_target_data,
229 Directive::OMPD_target_parallel,
230 Directive::OMPD_target_teams,
231 Directive::OMPD_task,
232 Directive::OMPD_taskgroup,
233 Directive::OMPD_teams,
234 Directive::OMPD_workshare,
235 Directive::OMPD_target_teams_workdistribute,
236 Directive::OMPD_teams_workdistribute,
237 Directive::OMPD_workdistribute,
238};
239
240static const llvm::omp::Directives loopConstructSet{
241 Directive::OMPD_distribute,
242 Directive::OMPD_distribute_parallel_do,
243 Directive::OMPD_distribute_parallel_do_simd,
244 Directive::OMPD_distribute_simd,
245 Directive::OMPD_do,
246 Directive::OMPD_do_simd,
247 Directive::OMPD_loop,
248 Directive::OMPD_masked_taskloop,
249 Directive::OMPD_masked_taskloop_simd,
250 Directive::OMPD_master_taskloop,
251 Directive::OMPD_master_taskloop_simd,
252 Directive::OMPD_parallel_do,
253 Directive::OMPD_parallel_do_simd,
254 Directive::OMPD_parallel_loop,
255 Directive::OMPD_parallel_masked_taskloop,
256 Directive::OMPD_parallel_masked_taskloop_simd,
257 Directive::OMPD_parallel_master_taskloop,
258 Directive::OMPD_parallel_master_taskloop_simd,
259 Directive::OMPD_simd,
260 Directive::OMPD_target_loop,
261 Directive::OMPD_target_parallel_do,
262 Directive::OMPD_target_parallel_do_simd,
263 Directive::OMPD_target_parallel_loop,
264 Directive::OMPD_target_simd,
265 Directive::OMPD_target_teams_distribute,
266 Directive::OMPD_target_teams_distribute_parallel_do,
267 Directive::OMPD_target_teams_distribute_parallel_do_simd,
268 Directive::OMPD_target_teams_distribute_simd,
269 Directive::OMPD_target_teams_loop,
270 Directive::OMPD_taskloop,
271 Directive::OMPD_taskloop_simd,
272 Directive::OMPD_teams_distribute,
273 Directive::OMPD_teams_distribute_parallel_do,
274 Directive::OMPD_teams_distribute_parallel_do_simd,
275 Directive::OMPD_teams_distribute_simd,
276 Directive::OMPD_teams_loop,
277 Directive::OMPD_fuse,
278 Directive::OMPD_tile,
279 Directive::OMPD_unroll,
280 Directive::OMPD_interchange,
281};
282
283static const llvm::omp::Directives loopTransformationSet{
284 Directive::OMPD_tile,
285 Directive::OMPD_unroll,
286 Directive::OMPD_fuse,
287 Directive::OMPD_interchange,
288};
289
290static const llvm::omp::Directives nonPartialVarSet{
291 Directive::OMPD_allocate,
292 Directive::OMPD_allocators,
293 Directive::OMPD_threadprivate,
294 Directive::OMPD_declare_target,
295};
296
297static const llvm::omp::Directives taskGeneratingSet{
298 llvm::omp::Directives{
299 Directive::OMPD_task,
300 } | allTaskloopSet,
301};
302
303static const llvm::omp::Directives workShareSet{
304 llvm::omp::Directives{
305 Directive::OMPD_workshare,
306 Directive::OMPD_parallel_workshare,
307 Directive::OMPD_parallel_sections,
308 Directive::OMPD_scope,
309 Directive::OMPD_sections,
310 Directive::OMPD_single,
311 } | allDoSet,
312};
313
314//===----------------------------------------------------------------------===//
315// Directive sets for parent directives that do allow/not allow a construct
316//===----------------------------------------------------------------------===//
317
318static const llvm::omp::Directives scanParentAllowedSet{allDoSet | allSimdSet};
319
320//===----------------------------------------------------------------------===//
321// Directive sets for allowed/not allowed nested directives
322//===----------------------------------------------------------------------===//
323
324static const llvm::omp::Directives nestedBarrierErrSet{
325 llvm::omp::Directives{
326 Directive::OMPD_atomic,
327 Directive::OMPD_critical,
328 Directive::OMPD_master,
329 Directive::OMPD_ordered_blockassoc,
330 } | taskGeneratingSet |
331 workShareSet,
332};
333
334static const llvm::omp::Directives nestedCancelDoAllowedSet{
335 Directive::OMPD_distribute_parallel_do,
336 Directive::OMPD_do,
337 Directive::OMPD_parallel_do,
338 Directive::OMPD_target_parallel_do,
339 Directive::OMPD_target_teams_distribute_parallel_do,
340 Directive::OMPD_teams_distribute_parallel_do,
341};
342
343static const llvm::omp::Directives nestedCancelParallelAllowedSet{
344 Directive::OMPD_parallel,
345 Directive::OMPD_target_parallel,
346};
347
348static const llvm::omp::Directives nestedCancelSectionsAllowedSet{
349 Directive::OMPD_parallel_sections,
350 Directive::OMPD_sections,
351};
352
353static const llvm::omp::Directives nestedCancelTaskgroupAllowedSet{
354 Directive::OMPD_task,
355 Directive::OMPD_taskloop,
356};
357
358static const llvm::omp::Directives nestedMasterErrSet{
359 llvm::omp::Directives{
360 Directive::OMPD_atomic,
361 } | taskGeneratingSet |
362 workShareSet,
363};
364
365static const llvm::omp::Directives nestedOrderedDoAllowedSet{
366 Directive::OMPD_do,
367 Directive::OMPD_parallel_do,
368 Directive::OMPD_target_parallel_do,
369};
370
371static const llvm::omp::Directives nestedOrderedErrSet{
372 Directive::OMPD_atomic,
373 Directive::OMPD_critical,
374 Directive::OMPD_ordered_blockassoc,
375 Directive::OMPD_task,
376 Directive::OMPD_taskloop,
377};
378
379static const llvm::omp::Directives nestedOrderedParallelErrSet{
380 Directive::OMPD_parallel,
381 Directive::OMPD_parallel_sections,
382 Directive::OMPD_parallel_workshare,
383 Directive::OMPD_target_parallel,
384};
385
386static const llvm::omp::Directives nestedReduceWorkshareAllowedSet{
387 Directive::OMPD_do,
388 Directive::OMPD_do_simd,
389 Directive::OMPD_sections,
390};
391
392static const llvm::omp::Directives nestedTeamsAllowedSet{
393 Directive::OMPD_workdistribute,
394 Directive::OMPD_distribute,
395 Directive::OMPD_distribute_parallel_do,
396 Directive::OMPD_distribute_parallel_do_simd,
397 Directive::OMPD_distribute_simd,
398 Directive::OMPD_loop,
399 Directive::OMPD_parallel,
400 Directive::OMPD_parallel_do,
401 Directive::OMPD_parallel_do_simd,
402 Directive::OMPD_parallel_loop,
403 Directive::OMPD_parallel_master,
404 Directive::OMPD_parallel_master_taskloop,
405 Directive::OMPD_parallel_master_taskloop_simd,
406 Directive::OMPD_parallel_sections,
407 Directive::OMPD_parallel_workshare,
408};
409
410static const llvm::omp::Directives nestedWorkshareErrSet{
411 llvm::omp::Directives{
412 Directive::OMPD_atomic,
413 Directive::OMPD_critical,
414 Directive::OMPD_master,
415 Directive::OMPD_ordered_blockassoc,
416 Directive::OMPD_task,
417 Directive::OMPD_taskloop,
418 } | workShareSet,
419};
420
421//===----------------------------------------------------------------------===//
422// Misc directive sets
423//===----------------------------------------------------------------------===//
424
425// Simple standalone directives than can be erased by -fopenmp-simd.
426static const llvm::omp::Directives simpleStandaloneNonSimdOnlySet{
427 Directive::OMPD_taskyield,
428 Directive::OMPD_barrier,
429 Directive::OMPD_ordered_standalone,
430 Directive::OMPD_target_enter_data,
431 Directive::OMPD_target_exit_data,
432 Directive::OMPD_target_update,
433 Directive::OMPD_taskwait,
434};
435
436} // namespace llvm::omp
437
438#endif // FORTRAN_SEMANTICS_OPENMP_DIRECTIVE_SETS_H_