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