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