xref: /llvm-project/llvm/include/llvm/Frontend/OpenMP/OMP.td (revision 15ab7be2e049bc0f4ea6744ca037395686a923bc)
1//===-- OMP.td - OpenMP directive definition file ----------*- tablegen -*-===//
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// This is the definition file for OpenMP directives and clauses.
10//
11//===----------------------------------------------------------------------===//
12
13include "llvm/Frontend/Directive/DirectiveBase.td"
14
15//===----------------------------------------------------------------------===//
16// Definition of general OpenMP information
17//===----------------------------------------------------------------------===//
18
19def OpenMP : DirectiveLanguage {
20  let name = "OpenMP";
21  let cppNamespace = "omp"; // final namespace will be llvm::omp
22  let directivePrefix = "OMPD_";
23  let clausePrefix = "OMPC_";
24  let makeEnumAvailableInNamespace = true;
25  let enableBitmaskEnumInNamespace = true;
26  let clauseEnumSetClass = "OmpClauseSet";
27  let flangClauseBaseClass = "OmpClause";
28}
29
30//===----------------------------------------------------------------------===//
31// Definitions of OpenMP clauses
32// Sorted alphabetically wrt clause spelling.
33//===----------------------------------------------------------------------===//
34
35def OMPC_Absent : Clause<"absent"> {
36  let clangClass = "OMPAbsentClause";
37}
38def OMPC_Acquire : Clause<"acquire"> {
39  let clangClass = "OMPAcquireClause";
40}
41def OMPC_AcqRel : Clause<"acq_rel"> {
42  let clangClass = "OMPAcqRelClause";
43}
44def OMPC_AdjustArgs : Clause<"adjust_args"> {
45}
46def OMPC_Affinity : Clause<"affinity"> {
47  let clangClass = "OMPAffinityClause";
48  let flangClass = "OmpAffinityClause";
49}
50def OMPC_Align : Clause<"align"> {
51  let clangClass = "OMPAlignClause";
52  let flangClass = "OmpAlignClause";
53}
54def OMPC_Aligned : Clause<"aligned"> {
55  let clangClass = "OMPAlignedClause";
56  let flangClass = "OmpAlignedClause";
57}
58def OMPC_Allocate : Clause<"allocate"> {
59  let clangClass = "OMPAllocateClause";
60  let flangClass = "OmpAllocateClause";
61}
62def OMPC_Allocator : Clause<"allocator"> {
63  let clangClass = "OMPAllocatorClause";
64  let flangClass = "ScalarIntExpr";
65}
66def OMPC_AppendArgs : Clause<"append_args"> {
67}
68def OMPC_At : Clause<"at"> {
69  let clangClass = "OMPAtClause";
70  let flangClass = "OmpAtClause";
71}
72def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
73  let clangClass = "OMPAtomicDefaultMemOrderClause";
74  let flangClass = "OmpAtomicDefaultMemOrderClause";
75}
76
77def OMP_BIND_parallel : ClauseVal<"parallel",1,1> {}
78def OMP_BIND_teams : ClauseVal<"teams",2,1> {}
79def OMP_BIND_thread : ClauseVal<"thread",3,1> { let isDefault = true; }
80def OMPC_Bind : Clause<"bind"> {
81  let clangClass = "OMPBindClause";
82  let flangClass = "OmpBindClause";
83  let enumClauseValue = "BindKind";
84  let allowedClauseValues = [
85    OMP_BIND_parallel,
86    OMP_BIND_teams,
87    OMP_BIND_thread
88  ];
89}
90
91def OMP_CANCELLATION_CONSTRUCT_Parallel : ClauseVal<"parallel", 1, 1> {}
92def OMP_CANCELLATION_CONSTRUCT_Loop : ClauseVal<"loop", 2, 1> {}
93def OMP_CANCELLATION_CONSTRUCT_Sections : ClauseVal<"sections", 3, 1> {}
94def OMP_CANCELLATION_CONSTRUCT_Taskgroup : ClauseVal<"taskgroup", 4, 1> {}
95def OMP_CANCELLATION_CONSTRUCT_None : ClauseVal<"none", 5, 0> {
96  let isDefault = 1;
97}
98def OMPC_CancellationConstructType : Clause<"cancellation_construct_type"> {
99  let enumClauseValue = "CancellationConstructType";
100  let allowedClauseValues = [
101    OMP_CANCELLATION_CONSTRUCT_Parallel,
102    OMP_CANCELLATION_CONSTRUCT_Loop,
103    OMP_CANCELLATION_CONSTRUCT_Sections,
104    OMP_CANCELLATION_CONSTRUCT_Taskgroup,
105    OMP_CANCELLATION_CONSTRUCT_None
106  ];
107}
108def OMPC_Contains : Clause<"contains"> {
109  let clangClass = "OMPContainsClause";
110}
111def OMPC_Capture : Clause<"capture"> {
112  let clangClass = "OMPCaptureClause";
113}
114def OMPC_Collapse : Clause<"collapse"> {
115  let clangClass = "OMPCollapseClause";
116  let flangClass = "ScalarIntConstantExpr";
117}
118def OMPC_Compare : Clause<"compare"> {
119  let clangClass = "OMPCompareClause";
120}
121def OMPC_Copyin : Clause<"copyin"> {
122  let clangClass = "OMPCopyinClause";
123  let flangClass = "OmpObjectList";
124}
125def OMPC_CopyPrivate : Clause<"copyprivate"> {
126  let clangClass = "OMPCopyprivateClause";
127  let flangClass = "OmpObjectList";
128}
129def OMPC_Default : Clause<"default"> {
130  let clangClass = "OMPDefaultClause";
131  let flangClass = "OmpDefaultClause";
132}
133def OMPC_DefaultMap : Clause<"defaultmap"> {
134  let clangClass = "OMPDefaultmapClause";
135  let flangClass = "OmpDefaultmapClause";
136}
137def OMPC_Depend : Clause<"depend"> {
138  let clangClass = "OMPDependClause";
139  let flangClass = "OmpDependClause";
140}
141def OMPC_Depobj : Clause<"depobj"> {
142  let clangClass = "OMPDepobjClause";
143  let isImplicit = true;
144}
145def OMPC_Destroy : Clause<"destroy"> {
146  let clangClass = "OMPDestroyClause";
147  let flangClass = "OmpDestroyClause";
148  let isValueOptional = true;
149}
150def OMPC_Detach : Clause<"detach"> {
151  let clangClass = "OMPDetachClause";
152  let flangClass = "OmpDetachClause";
153}
154def OMPC_Device : Clause<"device"> {
155  let clangClass = "OMPDeviceClause";
156  let flangClass = "OmpDeviceClause";
157}
158def OMPC_DeviceType : Clause<"device_type"> {
159  let flangClass = "OmpDeviceTypeClause";
160}
161def OMPC_DistSchedule : Clause<"dist_schedule"> {
162  let clangClass = "OMPDistScheduleClause";
163  let flangClass = "ScalarIntExpr";
164  let isValueOptional = true;
165}
166def OMPC_Doacross : Clause<"doacross"> {
167  let clangClass = "OMPDoacrossClause";
168  let flangClass = "OmpDoacrossClause";
169}
170def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
171  let clangClass = "OMPDynamicAllocatorsClause";
172}
173def OMPC_Enter : Clause<"enter"> {
174  let flangClass = "OmpObjectList";
175}
176def OMPC_Exclusive : Clause<"exclusive"> {
177  let clangClass = "OMPExclusiveClause";
178  let flangClass = "OmpObjectList";
179}
180def OMPC_Fail : Clause<"fail"> {
181  let clangClass = "OMPFailClause";
182  let flangClass = "OmpFailClause";
183}
184def OMPC_Filter : Clause<"filter"> {
185  let clangClass = "OMPFilterClause";
186  let flangClass = "ScalarIntExpr";
187}
188def OMPC_Final : Clause<"final"> {
189  let clangClass = "OMPFinalClause";
190  let flangClass = "ScalarLogicalExpr";
191}
192def OMPC_FirstPrivate : Clause<"firstprivate"> {
193  let clangClass = "OMPFirstprivateClause";
194  let flangClass = "OmpObjectList";
195}
196def OMPC_Flush : Clause<"flush"> {
197  let clangClass = "OMPFlushClause";
198  let isImplicit = true;
199}
200def OMPC_From : Clause<"from"> {
201  let clangClass = "OMPFromClause";
202  let flangClass = "OmpFromClause";
203}
204def OMPC_Full: Clause<"full"> {
205  let clangClass = "OMPFullClause";
206}
207def OMP_GRAINSIZE_Strict : ClauseVal<"strict", 1, 1> {}
208def OMP_GRAINSIZE_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
209def OMPC_GrainSize : Clause<"grainsize"> {
210  let clangClass = "OMPGrainsizeClause";
211  let flangClass = "OmpGrainsizeClause";
212  let enumClauseValue = "GrainsizeType";
213  let allowedClauseValues = [
214    OMP_GRAINSIZE_Strict,
215    OMP_GRAINSIZE_Unknown
216  ];
217}
218def OMPC_HasDeviceAddr : Clause<"has_device_addr"> {
219  let clangClass = "OMPHasDeviceAddrClause";
220  let flangClass = "OmpObjectList";
221}
222def OMPC_Hint : Clause<"hint"> {
223  let clangClass = "OMPHintClause";
224  let flangClass = "ConstantExpr";
225}
226def OMPC_Holds : Clause<"holds"> {
227  let clangClass = "OMPHoldsClause";
228}
229def OMPC_If : Clause<"if"> {
230  let clangClass = "OMPIfClause";
231  let flangClass = "OmpIfClause";
232}
233def OMPC_Inbranch : Clause<"inbranch"> {
234}
235def OMPC_Inclusive : Clause<"inclusive"> {
236  let clangClass = "OMPInclusiveClause";
237  let flangClass = "OmpObjectList";
238}
239def OMPC_Indirect : Clause<"indirect"> {
240}
241def OMPC_Init : Clause<"init"> {
242  let clangClass = "OMPInitClause";
243}
244def OMPC_InReduction : Clause<"in_reduction"> {
245  let clangClass = "OMPInReductionClause";
246  let flangClass = "OmpInReductionClause";
247}
248def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
249  let clangClass = "OMPIsDevicePtrClause";
250  let flangClass = "OmpObjectList";
251}
252def OMPC_LastPrivate : Clause<"lastprivate"> {
253  let clangClass = "OMPLastprivateClause";
254  let flangClass = "OmpLastprivateClause";
255}
256def OMPC_Linear : Clause<"linear"> {
257  let clangClass = "OMPLinearClause";
258  let flangClass = "OmpLinearClause";
259}
260def OMPC_Link : Clause<"link"> {
261  let flangClass = "OmpObjectList";
262}
263def OMPC_Map : Clause<"map"> {
264  let clangClass = "OMPMapClause";
265  let flangClass = "OmpMapClause";
266}
267def OMPC_Match : Clause<"match"> {
268  let flangClass = "OmpMatchClause";
269}
270def OMP_MEMORY_ORDER_SeqCst : ClauseVal<"seq_cst", 1, 1> {}
271def OMP_MEMORY_ORDER_AcqRel : ClauseVal<"acq_rel", 2, 1> {}
272def OMP_MEMORY_ORDER_Acquire : ClauseVal<"acquire", 3, 1> {}
273def OMP_MEMORY_ORDER_Release : ClauseVal<"release", 4, 1> {}
274def OMP_MEMORY_ORDER_Relaxed : ClauseVal<"relaxed", 5, 1> {}
275def OMP_MEMORY_ORDER_Default : ClauseVal<"default", 6, 0> {
276  let isDefault = 1;
277}
278def OMPC_MemoryOrder : Clause<"memory_order"> {
279  let enumClauseValue = "MemoryOrderKind";
280  let allowedClauseValues = [
281    OMP_MEMORY_ORDER_SeqCst,
282    OMP_MEMORY_ORDER_AcqRel,
283    OMP_MEMORY_ORDER_Acquire,
284    OMP_MEMORY_ORDER_Release,
285    OMP_MEMORY_ORDER_Relaxed,
286    OMP_MEMORY_ORDER_Default
287  ];
288}
289def OMPC_Mergeable : Clause<"mergeable"> {
290  let clangClass = "OMPMergeableClause";
291}
292def OMPC_Message : Clause<"message"> {
293  let clangClass = "OMPMessageClause";
294  let flangClass = "OmpMessageClause";
295}
296def OMPC_NoOpenMP : Clause<"no_openmp"> {
297  let clangClass = "OMPNoOpenMPClause";
298}
299def OMPC_NoOpenMPRoutines : Clause<"no_openmp_routines"> {
300  let clangClass = "OMPNoOpenMPRoutinesClause";
301}
302def OMPC_NoParallelism : Clause<"no_parallelism"> {
303  let clangClass = "OMPNoParallelismClause";
304}
305def OMPC_Nocontext : Clause<"nocontext"> {
306  let clangClass = "OMPNocontextClause";
307  let flangClass = "ScalarLogicalExpr";
308}
309def OMPC_NoGroup : Clause<"nogroup"> {
310  let clangClass = "OMPNogroupClause";
311}
312def OMPC_NonTemporal : Clause<"nontemporal"> {
313  let clangClass = "OMPNontemporalClause";
314  let flangClass = "Name";
315  let isValueList = true;
316}
317def OMPC_Notinbranch : Clause<"notinbranch"> {
318}
319def OMPC_Novariants : Clause<"novariants"> {
320  let clangClass = "OMPNovariantsClause";
321  let flangClass = "ScalarLogicalExpr";
322}
323def OMPC_NoWait : Clause<"nowait"> {
324  let clangClass = "OMPNowaitClause";
325}
326def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
327def OMP_NUMTASKS_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
328def OMPC_NumTasks : Clause<"num_tasks"> {
329  let clangClass = "OMPNumTasksClause";
330  let flangClass = "OmpNumTasksClause";
331  let enumClauseValue = "NumTasksType";
332  let allowedClauseValues = [
333    OMP_NUMTASKS_Strict,
334    OMP_NUMTASKS_Unknown
335  ];
336}
337def OMPC_NumTeams : Clause<"num_teams"> {
338  let clangClass = "OMPNumTeamsClause";
339  let flangClass = "ScalarIntExpr";
340}
341def OMPC_NumThreads : Clause<"num_threads"> {
342  let clangClass = "OMPNumThreadsClause";
343  let flangClass = "ScalarIntExpr";
344}
345def OMPC_OMPX_Attribute : Clause<"ompx_attribute"> {
346  let clangClass = "OMPXAttributeClause";
347}
348def OMPC_OMPX_Bare : Clause<"ompx_bare"> {
349  let clangClass = "OMPXBareClause";
350}
351def OMPC_OMPX_DynCGroupMem : Clause<"ompx_dyn_cgroup_mem"> {
352  let clangClass = "OMPXDynCGroupMemClause";
353  let flangClass = "ScalarIntExpr";
354}
355def OMP_ORDER_concurrent : ClauseVal<"concurrent",1,1> {}
356def OMP_ORDER_unknown : ClauseVal<"unknown",2,0> { let isDefault = 1; }
357def OMPC_Order : Clause<"order"> {
358  let clangClass = "OMPOrderClause";
359  let flangClass = "OmpOrderClause";
360  let enumClauseValue = "OrderKind";
361  let allowedClauseValues = [
362    OMP_ORDER_unknown,
363    OMP_ORDER_concurrent
364  ];
365}
366def OMPC_Ordered : Clause<"ordered"> {
367  let clangClass = "OMPOrderedClause";
368  let flangClass = "ScalarIntConstantExpr";
369  let isValueOptional = true;
370}
371def OMPC_Otherwise : Clause<"otherwise"> {
372  let flangClass = "OmpOtherwiseClause";
373  let isValueOptional = true;
374}
375def OMPC_Partial: Clause<"partial"> {
376  let clangClass = "OMPPartialClause";
377  let flangClass = "ScalarIntConstantExpr";
378  let isValueOptional = true;
379}
380def OMPC_Permutation: Clause<"permutation"> {
381  let clangClass = "OMPPermutationClause";
382  let flangClass = "ScalarIntExpr";
383  let isValueList = true;
384}
385def OMPC_Priority : Clause<"priority"> {
386  let clangClass = "OMPPriorityClause";
387  let flangClass = "ScalarIntExpr";
388}
389def OMPC_Private : Clause<"private"> {
390  let clangClass = "OMPPrivateClause";
391  let flangClass = "OmpObjectList";
392}
393def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
394def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
395def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
396def OMP_PROC_BIND_primary : ClauseVal<"primary",5,1> {}
397def OMP_PROC_BIND_default : ClauseVal<"default",6,0> {}
398def OMP_PROC_BIND_unknown : ClauseVal<"unknown",7,0> { let isDefault = true; }
399def OMPC_ProcBind : Clause<"proc_bind"> {
400  let clangClass = "OMPProcBindClause";
401  let flangClass = "OmpProcBindClause";
402  let enumClauseValue = "ProcBindKind";
403  let allowedClauseValues = [
404    OMP_PROC_BIND_primary,
405    OMP_PROC_BIND_master,
406    OMP_PROC_BIND_close,
407    OMP_PROC_BIND_spread,
408    OMP_PROC_BIND_default,
409    OMP_PROC_BIND_unknown
410  ];
411}
412def OMPC_Read : Clause<"read"> {
413  let clangClass = "OMPReadClause";
414}
415def OMPC_Reduction : Clause<"reduction"> {
416  let clangClass = "OMPReductionClause";
417  let flangClass = "OmpReductionClause";
418}
419def OMPC_Relaxed : Clause<"relaxed"> {
420  let clangClass = "OMPRelaxedClause";
421}
422def OMPC_Release : Clause<"release"> {
423  let clangClass = "OMPReleaseClause";
424}
425def OMPC_ReverseOffload : Clause<"reverse_offload"> {
426  let clangClass = "OMPReverseOffloadClause";
427}
428def OMPC_SafeLen : Clause<"safelen"> {
429  let clangClass = "OMPSafelenClause";
430  let flangClass = "ScalarIntConstantExpr";
431}
432def OMP_SCHEDULE_Static : ClauseVal<"static", 2, 1> {}
433def OMP_SCHEDULE_Dynamic : ClauseVal<"dynamic", 3, 1> {}
434def OMP_SCHEDULE_Guided : ClauseVal<"guided", 4, 1> {}
435def OMP_SCHEDULE_Auto : ClauseVal<"auto", 5, 1> {}
436def OMP_SCHEDULE_Runtime : ClauseVal<"runtime", 6, 1> {}
437def OMP_SCHEDULE_Default : ClauseVal<"default", 7, 0> { let isDefault = 1; }
438def OMPC_Schedule : Clause<"schedule"> {
439  let clangClass = "OMPScheduleClause";
440  let flangClass = "OmpScheduleClause";
441  let enumClauseValue = "ScheduleKind";
442  let allowedClauseValues = [
443    OMP_SCHEDULE_Static,
444    OMP_SCHEDULE_Dynamic,
445    OMP_SCHEDULE_Guided,
446    OMP_SCHEDULE_Auto,
447    OMP_SCHEDULE_Runtime,
448    OMP_SCHEDULE_Default
449  ];
450}
451def OMPC_SeqCst : Clause<"seq_cst"> {
452  let clangClass = "OMPSeqCstClause";
453}
454def OMPC_Severity : Clause<"severity"> {
455  let clangClass = "OMPSeverityClause";
456  let flangClass = "OmpSeverityClause";
457}
458def OMPC_Shared : Clause<"shared"> {
459  let clangClass = "OMPSharedClause";
460  let flangClass = "OmpObjectList";
461}
462def OMPC_Simd : Clause<"simd"> {
463  let clangClass = "OMPSIMDClause";
464}
465def OMPC_SimdLen : Clause<"simdlen"> {
466  let clangClass = "OMPSimdlenClause";
467  let flangClass = "ScalarIntConstantExpr";
468}
469def OMPC_Sizes: Clause<"sizes"> {
470  let clangClass = "OMPSizesClause";
471  let flangClass = "ScalarIntExpr";
472  let isValueList = true;
473}
474def OMPC_TaskReduction : Clause<"task_reduction"> {
475  let clangClass = "OMPTaskReductionClause";
476  let flangClass = "OmpTaskReductionClause";
477}
478def OMPC_ThreadLimit : Clause<"thread_limit"> {
479  let clangClass = "OMPThreadLimitClause";
480  let flangClass = "ScalarIntExpr";
481}
482def OMPC_ThreadPrivate : Clause<"threadprivate"> {
483  let alternativeName = "threadprivate or thread local";
484  let isImplicit = true;
485}
486def OMPC_Threads : Clause<"threads"> {
487  let clangClass = "OMPThreadsClause";
488}
489def OMPC_To : Clause<"to"> {
490  let clangClass = "OMPToClause";
491  let flangClass = "OmpToClause";
492}
493def OMPC_UnifiedAddress : Clause<"unified_address"> {
494  let clangClass = "OMPUnifiedAddressClause";
495}
496def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
497  let clangClass = "OMPUnifiedSharedMemoryClause";
498}
499def OMPC_Uniform : Clause<"uniform"> {
500  let flangClass = "Name";
501  let isValueList = true;
502}
503def OMPC_Unknown : Clause<"unknown"> {
504  let isImplicit = true;
505  let isDefault = true;
506}
507def OMPC_Untied : Clause<"untied"> {
508  let clangClass = "OMPUntiedClause";
509}
510def OMPC_Update : Clause<"update"> {
511  let clangClass = "OMPUpdateClause";
512  let flangClass = "OmpUpdateClause";
513}
514def OMPC_Use : Clause<"use"> {
515  let clangClass = "OMPUseClause";
516}
517def OMPC_UsesAllocators : Clause<"uses_allocators"> {
518  let clangClass = "OMPUsesAllocatorsClause";
519}
520def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
521  let clangClass = "OMPUseDeviceAddrClause";
522  let flangClass = "OmpObjectList";
523}
524def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
525  let clangClass = "OMPUseDevicePtrClause";
526  let flangClass = "OmpObjectList";
527}
528def OMPC_Weak : Clause<"weak"> {
529  let clangClass = "OMPWeakClause";
530}
531def OMPC_When: Clause<"when"> {
532  let flangClass = "OmpWhenClause";
533}
534def OMPC_Write : Clause<"write"> {
535  let clangClass = "OMPWriteClause";
536}
537
538//===----------------------------------------------------------------------===//
539// Definitions of OpenMP leaf directives
540// Sorted alphabetically wrt directive spelling, except "end xyz" immediately
541// follows "xyz".
542//===----------------------------------------------------------------------===//
543
544def OMP_Allocate : Directive<"allocate"> {
545  let allowedOnceClauses = [
546    VersionedClause<OMPC_Align, 51>,
547    VersionedClause<OMPC_Allocator>,
548  ];
549  let association = AS_None;
550  let category = CA_Declarative;
551}
552def OMP_Allocators : Directive<"allocators"> {
553  let allowedClauses = [
554    VersionedClause<OMPC_Allocate>,
555  ];
556  let association = AS_Block;
557  let category = CA_Executable;
558}
559def OMP_Assumes : Directive<"assumes"> {
560  let association = AS_None;
561  let category = CA_Informational;
562}
563def OMP_EndAssumes : Directive<"end assumes"> {
564  let association = AS_Delimited;
565  let category = OMP_Assumes.category;
566}
567def OMP_Assume : Directive<"assume"> {
568  let association = AS_Block;
569  let category = CA_Informational;
570  let allowedOnceClauses = [
571    VersionedClause<OMPC_Absent, 51>,
572    VersionedClause<OMPC_Contains, 51>,
573    VersionedClause<OMPC_Holds, 51>,
574    VersionedClause<OMPC_NoOpenMP, 51>,
575    VersionedClause<OMPC_NoOpenMPRoutines, 51>,
576    VersionedClause<OMPC_NoParallelism, 51>,
577  ];
578}
579def OMP_Atomic : Directive<"atomic"> {
580  let allowedClauses = [
581    VersionedClause<OMPC_Capture>,
582    VersionedClause<OMPC_Compare, 51>,
583    VersionedClause<OMPC_Read>,
584    VersionedClause<OMPC_Update>,
585    VersionedClause<OMPC_Write>,
586  ];
587  let allowedOnceClauses = [
588    VersionedClause<OMPC_AcqRel, 50>,
589    VersionedClause<OMPC_Acquire, 50>,
590    VersionedClause<OMPC_Fail, 51>,
591    VersionedClause<OMPC_Hint, 50>,
592    VersionedClause<OMPC_Relaxed, 50>,
593    VersionedClause<OMPC_Release, 50>,
594    VersionedClause<OMPC_SeqCst>,
595    VersionedClause<OMPC_Weak, 51>,
596  ];
597  let association = AS_Block;
598  let category = CA_Executable;
599}
600def OMP_Barrier : Directive<"barrier"> {
601  let association = AS_None;
602  let category = CA_Executable;
603}
604def OMP_BeginAssumes : Directive<"begin assumes"> {
605  let association = AS_Delimited;
606  let category = CA_Informational;
607}
608def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
609  let allowedClauses = [
610    VersionedClause<OMPC_DeviceType>,
611    VersionedClause<OMPC_Indirect>,
612    VersionedClause<OMPC_Link>,
613    VersionedClause<OMPC_To>,
614  ];
615  let association = AS_Delimited;
616  let category = CA_Declarative;
617}
618def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {
619  let association = AS_Delimited;
620  let category = CA_Declarative;
621}
622def OMP_Cancel : Directive<"cancel"> {
623  let allowedOnceClauses = [
624    VersionedClause<OMPC_If>,
625  ];
626  let association = AS_None;
627  let category = CA_Executable;
628}
629def OMP_CancellationPoint : Directive<"cancellation point"> {
630  let association = AS_None;
631  let category = CA_Executable;
632}
633def OMP_Critical : Directive<"critical"> {
634  let allowedClauses = [
635    VersionedClause<OMPC_Hint>,
636  ];
637  let association = AS_Block;
638  let category = CA_Executable;
639}
640def OMP_DeclareMapper : Directive<"declare mapper"> {
641  let requiredClauses = [
642    VersionedClause<OMPC_Map, 45>,
643  ];
644  let association = AS_None;
645  let category = CA_Declarative;
646}
647def OMP_DeclareReduction : Directive<"declare reduction"> {
648  let association = AS_None;
649  let category = CA_Declarative;
650}
651def OMP_DeclareSimd : Directive<"declare simd"> {
652  let allowedClauses = [
653    VersionedClause<OMPC_Aligned>,
654    VersionedClause<OMPC_Linear>,
655    VersionedClause<OMPC_Uniform>,
656  ];
657  let allowedOnceClauses = [
658    VersionedClause<OMPC_SimdLen>,
659  ];
660  let allowedExclusiveClauses = [
661    VersionedClause<OMPC_Inbranch>,
662    VersionedClause<OMPC_Notinbranch>,
663  ];
664  let association = AS_Declaration;
665  let category = CA_Declarative;
666}
667def OMP_DeclareTarget : Directive<"declare target"> {
668  let allowedClauses = [
669    VersionedClause<OMPC_Enter, 52>,
670    VersionedClause<OMPC_Indirect>,
671    VersionedClause<OMPC_Link>,
672    VersionedClause<OMPC_To>,
673  ];
674  let allowedOnceClauses = [
675    VersionedClause<OMPC_DeviceType, 50>,
676  ];
677  let association = AS_None;
678  let category = CA_Declarative;
679}
680def OMP_EndDeclareTarget : Directive<"end declare target"> {
681  let association = AS_Delimited;
682  let category = OMP_DeclareTarget.category;
683}
684def OMP_DeclareVariant : Directive<"declare variant"> {
685  let allowedClauses = [
686    VersionedClause<OMPC_Match>,
687  ];
688  let allowedExclusiveClauses = [
689    VersionedClause<OMPC_AdjustArgs, 51>,
690    VersionedClause<OMPC_AppendArgs, 51>,
691  ];
692  let association = AS_Declaration;
693  let category = CA_Declarative;
694}
695def OMP_EndDeclareVariant : Directive<"end declare variant"> {
696  let association = AS_Delimited;
697  let category = OMP_DeclareVariant.category;
698}
699def OMP_Depobj : Directive<"depobj"> {
700  let allowedClauses = [
701    VersionedClause<OMPC_Depend, 50>,
702    // TODO This should ne `none` instead. Comment carried over from
703    // OMPKinds.def.
704    VersionedClause<OMPC_Depobj, 50>,
705    VersionedClause<OMPC_Destroy, 50>,
706    VersionedClause<OMPC_Update, 50>,
707  ];
708  let association = AS_None;
709  let category = CA_Executable;
710}
711def OMP_dispatch : Directive<"dispatch"> {
712  let allowedClauses = [
713    VersionedClause<OMPC_Depend>,
714    VersionedClause<OMPC_Device>,
715    VersionedClause<OMPC_HasDeviceAddr, 51>,
716    VersionedClause<OMPC_IsDevicePtr>,
717    VersionedClause<OMPC_Nocontext>,
718    VersionedClause<OMPC_Novariants>,
719    VersionedClause<OMPC_NoWait>,
720  ];
721  let association = AS_Block;
722  let category = CA_Executable;
723}
724def OMP_Distribute : Directive<"distribute"> {
725  let allowedClauses = [
726    VersionedClause<OMPC_Allocate>,
727    VersionedClause<OMPC_FirstPrivate>,
728    VersionedClause<OMPC_LastPrivate>,
729    VersionedClause<OMPC_Private>,
730  ];
731  let allowedOnceClauses = [
732    VersionedClause<OMPC_Collapse>,
733    VersionedClause<OMPC_DistSchedule>,
734    VersionedClause<OMPC_Order, 50>,
735  ];
736  let association = AS_Loop;
737  let category = CA_Executable;
738}
739def OMP_Do : Directive<"do"> {
740  let allowedClauses = [
741    VersionedClause<OMPC_FirstPrivate>,
742    VersionedClause<OMPC_LastPrivate>,
743    VersionedClause<OMPC_Linear>,
744    VersionedClause<OMPC_Private>,
745    VersionedClause<OMPC_Reduction>,
746  ];
747  let allowedOnceClauses = [
748    VersionedClause<OMPC_Collapse>,
749    VersionedClause<OMPC_NoWait>,
750    VersionedClause<OMPC_Order, 50>,
751    VersionedClause<OMPC_Ordered>,
752    VersionedClause<OMPC_Schedule>,
753  ];
754  let association = AS_Loop;
755  let category = CA_Executable;
756}
757def OMP_EndDo : Directive<"end do"> {
758  let allowedOnceClauses = [
759    VersionedClause<OMPC_NoWait>,
760  ];
761  // Needed for association computation, since OMP_Do has it "from leafConstructs".
762  let leafConstructs = OMP_Do.leafConstructs;
763  let association = OMP_Do.association;
764  let category = OMP_Do.category;
765}
766def OMP_Error : Directive<"error"> {
767  let allowedClauses = [
768    VersionedClause<OMPC_At, 51>,
769    VersionedClause<OMPC_Message, 51>,
770    VersionedClause<OMPC_Severity, 51>,
771  ];
772  let association = AS_None;
773  let category = CA_Utility;
774}
775def OMP_Flush : Directive<"flush"> {
776  let allowedOnceClauses = [
777    VersionedClause<OMPC_AcqRel, 50>,
778    VersionedClause<OMPC_Acquire, 50>,
779    // TODO This should ne `none` instead. Comment carried over from
780    // OMPKinds.def.
781    VersionedClause<OMPC_Flush>,
782    VersionedClause<OMPC_Release, 50>,
783    VersionedClause<OMPC_SeqCst, 51>,
784  ];
785  let association = AS_None;
786  let category = CA_Executable;
787}
788def OMP_For : Directive<"for"> {
789  let allowedClauses = [
790    VersionedClause<OMPC_Allocate>,
791    VersionedClause<OMPC_Collapse>,
792    VersionedClause<OMPC_FirstPrivate>,
793    VersionedClause<OMPC_LastPrivate>,
794    VersionedClause<OMPC_Linear>,
795    VersionedClause<OMPC_NoWait>,
796    VersionedClause<OMPC_Order, 50>,
797    VersionedClause<OMPC_Ordered>,
798    VersionedClause<OMPC_Private>,
799    VersionedClause<OMPC_Reduction>,
800    VersionedClause<OMPC_Schedule>,
801  ];
802  let association = AS_Loop;
803  let category = CA_Executable;
804}
805def OMP_Interchange : Directive<"interchange"> {
806  let allowedOnceClauses = [
807    VersionedClause<OMPC_Permutation>,
808  ];
809  let association = AS_Loop;
810  let category = CA_Executable;
811}
812def OMP_interop : Directive<"interop"> {
813  let allowedClauses = [
814    VersionedClause<OMPC_Depend>,
815    VersionedClause<OMPC_Destroy>,
816    VersionedClause<OMPC_Device>,
817    VersionedClause<OMPC_Init>,
818    VersionedClause<OMPC_NoWait>,
819    VersionedClause<OMPC_Use>,
820  ];
821  let association = AS_None;
822  let category = CA_Executable;
823}
824def OMP_loop : Directive<"loop"> {
825  let allowedClauses = [
826    VersionedClause<OMPC_LastPrivate>,
827    VersionedClause<OMPC_Private>,
828    VersionedClause<OMPC_Reduction>,
829  ];
830  let allowedOnceClauses = [
831    VersionedClause<OMPC_Bind, 50>,
832    VersionedClause<OMPC_Collapse>,
833    VersionedClause<OMPC_Order, 50>,
834  ];
835  let association = AS_Loop;
836  let category = CA_Executable;
837}
838def OMP_masked : Directive<"masked"> {
839  let allowedOnceClauses = [
840    VersionedClause<OMPC_Filter>,
841  ];
842  let association = AS_Block;
843  let category = CA_Executable;
844}
845def OMP_Master : Directive<"master"> {
846  let association = AS_Block;
847  let category = CA_Executable;
848}
849def OMP_Metadirective : Directive<"metadirective"> {
850  let allowedClauses = [
851    VersionedClause<OMPC_When>,
852  ];
853  let allowedOnceClauses = [
854    VersionedClause<OMPC_Otherwise, 52>,
855    VersionedClause<OMPC_Default, 50, 51>,
856  ];
857  let association = AS_None;
858  let category = CA_Meta;
859}
860def OMP_Nothing : Directive<"nothing"> {
861  let association = AS_None;
862  let category = CA_Utility;
863}
864def OMP_Ordered : Directive<"ordered"> {
865  let allowedClauses = [
866    VersionedClause<OMPC_Depend>,
867    VersionedClause<OMPC_Doacross, 52>,
868  ];
869  let allowedOnceClauses = [
870    VersionedClause<OMPC_Simd>,
871    VersionedClause<OMPC_Threads>,
872  ];
873  let association = AS_None;
874  // There is also a block-associated "ordered" directive.
875  let category = CA_Executable;
876}
877def OMP_Parallel : Directive<"parallel"> {
878  let allowedClauses = [
879    VersionedClause<OMPC_Allocate>,
880    VersionedClause<OMPC_Copyin>,
881    VersionedClause<OMPC_FirstPrivate>,
882    VersionedClause<OMPC_OMPX_Attribute>,
883    VersionedClause<OMPC_Private>,
884    VersionedClause<OMPC_Reduction>,
885    VersionedClause<OMPC_Shared>,
886  ];
887  let allowedOnceClauses = [
888    VersionedClause<OMPC_Default>,
889    VersionedClause<OMPC_If>,
890    VersionedClause<OMPC_NumThreads>,
891    VersionedClause<OMPC_ProcBind>,
892  ];
893  let association = AS_Block;
894  let category = CA_Executable;
895}
896def OMP_Requires : Directive<"requires"> {
897  let allowedOnceClauses = [
898    VersionedClause<OMPC_UnifiedAddress>,
899    VersionedClause<OMPC_UnifiedSharedMemory>,
900    // OpenMP 5.2 Spec: If an implementation is not supporting a requirement
901    // (reverse offload in this case) then it should give compile-time error
902    // termination.
903    // Seeting supported version for reverse_offload to a distant future version
904    // 9.9 so that its partial support can be tested in the meantime.
905    //
906    // TODO: Correct this supprted version number whenever complete
907    // implementation of reverse_offload is available.
908    VersionedClause<OMPC_AtomicDefaultMemOrder>,
909    VersionedClause<OMPC_DynamicAllocators>,
910    VersionedClause<OMPC_ReverseOffload, 99>,
911  ];
912  let association = AS_None;
913  let category = CA_Informational;
914}
915def OMP_Reverse : Directive<"reverse"> {
916  let association = AS_Loop;
917  let category = CA_Executable;
918}
919def OMP_Scan : Directive<"scan"> {
920  let allowedClauses = [
921    VersionedClause<OMPC_Exclusive>,
922    VersionedClause<OMPC_Inclusive>,
923  ];
924  let association = AS_Separating;
925  let category = CA_Subsidiary;
926}
927def OMP_Scope : Directive<"scope"> {
928  let allowedClauses = [
929    VersionedClause<OMPC_Private, 51>,
930    VersionedClause<OMPC_Reduction, 51>,
931    VersionedClause<OMPC_FirstPrivate, 52>,
932    VersionedClause<OMPC_Allocate, 52>,
933  ];
934  let allowedOnceClauses = [
935    VersionedClause<OMPC_NoWait, 51>,
936  ];
937  let association = AS_Block;
938  let category = CA_Executable;
939}
940def OMP_EndScope : Directive<"end scope"> {
941  let allowedOnceClauses = [
942    VersionedClause<OMPC_NoWait>,
943  ];
944  let leafConstructs = OMP_Scope.leafConstructs;
945  let association = OMP_Scope.association;
946  let category = OMP_Scope.category;
947}
948def OMP_Section : Directive<"section"> {
949  let association = AS_Separating;
950  let category = CA_Subsidiary;
951}
952def OMP_Sections : Directive<"sections"> {
953  let allowedClauses = [
954    VersionedClause<OMPC_Allocate>,
955    VersionedClause<OMPC_FirstPrivate>,
956    VersionedClause<OMPC_LastPrivate>,
957    VersionedClause<OMPC_NoWait>,
958    VersionedClause<OMPC_Private>,
959    VersionedClause<OMPC_Reduction>,
960  ];
961  let association = AS_Block;
962  let category = CA_Executable;
963}
964def OMP_EndSections : Directive<"end sections"> {
965  let allowedOnceClauses = [
966    VersionedClause<OMPC_NoWait>,
967  ];
968  let leafConstructs = OMP_Sections.leafConstructs;
969  let association = OMP_Sections.association;
970  let category = OMP_Sections.category;
971}
972def OMP_Simd : Directive<"simd"> {
973  let allowedClauses = [
974    VersionedClause<OMPC_Aligned>,
975    VersionedClause<OMPC_Allocate>,
976    VersionedClause<OMPC_LastPrivate>,
977    VersionedClause<OMPC_Linear>,
978    VersionedClause<OMPC_NonTemporal, 50>,
979    VersionedClause<OMPC_Private>,
980    VersionedClause<OMPC_Reduction>,
981  ];
982  let allowedOnceClauses = [
983    VersionedClause<OMPC_Collapse>,
984    VersionedClause<OMPC_If, 50>,
985    VersionedClause<OMPC_Order, 50>,
986    VersionedClause<OMPC_SafeLen>,
987    VersionedClause<OMPC_SimdLen>,
988  ];
989  let association = AS_Loop;
990  let category = CA_Executable;
991}
992def OMP_Single : Directive<"single"> {
993  let allowedClauses = [
994    VersionedClause<OMPC_Allocate>,
995    VersionedClause<OMPC_CopyPrivate>,
996    VersionedClause<OMPC_FirstPrivate>,
997    VersionedClause<OMPC_NoWait>,
998    VersionedClause<OMPC_Private>,
999  ];
1000  let association = AS_Block;
1001  let category = CA_Executable;
1002}
1003def OMP_EndSingle : Directive<"end single"> {
1004  let allowedClauses = [
1005    VersionedClause<OMPC_CopyPrivate>,
1006  ];
1007  let allowedOnceClauses = [
1008    VersionedClause<OMPC_NoWait>,
1009  ];
1010  let leafConstructs = OMP_Single.leafConstructs;
1011  let association = OMP_Single.association;
1012  let category = OMP_Single.category;
1013}
1014def OMP_Target : Directive<"target"> {
1015  let allowedClauses = [
1016    VersionedClause<OMPC_Allocate>,
1017    VersionedClause<OMPC_Depend>,
1018    VersionedClause<OMPC_FirstPrivate>,
1019    VersionedClause<OMPC_HasDeviceAddr, 51>,
1020    VersionedClause<OMPC_InReduction, 50>,
1021    VersionedClause<OMPC_IsDevicePtr>,
1022    VersionedClause<OMPC_Map>,
1023    VersionedClause<OMPC_OMPX_Attribute>,
1024    VersionedClause<OMPC_Private>,
1025    VersionedClause<OMPC_UsesAllocators, 50>,
1026  ];
1027  let allowedOnceClauses = [
1028    VersionedClause<OMPC_DefaultMap>,
1029    VersionedClause<OMPC_Device>,
1030    VersionedClause<OMPC_If>,
1031    VersionedClause<OMPC_NoWait>,
1032    VersionedClause<OMPC_OMPX_Bare>,
1033    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1034    VersionedClause<OMPC_ThreadLimit, 51>,
1035  ];
1036  let association = AS_Block;
1037  let category = CA_Executable;
1038}
1039def OMP_TargetData : Directive<"target data"> {
1040  let allowedOnceClauses = [
1041    VersionedClause<OMPC_Device>,
1042    VersionedClause<OMPC_If>,
1043  ];
1044  let requiredClauses = [
1045    VersionedClause<OMPC_Map>,
1046    VersionedClause<OMPC_UseDeviceAddr, 50>,
1047    VersionedClause<OMPC_UseDevicePtr>,
1048  ];
1049  let association = AS_Block;
1050  let category = CA_Executable;
1051}
1052def OMP_TargetEnterData : Directive<"target enter data"> {
1053  let allowedClauses = [
1054    VersionedClause<OMPC_Depend>,
1055  ];
1056  let allowedOnceClauses = [
1057    VersionedClause<OMPC_Device>,
1058    VersionedClause<OMPC_If>,
1059    VersionedClause<OMPC_NoWait>,
1060  ];
1061  let requiredClauses = [
1062    VersionedClause<OMPC_Map>,
1063  ];
1064  let association = AS_None;
1065  let category = CA_Executable;
1066}
1067def OMP_TargetExitData : Directive<"target exit data"> {
1068  let allowedClauses = [
1069    VersionedClause<OMPC_Depend>,
1070  ];
1071  let allowedOnceClauses = [
1072    VersionedClause<OMPC_Device>,
1073    VersionedClause<OMPC_If>,
1074    VersionedClause<OMPC_NoWait>,
1075  ];
1076  let requiredClauses = [
1077    VersionedClause<OMPC_Map>,
1078  ];
1079  let association = AS_None;
1080  let category = CA_Executable;
1081}
1082def OMP_TargetUpdate : Directive<"target update"> {
1083  let allowedClauses = [
1084    VersionedClause<OMPC_Depend>,
1085    VersionedClause<OMPC_From>,
1086    VersionedClause<OMPC_To>,
1087  ];
1088  let allowedOnceClauses = [
1089    VersionedClause<OMPC_Device>,
1090    VersionedClause<OMPC_If>,
1091    VersionedClause<OMPC_NoWait>,
1092  ];
1093  let association = AS_None;
1094  let category = CA_Executable;
1095}
1096def OMP_Task : Directive<"task"> {
1097  let allowedClauses = [
1098    VersionedClause<OMPC_Affinity, 50>,
1099    VersionedClause<OMPC_Allocate>,
1100    VersionedClause<OMPC_Depend>,
1101    VersionedClause<OMPC_Detach, 50>,
1102    VersionedClause<OMPC_FirstPrivate>,
1103    VersionedClause<OMPC_InReduction>,
1104    VersionedClause<OMPC_Mergeable>,
1105    VersionedClause<OMPC_Private>,
1106    VersionedClause<OMPC_Shared>,
1107    VersionedClause<OMPC_Untied>,
1108  ];
1109  let allowedOnceClauses = [
1110    VersionedClause<OMPC_Default>,
1111    VersionedClause<OMPC_Final>,
1112    VersionedClause<OMPC_If>,
1113    VersionedClause<OMPC_Priority>,
1114  ];
1115  let association = AS_Block;
1116  let category = CA_Executable;
1117}
1118def OMP_TaskGroup : Directive<"taskgroup"> {
1119  let allowedClauses = [
1120    VersionedClause<OMPC_Allocate, 50>,
1121    VersionedClause<OMPC_TaskReduction, 50>,
1122  ];
1123  let association = AS_Block;
1124  let category = CA_Executable;
1125}
1126def OMP_TaskLoop : Directive<"taskloop"> {
1127  let allowedClauses = [
1128    VersionedClause<OMPC_Allocate>,
1129    VersionedClause<OMPC_FirstPrivate>,
1130    VersionedClause<OMPC_InReduction>,
1131    VersionedClause<OMPC_LastPrivate>,
1132    VersionedClause<OMPC_Mergeable>,
1133    VersionedClause<OMPC_NoGroup>,
1134    VersionedClause<OMPC_Private>,
1135    VersionedClause<OMPC_Reduction>,
1136    VersionedClause<OMPC_Shared>,
1137    VersionedClause<OMPC_Untied>,
1138  ];
1139  let allowedOnceClauses = [
1140    VersionedClause<OMPC_Collapse>,
1141    VersionedClause<OMPC_Default>,
1142    VersionedClause<OMPC_Final>,
1143    VersionedClause<OMPC_If>,
1144    VersionedClause<OMPC_Priority>,
1145  ];
1146  let allowedExclusiveClauses = [
1147    VersionedClause<OMPC_GrainSize>,
1148    VersionedClause<OMPC_NumTasks>,
1149  ];
1150  let association = AS_Loop;
1151  let category = CA_Executable;
1152}
1153def OMP_TaskWait : Directive<"taskwait"> {
1154  let allowedClauses = [
1155    VersionedClause<OMPC_Depend, 50>,
1156    VersionedClause<OMPC_NoWait, 51>,
1157  ];
1158  let association = AS_None;
1159  let category = CA_Executable;
1160}
1161def OMP_TaskYield : Directive<"taskyield"> {
1162  let association = AS_None;
1163  let category = CA_Executable;
1164}
1165def OMP_Teams : Directive<"teams"> {
1166  let allowedClauses = [
1167    VersionedClause<OMPC_Allocate>,
1168    VersionedClause<OMPC_FirstPrivate>,
1169    VersionedClause<OMPC_OMPX_Attribute>,
1170    VersionedClause<OMPC_Private>,
1171    VersionedClause<OMPC_Reduction>,
1172    VersionedClause<OMPC_Shared>,
1173  ];
1174  let allowedOnceClauses = [
1175    VersionedClause<OMPC_Default>,
1176    VersionedClause<OMPC_If, 52>,
1177    VersionedClause<OMPC_NumTeams>,
1178    VersionedClause<OMPC_ThreadLimit>,
1179  ];
1180  let association = AS_Block;
1181  let category = CA_Executable;
1182}
1183def OMP_ThreadPrivate : Directive<"threadprivate"> {
1184  let association = AS_None;
1185  let category = CA_Declarative;
1186}
1187def OMP_Tile : Directive<"tile"> {
1188  let allowedOnceClauses = [
1189    VersionedClause<OMPC_Sizes, 51>,
1190  ];
1191  let association = AS_Loop;
1192  let category = CA_Executable;
1193}
1194def OMP_Unknown : Directive<"unknown"> {
1195  let isDefault = true;
1196  let association = AS_None;
1197  let category = CA_Utility;
1198}
1199def OMP_Unroll : Directive<"unroll"> {
1200  let allowedOnceClauses = [
1201    VersionedClause<OMPC_Full, 51>,
1202    VersionedClause<OMPC_Partial, 51>,
1203  ];
1204  let association = AS_Loop;
1205  let category = CA_Executable;
1206}
1207def OMP_Workshare : Directive<"workshare"> {
1208  let allowedOnceClauses = [
1209    VersionedClause<OMPC_NoWait>,
1210  ];
1211  let association = AS_Block;
1212  let category = CA_Executable;
1213}
1214def OMP_EndWorkshare : Directive<"end workshare"> {
1215  let allowedOnceClauses = [
1216    VersionedClause<OMPC_NoWait>,
1217  ];
1218  let leafConstructs = OMP_Workshare.leafConstructs;
1219  let association = OMP_Workshare.association;
1220  let category = OMP_Workshare.category;
1221}
1222
1223//===----------------------------------------------------------------------===//
1224// Definitions of OpenMP compound directives
1225// Sorted alphabetically wrt directive spelling, except "end xyz" immediately
1226// follows "xyz".
1227//===----------------------------------------------------------------------===//
1228
1229def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
1230  let allowedClauses = [
1231    VersionedClause<OMPC_Allocate>,
1232    VersionedClause<OMPC_Copyin>,
1233    VersionedClause<OMPC_Default>,
1234    VersionedClause<OMPC_FirstPrivate>,
1235    VersionedClause<OMPC_LastPrivate>,
1236    VersionedClause<OMPC_Linear>,
1237    VersionedClause<OMPC_Private>,
1238    VersionedClause<OMPC_Reduction>,
1239    VersionedClause<OMPC_Shared>,
1240  ];
1241  let allowedOnceClauses = [
1242    VersionedClause<OMPC_Collapse>,
1243    VersionedClause<OMPC_DistSchedule>,
1244    VersionedClause<OMPC_If>,
1245    VersionedClause<OMPC_NumThreads>,
1246    VersionedClause<OMPC_Order, 50>,
1247    VersionedClause<OMPC_ProcBind>,
1248    VersionedClause<OMPC_Schedule>,
1249  ];
1250  let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_Do];
1251  let category = CA_Executable;
1252}
1253def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
1254  let allowedClauses = [
1255    VersionedClause<OMPC_Aligned>,
1256    VersionedClause<OMPC_Allocate>,
1257    VersionedClause<OMPC_Collapse>,
1258    VersionedClause<OMPC_Copyin>,
1259    VersionedClause<OMPC_Default>,
1260    VersionedClause<OMPC_DistSchedule>,
1261    VersionedClause<OMPC_FirstPrivate>,
1262    VersionedClause<OMPC_If>,
1263    VersionedClause<OMPC_LastPrivate>,
1264    VersionedClause<OMPC_Linear>,
1265    VersionedClause<OMPC_NonTemporal>,
1266    VersionedClause<OMPC_NumThreads>,
1267    VersionedClause<OMPC_Order, 50>,
1268    VersionedClause<OMPC_Private>,
1269    VersionedClause<OMPC_ProcBind>,
1270    VersionedClause<OMPC_Reduction>,
1271    VersionedClause<OMPC_SafeLen>,
1272    VersionedClause<OMPC_Schedule>,
1273    VersionedClause<OMPC_Shared>,
1274    VersionedClause<OMPC_SimdLen>,
1275  ];
1276  let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
1277  let category = CA_Executable;
1278}
1279def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
1280  let allowedClauses = [
1281    VersionedClause<OMPC_Allocate>,
1282    VersionedClause<OMPC_Collapse>,
1283    VersionedClause<OMPC_Copyin>,
1284    VersionedClause<OMPC_Default>,
1285    VersionedClause<OMPC_DistSchedule>,
1286    VersionedClause<OMPC_FirstPrivate>,
1287    VersionedClause<OMPC_If>,
1288    VersionedClause<OMPC_LastPrivate>,
1289    VersionedClause<OMPC_NumThreads>,
1290    VersionedClause<OMPC_OMPX_Attribute>,
1291    VersionedClause<OMPC_Order, 50>,
1292    VersionedClause<OMPC_Private>,
1293    VersionedClause<OMPC_ProcBind>,
1294    VersionedClause<OMPC_Reduction>,
1295    VersionedClause<OMPC_Schedule>,
1296    VersionedClause<OMPC_Shared>,
1297  ];
1298  let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_For];
1299  let category = CA_Executable;
1300}
1301def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
1302  let allowedClauses = [
1303    VersionedClause<OMPC_Aligned>,
1304    VersionedClause<OMPC_Allocate>,
1305    VersionedClause<OMPC_Collapse>,
1306    VersionedClause<OMPC_Copyin>,
1307    VersionedClause<OMPC_Default>,
1308    VersionedClause<OMPC_DistSchedule>,
1309    VersionedClause<OMPC_FirstPrivate>,
1310    VersionedClause<OMPC_If>,
1311    VersionedClause<OMPC_LastPrivate>,
1312    VersionedClause<OMPC_Linear>,
1313    VersionedClause<OMPC_NonTemporal, 50>,
1314    VersionedClause<OMPC_NumThreads>,
1315    VersionedClause<OMPC_OMPX_Attribute>,
1316    VersionedClause<OMPC_Order, 50>,
1317    VersionedClause<OMPC_Private>,
1318    VersionedClause<OMPC_ProcBind>,
1319    VersionedClause<OMPC_Reduction>,
1320    VersionedClause<OMPC_SafeLen>,
1321    VersionedClause<OMPC_Schedule>,
1322    VersionedClause<OMPC_Shared>,
1323    VersionedClause<OMPC_SimdLen>,
1324  ];
1325  let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
1326  let category = CA_Executable;
1327}
1328def OMP_DistributeSimd : Directive<"distribute simd"> {
1329  let allowedClauses = [
1330    VersionedClause<OMPC_Aligned>,
1331    VersionedClause<OMPC_Allocate>,
1332    VersionedClause<OMPC_Copyin>,
1333    VersionedClause<OMPC_Default>,
1334    VersionedClause<OMPC_FirstPrivate>,
1335    VersionedClause<OMPC_LastPrivate>,
1336    VersionedClause<OMPC_Linear>,
1337    VersionedClause<OMPC_NonTemporal, 50>,
1338    VersionedClause<OMPC_Private>,
1339    VersionedClause<OMPC_Reduction>,
1340  ];
1341  let allowedOnceClauses = [
1342    VersionedClause<OMPC_Collapse>,
1343    VersionedClause<OMPC_DistSchedule>,
1344    VersionedClause<OMPC_If, 50>,
1345    VersionedClause<OMPC_NumThreads>,
1346    VersionedClause<OMPC_Order, 50>,
1347    VersionedClause<OMPC_ProcBind>,
1348    VersionedClause<OMPC_SafeLen>,
1349    VersionedClause<OMPC_Schedule>,
1350    VersionedClause<OMPC_SimdLen>,
1351  ];
1352  let leafConstructs = [OMP_Distribute, OMP_Simd];
1353  let category = CA_Executable;
1354}
1355def OMP_DoSimd : Directive<"do simd"> {
1356  let allowedClauses = [
1357    VersionedClause<OMPC_Aligned>,
1358    VersionedClause<OMPC_FirstPrivate>,
1359    VersionedClause<OMPC_LastPrivate>,
1360    VersionedClause<OMPC_Linear>,
1361    VersionedClause<OMPC_Private>,
1362    VersionedClause<OMPC_Reduction>,
1363  ];
1364  let allowedOnceClauses = [
1365    VersionedClause<OMPC_Collapse>,
1366    VersionedClause<OMPC_If>,
1367    VersionedClause<OMPC_NoWait>,
1368    VersionedClause<OMPC_Order, 50>,
1369    VersionedClause<OMPC_Ordered>,
1370    VersionedClause<OMPC_SafeLen>,
1371    VersionedClause<OMPC_Schedule>,
1372    VersionedClause<OMPC_SimdLen>,
1373  ];
1374  let leafConstructs = [OMP_Do, OMP_Simd];
1375  let category = CA_Executable;
1376}
1377def OMP_EndDoSimd : Directive<"end do simd"> {
1378  let allowedOnceClauses = [
1379    VersionedClause<OMPC_NoWait>,
1380  ];
1381  let leafConstructs = OMP_DoSimd.leafConstructs;
1382  let association = OMP_DoSimd.association;
1383  let category = OMP_DoSimd.category;
1384}
1385def OMP_ForSimd : Directive<"for simd"> {
1386  let allowedClauses = [
1387    VersionedClause<OMPC_Aligned>,
1388    VersionedClause<OMPC_Allocate>,
1389    VersionedClause<OMPC_Collapse>,
1390    VersionedClause<OMPC_FirstPrivate>,
1391    VersionedClause<OMPC_If, 50>,
1392    VersionedClause<OMPC_LastPrivate>,
1393    VersionedClause<OMPC_Linear>,
1394    VersionedClause<OMPC_NonTemporal, 50>,
1395    VersionedClause<OMPC_NoWait>,
1396    VersionedClause<OMPC_Order, 50>,
1397    VersionedClause<OMPC_Ordered>,
1398    VersionedClause<OMPC_Private>,
1399    VersionedClause<OMPC_Reduction>,
1400    VersionedClause<OMPC_SafeLen>,
1401    VersionedClause<OMPC_Schedule>,
1402    VersionedClause<OMPC_SimdLen>,
1403  ];
1404  let leafConstructs = [OMP_For, OMP_Simd];
1405  let category = CA_Executable;
1406}
1407def OMP_target_loop : Directive<"target loop"> {
1408  let allowedClauses = [
1409    VersionedClause<OMPC_Allocate>,
1410    VersionedClause<OMPC_Depend>,
1411    VersionedClause<OMPC_FirstPrivate>,
1412    VersionedClause<OMPC_IsDevicePtr>,
1413    VersionedClause<OMPC_HasDeviceAddr, 51>,
1414    VersionedClause<OMPC_LastPrivate>,
1415    VersionedClause<OMPC_Map>,
1416    VersionedClause<OMPC_Private>,
1417    VersionedClause<OMPC_Reduction>,
1418    VersionedClause<OMPC_UsesAllocators, 50>,
1419    VersionedClause<OMPC_OMPX_Attribute>,
1420    VersionedClause<OMPC_InReduction, 50>,
1421
1422  ];
1423  let allowedOnceClauses = [
1424    VersionedClause<OMPC_Bind, 50>,
1425    VersionedClause<OMPC_Collapse>,
1426    VersionedClause<OMPC_Order>,
1427    VersionedClause<OMPC_ThreadLimit>,
1428    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1429    VersionedClause<OMPC_If>,
1430    VersionedClause<OMPC_Device>,
1431    VersionedClause<OMPC_DefaultMap>,
1432    VersionedClause<OMPC_NoWait>,
1433  ];
1434  let leafConstructs = [OMP_Target, OMP_loop];
1435  let category = CA_Executable;
1436}
1437def OMP_MaskedTaskloop : Directive<"masked taskloop"> {
1438  let allowedClauses = [
1439    VersionedClause<OMPC_Allocate>,
1440    VersionedClause<OMPC_Collapse>,
1441    VersionedClause<OMPC_Default>,
1442    VersionedClause<OMPC_Filter>,
1443    VersionedClause<OMPC_Final>,
1444    VersionedClause<OMPC_FirstPrivate>,
1445    VersionedClause<OMPC_GrainSize>,
1446    VersionedClause<OMPC_If>,
1447    VersionedClause<OMPC_InReduction>,
1448    VersionedClause<OMPC_LastPrivate>,
1449    VersionedClause<OMPC_Mergeable>,
1450    VersionedClause<OMPC_NoGroup>,
1451    VersionedClause<OMPC_NumTasks>,
1452    VersionedClause<OMPC_Priority>,
1453    VersionedClause<OMPC_Private>,
1454    VersionedClause<OMPC_Reduction>,
1455    VersionedClause<OMPC_Shared>,
1456    VersionedClause<OMPC_Untied>,
1457  ];
1458  let leafConstructs = [OMP_masked, OMP_TaskLoop];
1459  let category = CA_Executable;
1460}
1461def OMP_MaskedTaskloopSimd : Directive<"masked taskloop simd"> {
1462  let allowedClauses = [
1463    VersionedClause<OMPC_Aligned>,
1464    VersionedClause<OMPC_Allocate>,
1465    VersionedClause<OMPC_Collapse>,
1466    VersionedClause<OMPC_Default>,
1467    VersionedClause<OMPC_Filter>,
1468    VersionedClause<OMPC_Final>,
1469    VersionedClause<OMPC_FirstPrivate>,
1470    VersionedClause<OMPC_GrainSize>,
1471    VersionedClause<OMPC_If>,
1472    VersionedClause<OMPC_InReduction>,
1473    VersionedClause<OMPC_LastPrivate>,
1474    VersionedClause<OMPC_Linear>,
1475    VersionedClause<OMPC_Mergeable>,
1476    VersionedClause<OMPC_NoGroup>,
1477    VersionedClause<OMPC_NonTemporal, 50>,
1478    VersionedClause<OMPC_NumTasks>,
1479    VersionedClause<OMPC_Order, 50>,
1480    VersionedClause<OMPC_Priority>,
1481    VersionedClause<OMPC_Private>,
1482    VersionedClause<OMPC_Reduction>,
1483    VersionedClause<OMPC_SafeLen>,
1484    VersionedClause<OMPC_Shared>,
1485    VersionedClause<OMPC_SimdLen>,
1486    VersionedClause<OMPC_Untied>,
1487  ];
1488  let leafConstructs = [OMP_masked, OMP_TaskLoop, OMP_Simd];
1489  let category = CA_Executable;
1490}
1491def OMP_MasterTaskloop : Directive<"master taskloop"> {
1492  let allowedClauses = [
1493    VersionedClause<OMPC_Allocate>,
1494    VersionedClause<OMPC_Collapse>,
1495    VersionedClause<OMPC_Default>,
1496    VersionedClause<OMPC_Final>,
1497    VersionedClause<OMPC_FirstPrivate>,
1498    VersionedClause<OMPC_GrainSize>,
1499    VersionedClause<OMPC_If>,
1500    VersionedClause<OMPC_InReduction>,
1501    VersionedClause<OMPC_LastPrivate>,
1502    VersionedClause<OMPC_Mergeable>,
1503    VersionedClause<OMPC_NoGroup>,
1504    VersionedClause<OMPC_NumTasks>,
1505    VersionedClause<OMPC_Priority>,
1506    VersionedClause<OMPC_Private>,
1507    VersionedClause<OMPC_Reduction>,
1508    VersionedClause<OMPC_Shared>,
1509    VersionedClause<OMPC_Untied>,
1510  ];
1511  let leafConstructs = [OMP_Master, OMP_TaskLoop];
1512  let category = CA_Executable;
1513}
1514def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1515  let allowedClauses = [
1516    VersionedClause<OMPC_Aligned>,
1517    VersionedClause<OMPC_Allocate>,
1518    VersionedClause<OMPC_Collapse>,
1519    VersionedClause<OMPC_Default>,
1520    VersionedClause<OMPC_Final>,
1521    VersionedClause<OMPC_FirstPrivate>,
1522    VersionedClause<OMPC_GrainSize>,
1523    VersionedClause<OMPC_If>,
1524    VersionedClause<OMPC_InReduction>,
1525    VersionedClause<OMPC_LastPrivate>,
1526    VersionedClause<OMPC_Linear>,
1527    VersionedClause<OMPC_Mergeable>,
1528    VersionedClause<OMPC_NoGroup>,
1529    VersionedClause<OMPC_NonTemporal, 50>,
1530    VersionedClause<OMPC_NumTasks>,
1531    VersionedClause<OMPC_Order, 50>,
1532    VersionedClause<OMPC_Priority>,
1533    VersionedClause<OMPC_Private>,
1534    VersionedClause<OMPC_Reduction>,
1535    VersionedClause<OMPC_SafeLen>,
1536    VersionedClause<OMPC_Shared>,
1537    VersionedClause<OMPC_SimdLen>,
1538    VersionedClause<OMPC_Untied>,
1539  ];
1540  let leafConstructs = [OMP_Master, OMP_TaskLoop, OMP_Simd];
1541  let category = CA_Executable;
1542}
1543def OMP_ParallelDo : Directive<"parallel do"> {
1544  let allowedClauses = [
1545    VersionedClause<OMPC_Copyin>,
1546    VersionedClause<OMPC_Default>,
1547    VersionedClause<OMPC_FirstPrivate>,
1548    VersionedClause<OMPC_LastPrivate>,
1549    VersionedClause<OMPC_Linear>,
1550    VersionedClause<OMPC_Private>,
1551    VersionedClause<OMPC_Reduction>,
1552    VersionedClause<OMPC_Shared>,
1553  ];
1554  let allowedOnceClauses = [
1555    VersionedClause<OMPC_Collapse>,
1556    VersionedClause<OMPC_If>,
1557    VersionedClause<OMPC_NumThreads>,
1558    VersionedClause<OMPC_Order, 50>,
1559    VersionedClause<OMPC_Ordered>,
1560    VersionedClause<OMPC_ProcBind>,
1561    VersionedClause<OMPC_Schedule>,
1562  ];
1563  let leafConstructs = [OMP_Parallel, OMP_Do];
1564  let category = CA_Executable;
1565}
1566def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
1567  let allowedClauses = [
1568    VersionedClause<OMPC_Aligned>,
1569    VersionedClause<OMPC_Allocate>,
1570    VersionedClause<OMPC_Copyin>,
1571    VersionedClause<OMPC_Default>,
1572    VersionedClause<OMPC_FirstPrivate>,
1573    VersionedClause<OMPC_If>,
1574    VersionedClause<OMPC_LastPrivate>,
1575    VersionedClause<OMPC_Linear>,
1576    VersionedClause<OMPC_NonTemporal>,
1577    VersionedClause<OMPC_Private>,
1578    VersionedClause<OMPC_Reduction>,
1579    VersionedClause<OMPC_Shared>,
1580  ];
1581  let allowedOnceClauses = [
1582    VersionedClause<OMPC_Collapse>,
1583    VersionedClause<OMPC_NumThreads>,
1584    VersionedClause<OMPC_Order, 50>,
1585    VersionedClause<OMPC_Ordered>,
1586    VersionedClause<OMPC_ProcBind>,
1587    VersionedClause<OMPC_SafeLen>,
1588    VersionedClause<OMPC_Schedule>,
1589    VersionedClause<OMPC_SimdLen>,
1590  ];
1591  let leafConstructs = [OMP_Parallel, OMP_Do, OMP_Simd];
1592  let category = CA_Executable;
1593}
1594def OMP_ParallelFor : Directive<"parallel for"> {
1595  let allowedClauses = [
1596    VersionedClause<OMPC_Allocate>,
1597    VersionedClause<OMPC_Collapse>,
1598    VersionedClause<OMPC_Copyin>,
1599    VersionedClause<OMPC_Default>,
1600    VersionedClause<OMPC_FirstPrivate>,
1601    VersionedClause<OMPC_If>,
1602    VersionedClause<OMPC_LastPrivate>,
1603    VersionedClause<OMPC_Linear>,
1604    VersionedClause<OMPC_NumThreads>,
1605    VersionedClause<OMPC_OMPX_Attribute>,
1606    VersionedClause<OMPC_Order, 50>,
1607    VersionedClause<OMPC_Ordered>,
1608    VersionedClause<OMPC_Private>,
1609    VersionedClause<OMPC_ProcBind>,
1610    VersionedClause<OMPC_Reduction>,
1611    VersionedClause<OMPC_Schedule>,
1612    VersionedClause<OMPC_Shared>,
1613  ];
1614  let leafConstructs = [OMP_Parallel, OMP_For];
1615  let category = CA_Executable;
1616}
1617def OMP_ParallelForSimd : Directive<"parallel for simd"> {
1618  let allowedClauses = [
1619    VersionedClause<OMPC_Aligned>,
1620    VersionedClause<OMPC_Allocate>,
1621    VersionedClause<OMPC_Collapse>,
1622    VersionedClause<OMPC_Copyin>,
1623    VersionedClause<OMPC_Default>,
1624    VersionedClause<OMPC_FirstPrivate>,
1625    VersionedClause<OMPC_If>,
1626    VersionedClause<OMPC_LastPrivate>,
1627    VersionedClause<OMPC_Linear>,
1628    VersionedClause<OMPC_NonTemporal, 50>,
1629    VersionedClause<OMPC_NumThreads>,
1630    VersionedClause<OMPC_OMPX_Attribute>,
1631    VersionedClause<OMPC_Order, 50>,
1632    VersionedClause<OMPC_Ordered>,
1633    VersionedClause<OMPC_Private>,
1634    VersionedClause<OMPC_ProcBind>,
1635    VersionedClause<OMPC_Reduction>,
1636    VersionedClause<OMPC_SafeLen>,
1637    VersionedClause<OMPC_Schedule>,
1638    VersionedClause<OMPC_Shared>,
1639    VersionedClause<OMPC_SimdLen>,
1640  ];
1641  let leafConstructs = [OMP_Parallel, OMP_For, OMP_Simd];
1642  let category = CA_Executable;
1643}
1644def OMP_parallel_loop : Directive<"parallel loop"> {
1645  let allowedClauses = [
1646    VersionedClause<OMPC_Allocate>,
1647    VersionedClause<OMPC_Copyin>,
1648    VersionedClause<OMPC_FirstPrivate>,
1649    VersionedClause<OMPC_LastPrivate>,
1650    VersionedClause<OMPC_OMPX_Attribute>,
1651    VersionedClause<OMPC_Private>,
1652    VersionedClause<OMPC_Reduction>,
1653    VersionedClause<OMPC_Shared>,
1654  ];
1655  let allowedOnceClauses = [
1656    VersionedClause<OMPC_Bind, 50>,
1657    VersionedClause<OMPC_Collapse>,
1658    VersionedClause<OMPC_Default>,
1659    VersionedClause<OMPC_If>,
1660    VersionedClause<OMPC_NumThreads>,
1661    VersionedClause<OMPC_Order>,
1662    VersionedClause<OMPC_ProcBind>,
1663  ];
1664  let leafConstructs = [OMP_Parallel, OMP_loop];
1665  let category = CA_Executable;
1666}
1667def OMP_ParallelMasked : Directive<"parallel masked"> {
1668  let allowedClauses = [
1669    VersionedClause<OMPC_Allocate>,
1670    VersionedClause<OMPC_Copyin>,
1671    VersionedClause<OMPC_Default>,
1672    VersionedClause<OMPC_Filter>,
1673    VersionedClause<OMPC_FirstPrivate>,
1674    VersionedClause<OMPC_If>,
1675    VersionedClause<OMPC_NumThreads>,
1676    VersionedClause<OMPC_OMPX_Attribute>,
1677    VersionedClause<OMPC_Private>,
1678    VersionedClause<OMPC_ProcBind>,
1679    VersionedClause<OMPC_Reduction>,
1680    VersionedClause<OMPC_Shared>,
1681  ];
1682  let leafConstructs = [OMP_Parallel, OMP_masked];
1683  let category = CA_Executable;
1684}
1685def OMP_ParallelMaskedTaskloop :
1686    Directive<"parallel masked taskloop"> {
1687  let allowedClauses = [
1688    VersionedClause<OMPC_Allocate>,
1689    VersionedClause<OMPC_Collapse>,
1690    VersionedClause<OMPC_Copyin>,
1691    VersionedClause<OMPC_Default>,
1692    VersionedClause<OMPC_Filter>,
1693    VersionedClause<OMPC_Final>,
1694    VersionedClause<OMPC_FirstPrivate>,
1695    VersionedClause<OMPC_GrainSize>,
1696    VersionedClause<OMPC_If>,
1697    VersionedClause<OMPC_LastPrivate>,
1698    VersionedClause<OMPC_Mergeable>,
1699    VersionedClause<OMPC_NoGroup>,
1700    VersionedClause<OMPC_NumTasks>,
1701    VersionedClause<OMPC_NumThreads>,
1702    VersionedClause<OMPC_OMPX_Attribute>,
1703    VersionedClause<OMPC_Priority>,
1704    VersionedClause<OMPC_Private>,
1705    VersionedClause<OMPC_ProcBind>,
1706    VersionedClause<OMPC_Reduction>,
1707    VersionedClause<OMPC_Shared>,
1708    VersionedClause<OMPC_Untied>,
1709  ];
1710  let leafConstructs = [OMP_Parallel, OMP_masked, OMP_TaskLoop];
1711  let category = CA_Executable;
1712}
1713def OMP_ParallelMaskedTaskloopSimd :
1714    Directive<"parallel masked taskloop simd"> {
1715  let allowedClauses = [
1716    VersionedClause<OMPC_Aligned>,
1717    VersionedClause<OMPC_Allocate>,
1718    VersionedClause<OMPC_Collapse>,
1719    VersionedClause<OMPC_Copyin>,
1720    VersionedClause<OMPC_Default>,
1721    VersionedClause<OMPC_Filter>,
1722    VersionedClause<OMPC_Final>,
1723    VersionedClause<OMPC_FirstPrivate>,
1724    VersionedClause<OMPC_GrainSize>,
1725    VersionedClause<OMPC_If>,
1726    VersionedClause<OMPC_LastPrivate>,
1727    VersionedClause<OMPC_Linear>,
1728    VersionedClause<OMPC_Mergeable>,
1729    VersionedClause<OMPC_NoGroup>,
1730    VersionedClause<OMPC_NonTemporal, 50>,
1731    VersionedClause<OMPC_NumTasks>,
1732    VersionedClause<OMPC_NumThreads>,
1733    VersionedClause<OMPC_OMPX_Attribute>,
1734    VersionedClause<OMPC_Order, 50>,
1735    VersionedClause<OMPC_Priority>,
1736    VersionedClause<OMPC_Private>,
1737    VersionedClause<OMPC_ProcBind>,
1738    VersionedClause<OMPC_Reduction>,
1739    VersionedClause<OMPC_SafeLen>,
1740    VersionedClause<OMPC_Shared>,
1741    VersionedClause<OMPC_SimdLen>,
1742    VersionedClause<OMPC_Untied>,
1743  ];
1744  let leafConstructs = [OMP_Parallel, OMP_masked, OMP_TaskLoop, OMP_Simd];
1745  let category = CA_Executable;
1746}
1747def OMP_ParallelMaster : Directive<"parallel master"> {
1748  let allowedClauses = [
1749    VersionedClause<OMPC_Allocate>,
1750    VersionedClause<OMPC_Copyin>,
1751    VersionedClause<OMPC_Default>,
1752    VersionedClause<OMPC_FirstPrivate>,
1753    VersionedClause<OMPC_If>,
1754    VersionedClause<OMPC_NumThreads>,
1755    VersionedClause<OMPC_OMPX_Attribute>,
1756    VersionedClause<OMPC_Private>,
1757    VersionedClause<OMPC_ProcBind>,
1758    VersionedClause<OMPC_Reduction>,
1759    VersionedClause<OMPC_Shared>,
1760  ];
1761  let leafConstructs = [OMP_Parallel, OMP_Master];
1762  let category = CA_Executable;
1763}
1764def OMP_ParallelMasterTaskloop :
1765    Directive<"parallel master taskloop"> {
1766  let allowedClauses = [
1767    VersionedClause<OMPC_Allocate>,
1768    VersionedClause<OMPC_Collapse>,
1769    VersionedClause<OMPC_Copyin>,
1770    VersionedClause<OMPC_Default>,
1771    VersionedClause<OMPC_Final>,
1772    VersionedClause<OMPC_FirstPrivate>,
1773    VersionedClause<OMPC_GrainSize>,
1774    VersionedClause<OMPC_If>,
1775    VersionedClause<OMPC_LastPrivate>,
1776    VersionedClause<OMPC_Mergeable>,
1777    VersionedClause<OMPC_NoGroup>,
1778    VersionedClause<OMPC_NumTasks>,
1779    VersionedClause<OMPC_NumThreads>,
1780    VersionedClause<OMPC_OMPX_Attribute>,
1781    VersionedClause<OMPC_Priority>,
1782    VersionedClause<OMPC_Private>,
1783    VersionedClause<OMPC_ProcBind>,
1784    VersionedClause<OMPC_Reduction>,
1785    VersionedClause<OMPC_Shared>,
1786    VersionedClause<OMPC_Untied>,
1787  ];
1788  let leafConstructs = [OMP_Parallel, OMP_Master, OMP_TaskLoop];
1789  let category = CA_Executable;
1790}
1791def OMP_ParallelMasterTaskloopSimd :
1792    Directive<"parallel master taskloop simd"> {
1793  let allowedClauses = [
1794    VersionedClause<OMPC_Aligned>,
1795    VersionedClause<OMPC_Allocate>,
1796    VersionedClause<OMPC_Collapse>,
1797    VersionedClause<OMPC_Copyin>,
1798    VersionedClause<OMPC_Default>,
1799    VersionedClause<OMPC_Final>,
1800    VersionedClause<OMPC_FirstPrivate>,
1801    VersionedClause<OMPC_GrainSize>,
1802    VersionedClause<OMPC_If>,
1803    VersionedClause<OMPC_LastPrivate>,
1804    VersionedClause<OMPC_Linear>,
1805    VersionedClause<OMPC_Mergeable>,
1806    VersionedClause<OMPC_NoGroup>,
1807    VersionedClause<OMPC_NonTemporal, 50>,
1808    VersionedClause<OMPC_NumTasks>,
1809    VersionedClause<OMPC_NumThreads>,
1810    VersionedClause<OMPC_OMPX_Attribute>,
1811    VersionedClause<OMPC_Order, 50>,
1812    VersionedClause<OMPC_Priority>,
1813    VersionedClause<OMPC_Private>,
1814    VersionedClause<OMPC_ProcBind>,
1815    VersionedClause<OMPC_Reduction>,
1816    VersionedClause<OMPC_SafeLen>,
1817    VersionedClause<OMPC_Shared>,
1818    VersionedClause<OMPC_SimdLen>,
1819    VersionedClause<OMPC_Untied>,
1820  ];
1821  let leafConstructs = [OMP_Parallel, OMP_Master, OMP_TaskLoop, OMP_Simd];
1822  let category = CA_Executable;
1823}
1824def OMP_ParallelSections : Directive<"parallel sections"> {
1825  let allowedClauses = [
1826    VersionedClause<OMPC_Allocate>,
1827    VersionedClause<OMPC_Copyin>,
1828    VersionedClause<OMPC_Default>,
1829    VersionedClause<OMPC_FirstPrivate>,
1830    VersionedClause<OMPC_LastPrivate>,
1831    VersionedClause<OMPC_OMPX_Attribute>,
1832    VersionedClause<OMPC_Private>,
1833    VersionedClause<OMPC_ProcBind>,
1834    VersionedClause<OMPC_Reduction>,
1835    VersionedClause<OMPC_Shared>,
1836  ];
1837  let allowedOnceClauses = [
1838    VersionedClause<OMPC_If>,
1839    VersionedClause<OMPC_NumThreads>,
1840  ];
1841  let leafConstructs = [OMP_Parallel, OMP_Sections];
1842  let category = CA_Executable;
1843}
1844def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
1845  let allowedClauses = [
1846    VersionedClause<OMPC_Allocate>,
1847    VersionedClause<OMPC_Copyin>,
1848    VersionedClause<OMPC_Default>,
1849    VersionedClause<OMPC_FirstPrivate>,
1850    VersionedClause<OMPC_Private>,
1851    VersionedClause<OMPC_Reduction>,
1852    VersionedClause<OMPC_Shared>,
1853  ];
1854  let allowedOnceClauses = [
1855    VersionedClause<OMPC_If>,
1856    VersionedClause<OMPC_NumThreads>,
1857    VersionedClause<OMPC_ProcBind>,
1858  ];
1859  let leafConstructs = [OMP_Parallel, OMP_Workshare];
1860  let category = CA_Executable;
1861}
1862def OMP_TargetParallel : Directive<"target parallel"> {
1863  let allowedClauses = [
1864    VersionedClause<OMPC_Allocate>,
1865    VersionedClause<OMPC_Default>,
1866    VersionedClause<OMPC_Depend>,
1867    VersionedClause<OMPC_FirstPrivate>,
1868    VersionedClause<OMPC_HasDeviceAddr, 51>,
1869    VersionedClause<OMPC_If>,
1870    VersionedClause<OMPC_IsDevicePtr>,
1871    VersionedClause<OMPC_Map>,
1872    VersionedClause<OMPC_NoWait>,
1873    VersionedClause<OMPC_OMPX_Attribute>,
1874    VersionedClause<OMPC_Private>,
1875    VersionedClause<OMPC_Reduction>,
1876    VersionedClause<OMPC_Shared>,
1877    VersionedClause<OMPC_UsesAllocators, 50>,
1878  ];
1879  let allowedOnceClauses = [
1880    VersionedClause<OMPC_DefaultMap>,
1881    VersionedClause<OMPC_Device>,
1882    VersionedClause<OMPC_NumThreads>,
1883    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1884    VersionedClause<OMPC_ProcBind>,
1885    VersionedClause<OMPC_ThreadLimit, 51>,
1886  ];
1887  let leafConstructs = [OMP_Target, OMP_Parallel];
1888  let category = CA_Executable;
1889}
1890def OMP_TargetParallelDo : Directive<"target parallel do"> {
1891  let allowedClauses = [
1892    VersionedClause<OMPC_Allocator>,
1893    VersionedClause<OMPC_Default>,
1894    VersionedClause<OMPC_Depend>,
1895    VersionedClause<OMPC_FirstPrivate>,
1896    VersionedClause<OMPC_HasDeviceAddr, 51>,
1897    VersionedClause<OMPC_If>,
1898    VersionedClause<OMPC_IsDevicePtr>,
1899    VersionedClause<OMPC_LastPrivate>,
1900    VersionedClause<OMPC_Linear>,
1901    VersionedClause<OMPC_Map>,
1902    VersionedClause<OMPC_Private>,
1903    VersionedClause<OMPC_Reduction>,
1904    VersionedClause<OMPC_Shared>,
1905    VersionedClause<OMPC_UsesAllocators>,
1906  ];
1907  let allowedOnceClauses = [
1908    VersionedClause<OMPC_Collapse>,
1909    VersionedClause<OMPC_DefaultMap>,
1910    VersionedClause<OMPC_Device>,
1911    VersionedClause<OMPC_NoWait>,
1912    VersionedClause<OMPC_NumThreads>,
1913    VersionedClause<OMPC_Order, 50>,
1914    VersionedClause<OMPC_Ordered>,
1915    VersionedClause<OMPC_ProcBind>,
1916    VersionedClause<OMPC_Schedule>,
1917  ];
1918  let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do];
1919  let category = CA_Executable;
1920}
1921def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1922  let allowedClauses = [
1923    VersionedClause<OMPC_Aligned>,
1924    VersionedClause<OMPC_Allocate>,
1925    VersionedClause<OMPC_Collapse>,
1926    VersionedClause<OMPC_Default>,
1927    VersionedClause<OMPC_DefaultMap>,
1928    VersionedClause<OMPC_Depend>,
1929    VersionedClause<OMPC_Device>,
1930    VersionedClause<OMPC_FirstPrivate>,
1931    VersionedClause<OMPC_HasDeviceAddr, 51>,
1932    VersionedClause<OMPC_If>,
1933    VersionedClause<OMPC_IsDevicePtr>,
1934    VersionedClause<OMPC_LastPrivate>,
1935    VersionedClause<OMPC_Linear>,
1936    VersionedClause<OMPC_Map>,
1937    VersionedClause<OMPC_NonTemporal>,
1938    VersionedClause<OMPC_NoWait>,
1939    VersionedClause<OMPC_NumThreads>,
1940    VersionedClause<OMPC_Order, 50>,
1941    VersionedClause<OMPC_Ordered>,
1942    VersionedClause<OMPC_Private>,
1943    VersionedClause<OMPC_ProcBind>,
1944    VersionedClause<OMPC_Reduction>,
1945    VersionedClause<OMPC_SafeLen>,
1946    VersionedClause<OMPC_Schedule>,
1947    VersionedClause<OMPC_Shared>,
1948    VersionedClause<OMPC_SimdLen>,
1949    VersionedClause<OMPC_UsesAllocators>,
1950  ];
1951  let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do, OMP_Simd];
1952  let category = CA_Executable;
1953}
1954def OMP_TargetParallelFor : Directive<"target parallel for"> {
1955  let allowedClauses = [
1956    VersionedClause<OMPC_Allocate>,
1957    VersionedClause<OMPC_Collapse>,
1958    VersionedClause<OMPC_Default>,
1959    VersionedClause<OMPC_DefaultMap>,
1960    VersionedClause<OMPC_Depend>,
1961    VersionedClause<OMPC_Device>,
1962    VersionedClause<OMPC_FirstPrivate>,
1963    VersionedClause<OMPC_HasDeviceAddr, 51>,
1964    VersionedClause<OMPC_If>,
1965    VersionedClause<OMPC_IsDevicePtr>,
1966    VersionedClause<OMPC_LastPrivate>,
1967    VersionedClause<OMPC_Linear>,
1968    VersionedClause<OMPC_Map>,
1969    VersionedClause<OMPC_NoWait>,
1970    VersionedClause<OMPC_NumThreads>,
1971    VersionedClause<OMPC_OMPX_Attribute>,
1972    VersionedClause<OMPC_Order, 50>,
1973    VersionedClause<OMPC_Ordered>,
1974    VersionedClause<OMPC_Private>,
1975    VersionedClause<OMPC_ProcBind>,
1976    VersionedClause<OMPC_Reduction>,
1977    VersionedClause<OMPC_Schedule>,
1978    VersionedClause<OMPC_Shared>,
1979    VersionedClause<OMPC_UsesAllocators, 50>,
1980  ];
1981  let allowedOnceClauses = [
1982    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1983    VersionedClause<OMPC_ThreadLimit, 51>,
1984  ];
1985  let leafConstructs = [OMP_Target, OMP_Parallel, OMP_For];
1986  let category = CA_Executable;
1987}
1988def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1989  let allowedClauses = [
1990    VersionedClause<OMPC_Aligned>,
1991    VersionedClause<OMPC_Allocate>,
1992    VersionedClause<OMPC_Collapse>,
1993    VersionedClause<OMPC_Default>,
1994    VersionedClause<OMPC_DefaultMap>,
1995    VersionedClause<OMPC_Depend>,
1996    VersionedClause<OMPC_Device>,
1997    VersionedClause<OMPC_FirstPrivate>,
1998    VersionedClause<OMPC_HasDeviceAddr, 51>,
1999    VersionedClause<OMPC_If>,
2000    VersionedClause<OMPC_IsDevicePtr>,
2001    VersionedClause<OMPC_LastPrivate>,
2002    VersionedClause<OMPC_Linear>,
2003    VersionedClause<OMPC_Map>,
2004    VersionedClause<OMPC_NonTemporal, 50>,
2005    VersionedClause<OMPC_NoWait>,
2006    VersionedClause<OMPC_NumThreads>,
2007    VersionedClause<OMPC_OMPX_Attribute>,
2008    VersionedClause<OMPC_Order, 50>,
2009    VersionedClause<OMPC_Ordered>,
2010    VersionedClause<OMPC_Private>,
2011    VersionedClause<OMPC_ProcBind>,
2012    VersionedClause<OMPC_Reduction>,
2013    VersionedClause<OMPC_SafeLen>,
2014    VersionedClause<OMPC_Schedule>,
2015    VersionedClause<OMPC_Shared>,
2016    VersionedClause<OMPC_SimdLen>,
2017    VersionedClause<OMPC_UsesAllocators, 50>,
2018  ];
2019  let allowedOnceClauses = [
2020    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2021    VersionedClause<OMPC_ThreadLimit, 51>,
2022  ];
2023  let leafConstructs = [OMP_Target, OMP_Parallel, OMP_For, OMP_Simd];
2024  let category = CA_Executable;
2025}
2026def OMP_target_parallel_loop : Directive<"target parallel loop"> {
2027  let allowedClauses = [
2028    VersionedClause<OMPC_Allocate>,
2029    VersionedClause<OMPC_Depend>,
2030    VersionedClause<OMPC_Device>,
2031    VersionedClause<OMPC_FirstPrivate>,
2032    VersionedClause<OMPC_HasDeviceAddr, 51>,
2033    VersionedClause<OMPC_If>,
2034    VersionedClause<OMPC_IsDevicePtr>,
2035    VersionedClause<OMPC_LastPrivate>,
2036    VersionedClause<OMPC_Map>,
2037    VersionedClause<OMPC_OMPX_Attribute>,
2038    VersionedClause<OMPC_Private>,
2039    VersionedClause<OMPC_Reduction>,
2040    VersionedClause<OMPC_Shared>,
2041    VersionedClause<OMPC_UsesAllocators, 50>,
2042  ];
2043  let allowedOnceClauses = [
2044    VersionedClause<OMPC_Bind, 50>,
2045    VersionedClause<OMPC_Collapse>,
2046    VersionedClause<OMPC_Default>,
2047    VersionedClause<OMPC_DefaultMap>,
2048    VersionedClause<OMPC_NoWait>,
2049    VersionedClause<OMPC_NumThreads>,
2050    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2051    VersionedClause<OMPC_Order>,
2052    VersionedClause<OMPC_ProcBind>,
2053    VersionedClause<OMPC_ThreadLimit, 51>,
2054  ];
2055  let leafConstructs = [OMP_Target, OMP_Parallel, OMP_loop];
2056  let category = CA_Executable;
2057}
2058def OMP_TargetSimd : Directive<"target simd"> {
2059  let allowedClauses = [
2060    VersionedClause<OMPC_Aligned>,
2061    VersionedClause<OMPC_Allocate>,
2062    VersionedClause<OMPC_Depend>,
2063    VersionedClause<OMPC_FirstPrivate>,
2064    VersionedClause<OMPC_HasDeviceAddr, 51>,
2065    VersionedClause<OMPC_If>,
2066    VersionedClause<OMPC_IsDevicePtr>,
2067    VersionedClause<OMPC_LastPrivate>,
2068    VersionedClause<OMPC_Linear>,
2069    VersionedClause<OMPC_Map>,
2070    VersionedClause<OMPC_NonTemporal, 50>,
2071    VersionedClause<OMPC_NoWait>,
2072    VersionedClause<OMPC_OMPX_Attribute>,
2073    VersionedClause<OMPC_Private>,
2074    VersionedClause<OMPC_Reduction>,
2075    VersionedClause<OMPC_Shared>,
2076    VersionedClause<OMPC_UsesAllocators, 50>,
2077  ];
2078  let allowedOnceClauses = [
2079    VersionedClause<OMPC_Collapse>,
2080    VersionedClause<OMPC_DefaultMap>,
2081    VersionedClause<OMPC_Device>,
2082    VersionedClause<OMPC_NumThreads>,
2083    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2084    VersionedClause<OMPC_Order, 50>,
2085    VersionedClause<OMPC_ProcBind>,
2086    VersionedClause<OMPC_SafeLen>,
2087    VersionedClause<OMPC_Schedule>,
2088    VersionedClause<OMPC_SimdLen>,
2089    VersionedClause<OMPC_ThreadLimit, 51>,
2090  ];
2091  let leafConstructs = [OMP_Target, OMP_Simd];
2092  let category = CA_Executable;
2093}
2094def OMP_TargetTeams : Directive<"target teams"> {
2095  let allowedClauses = [
2096    VersionedClause<OMPC_Allocate>,
2097    VersionedClause<OMPC_Depend>,
2098    VersionedClause<OMPC_FirstPrivate>,
2099    VersionedClause<OMPC_HasDeviceAddr, 51>,
2100    VersionedClause<OMPC_If>,
2101    VersionedClause<OMPC_IsDevicePtr>,
2102    VersionedClause<OMPC_Map>,
2103    VersionedClause<OMPC_OMPX_Attribute>,
2104    VersionedClause<OMPC_Private>,
2105    VersionedClause<OMPC_Reduction>,
2106    VersionedClause<OMPC_Shared>,
2107    VersionedClause<OMPC_UsesAllocators, 50>,
2108  ];
2109  let allowedOnceClauses = [
2110    VersionedClause<OMPC_Default>,
2111    VersionedClause<OMPC_DefaultMap>,
2112    VersionedClause<OMPC_Device>,
2113    VersionedClause<OMPC_NoWait>,
2114    VersionedClause<OMPC_NumTeams>,
2115    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2116    VersionedClause<OMPC_OMPX_Bare>,
2117    VersionedClause<OMPC_ThreadLimit>,
2118  ];
2119  let leafConstructs = [OMP_Target, OMP_Teams];
2120  let category = CA_Executable;
2121}
2122def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
2123  let allowedClauses = [
2124    VersionedClause<OMPC_Allocate>,
2125    VersionedClause<OMPC_Depend>,
2126    VersionedClause<OMPC_FirstPrivate>,
2127    VersionedClause<OMPC_HasDeviceAddr, 51>,
2128    VersionedClause<OMPC_If>,
2129    VersionedClause<OMPC_IsDevicePtr>,
2130    VersionedClause<OMPC_LastPrivate>,
2131    VersionedClause<OMPC_Map>,
2132    VersionedClause<OMPC_OMPX_Attribute>,
2133    VersionedClause<OMPC_Private>,
2134    VersionedClause<OMPC_Reduction>,
2135    VersionedClause<OMPC_Shared>,
2136    VersionedClause<OMPC_UsesAllocators, 50>,
2137  ];
2138  let allowedOnceClauses = [
2139    VersionedClause<OMPC_Collapse>,
2140    VersionedClause<OMPC_Default>,
2141    VersionedClause<OMPC_DefaultMap>,
2142    VersionedClause<OMPC_Device>,
2143    VersionedClause<OMPC_DistSchedule>,
2144    VersionedClause<OMPC_NoWait>,
2145    VersionedClause<OMPC_NumTeams>,
2146    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2147    VersionedClause<OMPC_Order, 50>,
2148    VersionedClause<OMPC_ThreadLimit>,
2149  ];
2150  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute];
2151  let category = CA_Executable;
2152}
2153def OMP_TargetTeamsDistributeParallelDo :
2154    Directive<"target teams distribute parallel do"> {
2155  let allowedClauses = [
2156    VersionedClause<OMPC_Allocate>,
2157    VersionedClause<OMPC_Depend>,
2158    VersionedClause<OMPC_FirstPrivate>,
2159    VersionedClause<OMPC_HasDeviceAddr, 51>,
2160    VersionedClause<OMPC_If>,
2161    VersionedClause<OMPC_IsDevicePtr>,
2162    VersionedClause<OMPC_LastPrivate>,
2163    VersionedClause<OMPC_Linear>,
2164    VersionedClause<OMPC_Map>,
2165    VersionedClause<OMPC_Private>,
2166    VersionedClause<OMPC_Reduction>,
2167    VersionedClause<OMPC_Shared>,
2168    VersionedClause<OMPC_UsesAllocators>,
2169  ];
2170  let allowedOnceClauses = [
2171    VersionedClause<OMPC_Collapse>,
2172    VersionedClause<OMPC_Default>,
2173    VersionedClause<OMPC_DefaultMap>,
2174    VersionedClause<OMPC_Device>,
2175    VersionedClause<OMPC_DistSchedule>,
2176    VersionedClause<OMPC_NoWait>,
2177    VersionedClause<OMPC_NumTeams>,
2178    VersionedClause<OMPC_NumThreads>,
2179    VersionedClause<OMPC_Order, 50>,
2180    VersionedClause<OMPC_ProcBind>,
2181    VersionedClause<OMPC_Schedule>,
2182    VersionedClause<OMPC_ThreadLimit>,
2183  ];
2184  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do];
2185  let category = CA_Executable;
2186}
2187def OMP_TargetTeamsDistributeParallelDoSimd :
2188    Directive<"target teams distribute parallel do simd"> {
2189  let allowedClauses = [
2190    VersionedClause<OMPC_Aligned>,
2191    VersionedClause<OMPC_Allocate>,
2192    VersionedClause<OMPC_Depend>,
2193    VersionedClause<OMPC_FirstPrivate>,
2194    VersionedClause<OMPC_HasDeviceAddr, 51>,
2195    VersionedClause<OMPC_If>,
2196    VersionedClause<OMPC_IsDevicePtr>,
2197    VersionedClause<OMPC_LastPrivate>,
2198    VersionedClause<OMPC_Linear>,
2199    VersionedClause<OMPC_Map>,
2200    VersionedClause<OMPC_NonTemporal>,
2201    VersionedClause<OMPC_Private>,
2202    VersionedClause<OMPC_Reduction>,
2203    VersionedClause<OMPC_Shared>,
2204    VersionedClause<OMPC_UsesAllocators>,
2205  ];
2206  let allowedOnceClauses = [
2207    VersionedClause<OMPC_Collapse>,
2208    VersionedClause<OMPC_Default>,
2209    VersionedClause<OMPC_DefaultMap>,
2210    VersionedClause<OMPC_Device>,
2211    VersionedClause<OMPC_DistSchedule>,
2212    VersionedClause<OMPC_NoWait>,
2213    VersionedClause<OMPC_NumTeams>,
2214    VersionedClause<OMPC_NumThreads>,
2215    VersionedClause<OMPC_Order, 50>,
2216    VersionedClause<OMPC_ProcBind>,
2217    VersionedClause<OMPC_SafeLen>,
2218    VersionedClause<OMPC_Schedule>,
2219    VersionedClause<OMPC_SimdLen>,
2220    VersionedClause<OMPC_ThreadLimit>,
2221  ];
2222  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
2223  let category = CA_Executable;
2224}
2225def OMP_TargetTeamsDistributeParallelFor :
2226    Directive<"target teams distribute parallel for"> {
2227  let allowedClauses = [
2228    VersionedClause<OMPC_Allocate>,
2229    VersionedClause<OMPC_Collapse>,
2230    VersionedClause<OMPC_Default>,
2231    VersionedClause<OMPC_DefaultMap>,
2232    VersionedClause<OMPC_Depend>,
2233    VersionedClause<OMPC_Device>,
2234    VersionedClause<OMPC_DistSchedule>,
2235    VersionedClause<OMPC_FirstPrivate>,
2236    VersionedClause<OMPC_HasDeviceAddr, 51>,
2237    VersionedClause<OMPC_If>,
2238    VersionedClause<OMPC_IsDevicePtr>,
2239    VersionedClause<OMPC_LastPrivate>,
2240    VersionedClause<OMPC_Map>,
2241    VersionedClause<OMPC_NoWait>,
2242    VersionedClause<OMPC_NumTeams>,
2243    VersionedClause<OMPC_NumThreads>,
2244    VersionedClause<OMPC_OMPX_Attribute>,
2245    VersionedClause<OMPC_Order, 50>,
2246    VersionedClause<OMPC_Private>,
2247    VersionedClause<OMPC_ProcBind>,
2248    VersionedClause<OMPC_Reduction>,
2249    VersionedClause<OMPC_Schedule>,
2250    VersionedClause<OMPC_Shared>,
2251    VersionedClause<OMPC_ThreadLimit>,
2252    VersionedClause<OMPC_UsesAllocators, 50>,
2253  ];
2254  let allowedOnceClauses = [
2255    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2256  ];
2257  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
2258  let category = CA_Executable;
2259}
2260def OMP_TargetTeamsDistributeParallelForSimd :
2261    Directive<"target teams distribute parallel for simd"> {
2262  let allowedClauses = [
2263    VersionedClause<OMPC_Aligned>,
2264    VersionedClause<OMPC_Allocate>,
2265    VersionedClause<OMPC_Collapse>,
2266    VersionedClause<OMPC_Default>,
2267    VersionedClause<OMPC_DefaultMap>,
2268    VersionedClause<OMPC_Depend>,
2269    VersionedClause<OMPC_Device>,
2270    VersionedClause<OMPC_DistSchedule>,
2271    VersionedClause<OMPC_FirstPrivate>,
2272    VersionedClause<OMPC_HasDeviceAddr, 51>,
2273    VersionedClause<OMPC_If>,
2274    VersionedClause<OMPC_IsDevicePtr>,
2275    VersionedClause<OMPC_LastPrivate>,
2276    VersionedClause<OMPC_Linear>,
2277    VersionedClause<OMPC_Map>,
2278    VersionedClause<OMPC_NonTemporal, 50>,
2279    VersionedClause<OMPC_NoWait>,
2280    VersionedClause<OMPC_NumTeams>,
2281    VersionedClause<OMPC_NumThreads>,
2282    VersionedClause<OMPC_OMPX_Attribute>,
2283    VersionedClause<OMPC_Order, 50>,
2284    VersionedClause<OMPC_Private>,
2285    VersionedClause<OMPC_ProcBind>,
2286    VersionedClause<OMPC_Reduction>,
2287    VersionedClause<OMPC_SafeLen>,
2288    VersionedClause<OMPC_Schedule>,
2289    VersionedClause<OMPC_Shared>,
2290    VersionedClause<OMPC_SimdLen>,
2291    VersionedClause<OMPC_ThreadLimit>,
2292    VersionedClause<OMPC_UsesAllocators, 50>,
2293  ];
2294  let allowedOnceClauses = [
2295    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2296  ];
2297  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
2298  let category = CA_Executable;
2299}
2300def OMP_TargetTeamsDistributeSimd :
2301    Directive<"target teams distribute simd"> {
2302  let allowedClauses = [
2303    VersionedClause<OMPC_Aligned>,
2304    VersionedClause<OMPC_Allocate>,
2305    VersionedClause<OMPC_Depend>,
2306    VersionedClause<OMPC_FirstPrivate>,
2307    VersionedClause<OMPC_HasDeviceAddr, 51>,
2308    VersionedClause<OMPC_If>,
2309    VersionedClause<OMPC_IsDevicePtr>,
2310    VersionedClause<OMPC_LastPrivate>,
2311    VersionedClause<OMPC_Linear>,
2312    VersionedClause<OMPC_Map>,
2313    VersionedClause<OMPC_NonTemporal, 50>,
2314    VersionedClause<OMPC_OMPX_Attribute>,
2315    VersionedClause<OMPC_Private>,
2316    VersionedClause<OMPC_Reduction>,
2317    VersionedClause<OMPC_Shared>,
2318    VersionedClause<OMPC_UsesAllocators, 50>,
2319  ];
2320  let allowedOnceClauses = [
2321    VersionedClause<OMPC_Collapse>,
2322    VersionedClause<OMPC_DefaultMap>,
2323    VersionedClause<OMPC_Device>,
2324    VersionedClause<OMPC_DistSchedule>,
2325    VersionedClause<OMPC_NoWait>,
2326    VersionedClause<OMPC_NumTeams>,
2327    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2328    VersionedClause<OMPC_Order, 50>,
2329    VersionedClause<OMPC_SafeLen>,
2330    VersionedClause<OMPC_SimdLen>,
2331    VersionedClause<OMPC_ThreadLimit>,
2332  ];
2333  let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Simd];
2334  let category = CA_Executable;
2335}
2336def OMP_target_teams_loop : Directive<"target teams loop"> {
2337  let allowedClauses = [
2338    VersionedClause<OMPC_Allocate>,
2339    VersionedClause<OMPC_DefaultMap>,
2340    VersionedClause<OMPC_Depend>,
2341    VersionedClause<OMPC_Device>,
2342    VersionedClause<OMPC_FirstPrivate>,
2343    VersionedClause<OMPC_HasDeviceAddr, 51>,
2344    VersionedClause<OMPC_If>,
2345    VersionedClause<OMPC_IsDevicePtr>,
2346    VersionedClause<OMPC_LastPrivate>,
2347    VersionedClause<OMPC_Map>,
2348    VersionedClause<OMPC_OMPX_Attribute>,
2349    VersionedClause<OMPC_Private>,
2350    VersionedClause<OMPC_Reduction>,
2351    VersionedClause<OMPC_Shared>,
2352    VersionedClause<OMPC_UsesAllocators, 50>,
2353  ];
2354  let allowedOnceClauses = [
2355    VersionedClause<OMPC_Bind, 50>,
2356    VersionedClause<OMPC_Collapse>,
2357    VersionedClause<OMPC_Default>,
2358    VersionedClause<OMPC_NoWait>,
2359    VersionedClause<OMPC_NumTeams>,
2360    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2361    VersionedClause<OMPC_Order>,
2362    VersionedClause<OMPC_ThreadLimit>,
2363  ];
2364  let leafConstructs = [OMP_Target, OMP_Teams, OMP_loop];
2365  let category = CA_Executable;
2366}
2367def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
2368  let allowedClauses = [
2369    VersionedClause<OMPC_Aligned>,
2370    VersionedClause<OMPC_Allocate>,
2371    VersionedClause<OMPC_Default>,
2372    VersionedClause<OMPC_FirstPrivate>,
2373    VersionedClause<OMPC_If>,
2374    VersionedClause<OMPC_InReduction>,
2375    VersionedClause<OMPC_LastPrivate>,
2376    VersionedClause<OMPC_Linear>,
2377    VersionedClause<OMPC_Mergeable>,
2378    VersionedClause<OMPC_NoGroup>,
2379    VersionedClause<OMPC_NonTemporal, 50>,
2380    VersionedClause<OMPC_Private>,
2381    VersionedClause<OMPC_Reduction>,
2382    VersionedClause<OMPC_Shared>,
2383    VersionedClause<OMPC_Untied>,
2384  ];
2385  let allowedOnceClauses = [
2386    VersionedClause<OMPC_Collapse>,
2387    VersionedClause<OMPC_Final>,
2388    VersionedClause<OMPC_Order, 50>,
2389    VersionedClause<OMPC_Priority>,
2390    VersionedClause<OMPC_SafeLen>,
2391    VersionedClause<OMPC_SimdLen>,
2392  ];
2393  let allowedExclusiveClauses = [
2394    VersionedClause<OMPC_GrainSize>,
2395    VersionedClause<OMPC_NumTasks>,
2396  ];
2397  let leafConstructs = [OMP_TaskLoop, OMP_Simd];
2398  let category = CA_Executable;
2399}
2400def OMP_TeamsDistribute : Directive<"teams distribute"> {
2401  let allowedClauses = [
2402    VersionedClause<OMPC_Allocate>,
2403    VersionedClause<OMPC_Collapse>,
2404    VersionedClause<OMPC_Default>,
2405    VersionedClause<OMPC_DistSchedule>,
2406    VersionedClause<OMPC_FirstPrivate>,
2407    VersionedClause<OMPC_LastPrivate>,
2408    VersionedClause<OMPC_NumTeams>,
2409    VersionedClause<OMPC_OMPX_Attribute>,
2410    VersionedClause<OMPC_Private>,
2411    VersionedClause<OMPC_Reduction>,
2412    VersionedClause<OMPC_Shared>,
2413    VersionedClause<OMPC_ThreadLimit>,
2414  ];
2415  let allowedOnceClauses = [
2416    VersionedClause<OMPC_If>,
2417    VersionedClause<OMPC_Order, 50>,
2418  ];
2419  let leafConstructs = [OMP_Teams, OMP_Distribute];
2420  let category = CA_Executable;
2421}
2422def OMP_TeamsDistributeParallelDo :
2423    Directive<"teams distribute parallel do"> {
2424  let allowedClauses = [
2425    VersionedClause<OMPC_Allocate>,
2426    VersionedClause<OMPC_Copyin>,
2427    VersionedClause<OMPC_FirstPrivate>,
2428    VersionedClause<OMPC_If>,
2429    VersionedClause<OMPC_LastPrivate>,
2430    VersionedClause<OMPC_Linear>,
2431    VersionedClause<OMPC_Private>,
2432    VersionedClause<OMPC_Reduction>,
2433    VersionedClause<OMPC_Shared>,
2434  ];
2435  let allowedOnceClauses = [
2436    VersionedClause<OMPC_Collapse>,
2437    VersionedClause<OMPC_Default>,
2438    VersionedClause<OMPC_DistSchedule>,
2439    VersionedClause<OMPC_NumTeams>,
2440    VersionedClause<OMPC_NumThreads>,
2441    VersionedClause<OMPC_Order, 50>,
2442    VersionedClause<OMPC_ProcBind>,
2443    VersionedClause<OMPC_Schedule>,
2444    VersionedClause<OMPC_ThreadLimit>,
2445  ];
2446  let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do];
2447  let category = CA_Executable;
2448}
2449def OMP_TeamsDistributeParallelDoSimd :
2450    Directive<"teams distribute parallel do simd"> {
2451  let allowedClauses = [
2452    VersionedClause<OMPC_Aligned>,
2453    VersionedClause<OMPC_Allocate>,
2454    VersionedClause<OMPC_FirstPrivate>,
2455    VersionedClause<OMPC_If>,
2456    VersionedClause<OMPC_LastPrivate>,
2457    VersionedClause<OMPC_Linear>,
2458    VersionedClause<OMPC_NonTemporal>,
2459    VersionedClause<OMPC_Private>,
2460    VersionedClause<OMPC_Reduction>,
2461    VersionedClause<OMPC_Shared>,
2462  ];
2463  let allowedOnceClauses = [
2464    VersionedClause<OMPC_Collapse>,
2465    VersionedClause<OMPC_Default>,
2466    VersionedClause<OMPC_DistSchedule>,
2467    VersionedClause<OMPC_NumTeams>,
2468    VersionedClause<OMPC_NumThreads>,
2469    VersionedClause<OMPC_Order, 50>,
2470    VersionedClause<OMPC_ProcBind>,
2471    VersionedClause<OMPC_SafeLen>,
2472    VersionedClause<OMPC_Schedule>,
2473    VersionedClause<OMPC_SimdLen>,
2474    VersionedClause<OMPC_ThreadLimit>,
2475  ];
2476  let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
2477  let category = CA_Executable;
2478}
2479def OMP_TeamsDistributeParallelFor :
2480    Directive<"teams distribute parallel for"> {
2481  let allowedClauses = [
2482    VersionedClause<OMPC_Allocate>,
2483    VersionedClause<OMPC_Collapse>,
2484    VersionedClause<OMPC_Copyin>,
2485    VersionedClause<OMPC_Default>,
2486    VersionedClause<OMPC_DistSchedule>,
2487    VersionedClause<OMPC_FirstPrivate>,
2488    VersionedClause<OMPC_If>,
2489    VersionedClause<OMPC_LastPrivate>,
2490    VersionedClause<OMPC_NumTeams>,
2491    VersionedClause<OMPC_NumThreads>,
2492    VersionedClause<OMPC_OMPX_Attribute>,
2493    VersionedClause<OMPC_Order, 50>,
2494    VersionedClause<OMPC_Private>,
2495    VersionedClause<OMPC_ProcBind>,
2496    VersionedClause<OMPC_Reduction>,
2497    VersionedClause<OMPC_Schedule>,
2498    VersionedClause<OMPC_Shared>,
2499    VersionedClause<OMPC_ThreadLimit>,
2500  ];
2501  let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
2502  let category = CA_Executable;
2503}
2504def OMP_TeamsDistributeParallelForSimd :
2505    Directive<"teams distribute parallel for simd"> {
2506  let allowedClauses = [
2507    VersionedClause<OMPC_Aligned>,
2508    VersionedClause<OMPC_Allocate>,
2509    VersionedClause<OMPC_Collapse>,
2510    VersionedClause<OMPC_Default>,
2511    VersionedClause<OMPC_DistSchedule>,
2512    VersionedClause<OMPC_FirstPrivate>,
2513    VersionedClause<OMPC_If>,
2514    VersionedClause<OMPC_LastPrivate>,
2515    VersionedClause<OMPC_Linear>,
2516    VersionedClause<OMPC_NonTemporal, 50>,
2517    VersionedClause<OMPC_NumTeams>,
2518    VersionedClause<OMPC_NumThreads>,
2519    VersionedClause<OMPC_OMPX_Attribute>,
2520    VersionedClause<OMPC_Order, 50>,
2521    VersionedClause<OMPC_Private>,
2522    VersionedClause<OMPC_ProcBind>,
2523    VersionedClause<OMPC_Reduction>,
2524    VersionedClause<OMPC_SafeLen>,
2525    VersionedClause<OMPC_Schedule>,
2526    VersionedClause<OMPC_Shared>,
2527    VersionedClause<OMPC_SimdLen>,
2528    VersionedClause<OMPC_ThreadLimit>,
2529  ];
2530  let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
2531  let category = CA_Executable;
2532}
2533def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
2534  let allowedClauses = [
2535    VersionedClause<OMPC_Aligned>,
2536    VersionedClause<OMPC_Allocate>,
2537    VersionedClause<OMPC_FirstPrivate>,
2538    VersionedClause<OMPC_If, 50>,
2539    VersionedClause<OMPC_LastPrivate>,
2540    VersionedClause<OMPC_Linear>,
2541    VersionedClause<OMPC_NonTemporal, 50>,
2542    VersionedClause<OMPC_OMPX_Attribute>,
2543    VersionedClause<OMPC_Private>,
2544    VersionedClause<OMPC_Reduction>,
2545    VersionedClause<OMPC_Shared>,
2546  ];
2547  let allowedOnceClauses = [
2548    VersionedClause<OMPC_Collapse>,
2549    VersionedClause<OMPC_Default>,
2550    VersionedClause<OMPC_DistSchedule>,
2551    VersionedClause<OMPC_NumTeams>,
2552    VersionedClause<OMPC_Order, 50>,
2553    VersionedClause<OMPC_SafeLen>,
2554    VersionedClause<OMPC_SimdLen>,
2555    VersionedClause<OMPC_ThreadLimit>,
2556  ];
2557  let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Simd];
2558  let category = CA_Executable;
2559}
2560def OMP_teams_loop : Directive<"teams loop"> {
2561  let allowedClauses = [
2562    VersionedClause<OMPC_Allocate>,
2563    VersionedClause<OMPC_FirstPrivate>,
2564    VersionedClause<OMPC_LastPrivate>,
2565    VersionedClause<OMPC_OMPX_Attribute>,
2566    VersionedClause<OMPC_Private>,
2567    VersionedClause<OMPC_Reduction>,
2568    VersionedClause<OMPC_Shared>,
2569  ];
2570  let allowedOnceClauses = [
2571    VersionedClause<OMPC_Bind, 50>,
2572    VersionedClause<OMPC_Collapse>,
2573    VersionedClause<OMPC_Default>,
2574    VersionedClause<OMPC_NumTeams>,
2575    VersionedClause<OMPC_Order>,
2576    VersionedClause<OMPC_ThreadLimit>,
2577  ];
2578  let leafConstructs = [OMP_Teams, OMP_loop];
2579  let category = CA_Executable;
2580}
2581