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 includeHeader = "llvm/Frontend/OpenMP/OMP.h.inc";
27  let clauseEnumSetClass = "OmpClauseSet";
28  let flangClauseBaseClass = "OmpClause";
29}
30
31//===----------------------------------------------------------------------===//
32// Definition of OpenMP clauses
33//===----------------------------------------------------------------------===//
34
35def OMPC_Allocator : Clause<"allocator"> {
36  let clangClass = "OMPAllocatorClause";
37}
38def OMPC_If : Clause<"if"> {
39  let clangClass = "OMPIfClause";
40  let flangClass = "OmpIfClause";
41}
42def OMPC_Final : Clause<"final"> {
43  let clangClass = "OMPFinalClause";
44  let flangClassValue = "ScalarLogicalExpr";
45}
46def OMPC_NumThreads : Clause<"num_threads"> {
47  let clangClass = "OMPNumThreadsClause";
48  let flangClassValue = "ScalarIntExpr";
49}
50def OMPC_SafeLen : Clause<"safelen"> {
51  let clangClass = "OMPSafelenClause";
52  let flangClassValue = "ScalarIntConstantExpr";
53}
54def OMPC_SimdLen : Clause<"simdlen"> {
55  let clangClass = "OMPSimdlenClause";
56  let flangClassValue = "ScalarIntConstantExpr";
57}
58def OMPC_Collapse : Clause<"collapse"> {
59  let clangClass = "OMPCollapseClause";
60  let flangClassValue = "ScalarIntConstantExpr";
61}
62def OMPC_Default : Clause<"default"> {
63  let clangClass = "OMPDefaultClause";
64  let flangClass = "OmpDefaultClause";
65}
66def OMPC_Private : Clause<"private"> {
67  let clangClass = "OMPPrivateClause";
68  let flangClassValue = "OmpObjectList";
69}
70def OMPC_FirstPrivate : Clause<"firstprivate"> {
71  let clangClass = "OMPFirstprivateClause";
72  let flangClassValue = "OmpObjectList";
73}
74def OMPC_LastPrivate : Clause<"lastprivate"> {
75  let clangClass = "OMPLastprivateClause";
76  let flangClassValue = "OmpObjectList";
77}
78def OMPC_Shared : Clause<"shared"> {
79  let clangClass = "OMPSharedClause";
80  let flangClassValue = "OmpObjectList";
81}
82def OMPC_Reduction : Clause<"reduction"> {
83  let clangClass = "OMPReductionClause";
84  let flangClass = "OmpReductionClause";
85}
86def OMPC_Linear : Clause<"linear"> {
87  let clangClass = "OMPLinearClause";
88  let flangClass = "OmpLinearClause";
89}
90def OMPC_Aligned : Clause<"aligned"> {
91  let clangClass = "OMPAlignedClause";
92  let flangClass = "OmpAlignedClause";
93}
94def OMPC_Copyin : Clause<"copyin"> {
95  let clangClass = "OMPCopyinClause";
96  let flangClassValue = "OmpObjectList";
97}
98def OMPC_CopyPrivate : Clause<"copyprivate"> {
99  let clangClass = "OMPCopyprivateClause";
100  let flangClassValue = "OmpObjectList";
101}
102def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
103def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
104def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
105def OMP_PROC_BIND_default : ClauseVal<"default",5,0> {}
106def OMP_PROC_BIND_unknown : ClauseVal<"unknown",6,0> { let isDefault = true; }
107def OMPC_ProcBind : Clause<"proc_bind"> {
108  let clangClass = "OMPProcBindClause";
109  let flangClass = "OmpProcBindClause";
110  let enumClauseValue = "ProcBindKind";
111  let allowedClauseValues = [
112    OMP_PROC_BIND_master,
113    OMP_PROC_BIND_close,
114    OMP_PROC_BIND_spread,
115    OMP_PROC_BIND_default,
116    OMP_PROC_BIND_unknown
117  ];
118}
119
120// static and auto are C++ keywords so need a capital to disambiguate.
121def OMP_SCHEDULE_Static : ClauseVal<"Static", 2, 1> {}
122def OMP_SCHEDULE_Dynamic : ClauseVal<"Dynamic", 3, 1> {}
123def OMP_SCHEDULE_Guided : ClauseVal<"Guided", 4, 1> {}
124def OMP_SCHEDULE_Auto : ClauseVal<"Auto", 5, 1> {}
125def OMP_SCHEDULE_Runtime : ClauseVal<"Runtime", 6, 1> {}
126def OMP_SCHEDULE_Default : ClauseVal<"Default", 7, 0> { let isDefault = 1; }
127
128def OMPC_Schedule : Clause<"schedule"> {
129  let clangClass = "OMPScheduleClause";
130  let flangClass = "OmpScheduleClause";
131  let enumClauseValue = "ScheduleKind";
132  let allowedClauseValues = [
133    OMP_SCHEDULE_Static,
134    OMP_SCHEDULE_Dynamic,
135    OMP_SCHEDULE_Guided,
136    OMP_SCHEDULE_Auto,
137    OMP_SCHEDULE_Runtime,
138    OMP_SCHEDULE_Default
139  ];
140}
141
142def OMPC_Ordered : Clause<"ordered"> {
143  let clangClass = "OMPOrderedClause";
144  let flangClassValue = "ScalarIntConstantExpr";
145  let isValueOptional = true;
146}
147def OMPC_NoWait : Clause<"nowait"> {
148  let clangClass = "OMPNowaitClause";
149  let flangClass = "OmpNowait";
150}
151def OMPC_Untied : Clause<"untied"> { let clangClass = "OMPUntiedClause"; }
152def OMPC_Mergeable : Clause<"mergeable"> {
153  let clangClass = "OMPMergeableClause";
154}
155def OMPC_Read : Clause<"read"> { let clangClass = "OMPReadClause"; }
156def OMPC_Write : Clause<"write"> { let clangClass = "OMPWriteClause"; }
157def OMPC_Update : Clause<"update"> { let clangClass = "OMPUpdateClause"; }
158def OMPC_Capture : Clause<"capture"> { let clangClass = "OMPCaptureClause"; }
159def OMPC_SeqCst : Clause<"seq_cst"> { let clangClass = "OMPSeqCstClause"; }
160def OMPC_AcqRel : Clause<"acq_rel"> { let clangClass = "OMPAcqRelClause"; }
161def OMPC_Acquire : Clause<"acquire"> { let clangClass = "OMPAcquireClause"; }
162def OMPC_Release : Clause<"release"> { let clangClass = "OMPReleaseClause"; }
163def OMPC_Relaxed : Clause<"relaxed"> { let clangClass = "OMPRelaxedClause"; }
164def OMPC_Depend : Clause<"depend"> {
165  let clangClass = "OMPDependClause";
166  let flangClass = "OmpDependClause";
167}
168def OMPC_Device : Clause<"device"> {
169  let clangClass = "OMPDeviceClause";
170  let flangClassValue = "ScalarIntExpr";
171}
172def OMPC_Threads : Clause<"threads"> { let clangClass = "OMPThreadsClause"; }
173def OMPC_Simd : Clause<"simd"> { let clangClass = "OMPSIMDClause"; }
174def OMPC_Map : Clause<"map"> {
175  let clangClass = "OMPMapClause";
176  let flangClass = "OmpMapClause";
177}
178def OMPC_NumTeams : Clause<"num_teams"> {
179  let clangClass = "OMPNumTeamsClause";
180  let flangClassValue = "ScalarIntExpr";
181}
182def OMPC_ThreadLimit : Clause<"thread_limit"> {
183  let clangClass = "OMPThreadLimitClause";
184  let flangClassValue = "ScalarIntExpr";
185}
186def OMPC_Priority : Clause<"priority"> {
187  let clangClass = "OMPPriorityClause";
188  let flangClassValue = "ScalarIntExpr";
189}
190def OMPC_GrainSize : Clause<"grainsize"> {
191  let clangClass = "OMPGrainsizeClause";
192  let flangClassValue = "ScalarIntExpr";
193}
194def OMPC_NoGroup : Clause<"nogroup"> {
195  let clangClass = "OMPNogroupClause";
196}
197def OMPC_NumTasks : Clause<"num_tasks"> {
198  let clangClass = "OMPNumTasksClause";
199  let flangClassValue = "ScalarIntExpr";
200}
201def OMPC_Hint : Clause<"hint"> {
202  let clangClass = "OMPHintClause";
203  let flangClassValue = "ConstantExpr";
204}
205def OMPC_DistSchedule : Clause<"dist_schedule"> {
206  let clangClass = "OMPDistScheduleClause";
207  let flangClass = "OmpDistScheduleClause";
208  let flangClassValue = "ScalarIntExpr";
209  let isValueOptional = true;
210}
211def OMPC_DefaultMap : Clause<"defaultmap"> {
212  let clangClass = "OMPDefaultmapClause";
213  let flangClass = "OmpDefaultmapClause";
214}
215def OMPC_To : Clause<"to"> {
216  let clangClass = "OMPToClause";
217  let flangClassValue = "OmpObjectList";
218}
219def OMPC_From : Clause<"from"> {
220  let clangClass = "OMPFromClause";
221  let flangClassValue = "OmpObjectList";
222}
223def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
224  let clangClass = "OMPUseDevicePtrClause";
225  let flangClassValue = "Name";
226  let isValueList = true;
227}
228def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
229  let clangClass = "OMPIsDevicePtrClause";
230  let flangClassValue = "Name";
231  let isValueList = true;
232}
233def OMPC_TaskReduction : Clause<"task_reduction"> {
234  let clangClass = "OMPTaskReductionClause";
235}
236def OMPC_InReduction : Clause<"in_reduction"> {
237  let clangClass = "OMPInReductionClause";
238}
239def OMPC_UnifiedAddress : Clause<"unified_address"> {
240  let clangClass = "OMPUnifiedAddressClause";
241}
242def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
243  let clangClass = "OMPUnifiedSharedMemoryClause";
244}
245def OMPC_ReverseOffload : Clause<"reverse_offload"> {
246  let clangClass = "OMPReverseOffloadClause";
247}
248def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
249  let clangClass = "OMPDynamicAllocatorsClause";
250}
251def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
252  let clangClass = "OMPAtomicDefaultMemOrderClause";
253}
254def OMPC_Allocate : Clause<"allocate"> {
255  let clangClass = "OMPAllocateClause";
256  let flangClass = "OmpAllocateClause";
257}
258def OMPC_NonTemporal : Clause<"nontemporal"> {
259  let clangClass = "OMPNontemporalClause";
260}
261
262def OMP_ORDER_concurrent : ClauseVal<"default",2,0> { let isDefault = 1; }
263def OMPC_Order : Clause<"order"> {
264  let clangClass = "OMPOrderClause";
265  let enumClauseValue = "OrderKind";
266  let allowedClauseValues = [
267    OMP_ORDER_concurrent
268  ];
269}
270def OMPC_Destroy : Clause<"destroy"> {
271  let clangClass = "OMPDestroyClause";
272}
273def OMPC_Detach : Clause<"detach"> {
274  let clangClass = "OMPDetachClause";
275}
276def OMPC_Inclusive : Clause<"inclusive"> {
277  let clangClass = "OMPInclusiveClause";
278}
279def OMPC_Exclusive : Clause<"exclusive"> {
280  let clangClass = "OMPExclusiveClause";
281}
282def OMPC_UsesAllocators : Clause<"uses_allocators"> {
283  let clangClass = "OMPUsesAllocatorsClause";
284}
285def OMPC_Affinity : Clause<"affinity"> {
286  let clangClass = "OMPAffinityClause";
287}
288def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
289  let clangClass = "OMPUseDeviceAddrClause";
290}
291def OMPC_Uniform : Clause<"uniform"> {
292  let flangClassValue = "Name";
293  let isValueList = true;
294}
295def OMPC_DeviceType : Clause<"device_type"> {}
296def OMPC_Match : Clause<"match"> {}
297def OMPC_Depobj : Clause<"depobj"> {
298  let clangClass = "OMPDepobjClause";
299  let isImplicit = true;
300}
301def OMPC_Flush : Clause<"flush"> {
302  let clangClass = "OMPFlushClause";
303  let isImplicit = true;
304}
305def OMPC_ThreadPrivate : Clause<"threadprivate"> {
306  let alternativeName = "threadprivate or thread local";
307  let isImplicit = true;
308}
309def OMPC_Unknown : Clause<"unknown"> {
310  let isImplicit = true;
311  let isDefault = true;
312}
313def OMPC_Link : Clause<"link"> {
314  let flangClassValue = "OmpObjectList";
315}
316def OMPC_Inbranch : Clause<"inbranch"> {}
317def OMPC_Notinbranch : Clause<"notinbranch"> {}
318
319//===----------------------------------------------------------------------===//
320// Definition of OpenMP directives
321//===----------------------------------------------------------------------===//
322
323def OMP_ThreadPrivate : Directive<"threadprivate"> {}
324def OMP_Parallel : Directive<"parallel"> {
325  let allowedClauses = [
326    VersionedClause<OMPC_Private>,
327    VersionedClause<OMPC_FirstPrivate>,
328    VersionedClause<OMPC_Shared>,
329    VersionedClause<OMPC_Reduction>,
330    VersionedClause<OMPC_Copyin>,
331    VersionedClause<OMPC_Allocate>
332  ];
333  let allowedOnceClauses = [
334    VersionedClause<OMPC_Default>,
335    VersionedClause<OMPC_If>,
336    VersionedClause<OMPC_NumThreads>,
337    VersionedClause<OMPC_ProcBind>,
338  ];
339}
340def OMP_Task : Directive<"task"> {
341  let allowedClauses = [
342    VersionedClause<OMPC_Private>,
343    VersionedClause<OMPC_FirstPrivate>,
344    VersionedClause<OMPC_Shared>,
345    VersionedClause<OMPC_Untied>,
346    VersionedClause<OMPC_Mergeable>,
347    VersionedClause<OMPC_Depend>,
348    VersionedClause<OMPC_InReduction>,
349    VersionedClause<OMPC_Allocate>,
350    VersionedClause<OMPC_Detach, 50>,
351    VersionedClause<OMPC_Affinity, 50>
352  ];
353  let allowedOnceClauses = [
354    VersionedClause<OMPC_Default>,
355    VersionedClause<OMPC_If>,
356    VersionedClause<OMPC_Final>,
357    VersionedClause<OMPC_Priority>
358  ];
359}
360def OMP_Simd : Directive<"simd"> {
361  let allowedClauses = [
362    VersionedClause<OMPC_Private>,
363    VersionedClause<OMPC_LastPrivate>,
364    VersionedClause<OMPC_Linear>,
365    VersionedClause<OMPC_Aligned>,
366    VersionedClause<OMPC_Reduction>,
367    VersionedClause<OMPC_Allocate>,
368    VersionedClause<OMPC_NonTemporal, 50>,
369    VersionedClause<OMPC_Order, 50>
370  ];
371  let allowedOnceClauses = [
372    VersionedClause<OMPC_Collapse>,
373    VersionedClause<OMPC_SafeLen>,
374    VersionedClause<OMPC_SimdLen>,
375    VersionedClause<OMPC_If, 50>,
376  ];
377}
378def OMP_For : Directive<"for"> {
379  let allowedClauses = [
380    VersionedClause<OMPC_Private>,
381    VersionedClause<OMPC_LastPrivate>,
382    VersionedClause<OMPC_FirstPrivate>,
383    VersionedClause<OMPC_Reduction>,
384    VersionedClause<OMPC_Collapse>,
385    VersionedClause<OMPC_Schedule>,
386    VersionedClause<OMPC_Ordered>,
387    VersionedClause<OMPC_NoWait>,
388    VersionedClause<OMPC_Linear>,
389    VersionedClause<OMPC_Allocate>,
390    VersionedClause<OMPC_Order, 50>
391  ];
392}
393def OMP_Do : Directive<"do"> {
394  let allowedClauses = [
395    VersionedClause<OMPC_Private>,
396    VersionedClause<OMPC_FirstPrivate>,
397    VersionedClause<OMPC_LastPrivate>,
398    VersionedClause<OMPC_Linear>,
399    VersionedClause<OMPC_Reduction>
400  ];
401  let allowedOnceClauses = [
402    VersionedClause<OMPC_Schedule>,
403    VersionedClause<OMPC_Collapse>,
404    VersionedClause<OMPC_Ordered>,
405    VersionedClause<OMPC_NoWait>
406  ];
407}
408def OMP_Sections : Directive<"sections"> {
409  let allowedClauses = [
410    VersionedClause<OMPC_Private>,
411    VersionedClause<OMPC_LastPrivate>,
412    VersionedClause<OMPC_FirstPrivate>,
413    VersionedClause<OMPC_Reduction>,
414    VersionedClause<OMPC_NoWait>,
415    VersionedClause<OMPC_Allocate>
416  ];
417}
418def OMP_Section : Directive<"section"> {}
419def OMP_Single : Directive<"single"> {
420  let allowedClauses = [
421    VersionedClause<OMPC_Private>,
422    VersionedClause<OMPC_FirstPrivate>,
423    VersionedClause<OMPC_CopyPrivate>,
424    VersionedClause<OMPC_NoWait>,
425    VersionedClause<OMPC_Allocate>
426  ];
427}
428def OMP_Master : Directive<"master"> {}
429def OMP_Critical : Directive<"critical"> {
430  let allowedClauses = [
431    VersionedClause<OMPC_Hint>
432  ];
433}
434def OMP_TaskYield : Directive<"taskyield"> {}
435def OMP_Barrier : Directive<"barrier"> {}
436def OMP_TaskWait : Directive<"taskwait"> {
437  let allowedClauses = [
438    VersionedClause<OMPC_Depend, 50>
439  ];
440}
441def OMP_TaskGroup : Directive<"taskgroup"> {
442  let allowedClauses = [
443    VersionedClause<OMPC_TaskReduction>,
444    VersionedClause<OMPC_Allocate>
445  ];
446}
447def OMP_Flush : Directive<"flush"> {
448  let allowedClauses = [
449    VersionedClause<OMPC_AcqRel, 50>,
450    VersionedClause<OMPC_Acquire, 50>,
451    VersionedClause<OMPC_Release, 50>,
452    // TODO This should ne `none` instead. Comment carried over from
453    // OMPKinds.def.
454    VersionedClause<OMPC_Flush>
455  ];
456}
457def OMP_Ordered : Directive<"ordered"> {
458  let allowedClauses = [
459    VersionedClause<OMPC_Threads>,
460    VersionedClause<OMPC_Simd>,
461    VersionedClause<OMPC_Depend>
462  ];
463}
464def OMP_Atomic : Directive<"atomic"> {
465  let allowedClauses = [
466    VersionedClause<OMPC_Read>,
467    VersionedClause<OMPC_Write>,
468    VersionedClause<OMPC_Update>,
469    VersionedClause<OMPC_Capture>,
470    VersionedClause<OMPC_SeqCst>,
471    VersionedClause<OMPC_AcqRel, 50>,
472    VersionedClause<OMPC_Acquire, 50>,
473    VersionedClause<OMPC_Release, 50>,
474    VersionedClause<OMPC_Relaxed, 50>,
475    VersionedClause<OMPC_Hint, 50>
476  ];
477}
478def OMP_Target : Directive<"target"> {
479  let allowedClauses = [
480    VersionedClause<OMPC_If>,
481    VersionedClause<OMPC_Map>,
482    VersionedClause<OMPC_Private>,
483    VersionedClause<OMPC_Depend>,
484    VersionedClause<OMPC_FirstPrivate>,
485    VersionedClause<OMPC_IsDevicePtr>,
486    VersionedClause<OMPC_Reduction>,
487    VersionedClause<OMPC_Allocate>,
488    VersionedClause<OMPC_UsesAllocators, 50>
489  ];
490  let allowedOnceClauses = [
491    VersionedClause<OMPC_Device>,
492    VersionedClause<OMPC_DefaultMap>,
493    VersionedClause<OMPC_NoWait>
494  ];
495}
496def OMP_Teams : Directive<"teams"> {
497  let allowedClauses = [
498    VersionedClause<OMPC_Private>,
499    VersionedClause<OMPC_FirstPrivate>,
500    VersionedClause<OMPC_Shared>,
501    VersionedClause<OMPC_Reduction>,
502    VersionedClause<OMPC_Allocate>
503  ];
504  let allowedOnceClauses = [
505    VersionedClause<OMPC_Default>,
506    VersionedClause<OMPC_NumTeams>,
507    VersionedClause<OMPC_ThreadLimit>
508  ];
509}
510def OMP_Cancel : Directive<"cancel"> {
511  let allowedClauses = [
512    VersionedClause<OMPC_If>
513  ];
514}
515def OMP_Requires : Directive<"requires"> {
516  let allowedClauses = [
517    VersionedClause<OMPC_UnifiedAddress>,
518    VersionedClause<OMPC_UnifiedSharedMemory>,
519    VersionedClause<OMPC_ReverseOffload>,
520    VersionedClause<OMPC_DynamicAllocators>,
521    VersionedClause<OMPC_AtomicDefaultMemOrder>
522  ];
523}
524def OMP_TargetData : Directive<"target data"> {
525  let allowedClauses = [
526    VersionedClause<OMPC_UseDevicePtr>,
527    VersionedClause<OMPC_UseDeviceAddr, 50>
528  ];
529  let allowedOnceClauses = [
530    VersionedClause<OMPC_Device>,
531    VersionedClause<OMPC_If>
532  ];
533  let requiredClauses = [
534    VersionedClause<OMPC_Map>
535  ];
536}
537def OMP_TargetEnterData : Directive<"target enter data"> {
538  let allowedClauses = [
539    VersionedClause<OMPC_Depend>
540  ];
541  let allowedOnceClauses = [
542    VersionedClause<OMPC_If>,
543    VersionedClause<OMPC_Device>,
544    VersionedClause<OMPC_NoWait>
545  ];
546  let requiredClauses = [
547    VersionedClause<OMPC_Map>
548  ];
549}
550def OMP_TargetExitData : Directive<"target exit data"> {
551  let allowedClauses = [
552    VersionedClause<OMPC_Depend>
553  ];
554  let allowedOnceClauses = [
555    VersionedClause<OMPC_Device>,
556    VersionedClause<OMPC_If>,
557    VersionedClause<OMPC_NoWait>
558  ];
559  let requiredClauses = [
560    VersionedClause<OMPC_Map>
561  ];
562}
563def OMP_TargetParallel : Directive<"target parallel"> {
564  let allowedClauses = [
565    VersionedClause<OMPC_Map>,
566    VersionedClause<OMPC_NoWait>,
567    VersionedClause<OMPC_Depend>,
568    VersionedClause<OMPC_Private>,
569    VersionedClause<OMPC_FirstPrivate>,
570    VersionedClause<OMPC_Default>,
571    VersionedClause<OMPC_Shared>,
572    VersionedClause<OMPC_Reduction>,
573    VersionedClause<OMPC_IsDevicePtr>,
574    VersionedClause<OMPC_Allocate>,
575    VersionedClause<OMPC_UsesAllocators, 50>
576  ];
577  let allowedOnceClauses = [
578    VersionedClause<OMPC_DefaultMap>,
579    VersionedClause<OMPC_Device>,
580    VersionedClause<OMPC_If>,
581    VersionedClause<OMPC_NumThreads>,
582    VersionedClause<OMPC_ProcBind>
583  ];
584}
585def OMP_TargetParallelFor : Directive<"target parallel for"> {
586  let allowedClauses = [
587    VersionedClause<OMPC_If>,
588    VersionedClause<OMPC_Device>,
589    VersionedClause<OMPC_Map>,
590    VersionedClause<OMPC_Private>,
591    VersionedClause<OMPC_FirstPrivate>,
592    VersionedClause<OMPC_LastPrivate>,
593    VersionedClause<OMPC_NoWait>,
594    VersionedClause<OMPC_Depend>,
595    VersionedClause<OMPC_DefaultMap>,
596    VersionedClause<OMPC_NumThreads>,
597    VersionedClause<OMPC_Default>,
598    VersionedClause<OMPC_ProcBind>,
599    VersionedClause<OMPC_Shared>,
600    VersionedClause<OMPC_Reduction>,
601    VersionedClause<OMPC_Collapse>,
602    VersionedClause<OMPC_Schedule>,
603    VersionedClause<OMPC_Ordered>,
604    VersionedClause<OMPC_Linear>,
605    VersionedClause<OMPC_IsDevicePtr>,
606    VersionedClause<OMPC_Allocate>,
607    VersionedClause<OMPC_Order, 50>,
608    VersionedClause<OMPC_UsesAllocators, 50>
609  ];
610}
611def OMP_TargetParallelDo : Directive<"target parallel do"> {
612  let allowedClauses = [
613    VersionedClause<OMPC_Map>,
614    VersionedClause<OMPC_Private>,
615    VersionedClause<OMPC_FirstPrivate>,
616    VersionedClause<OMPC_LastPrivate>,
617    VersionedClause<OMPC_Depend>,
618    VersionedClause<OMPC_Shared>,
619    VersionedClause<OMPC_Reduction>,
620    VersionedClause<OMPC_Linear>,
621    VersionedClause<OMPC_IsDevicePtr>,
622    VersionedClause<OMPC_Allocator>,
623    VersionedClause<OMPC_Order>,
624    VersionedClause<OMPC_UsesAllocators>,
625    VersionedClause<OMPC_Default>,
626    VersionedClause<OMPC_Copyin>
627  ];
628  let allowedOnceClauses = [
629    VersionedClause<OMPC_If>,
630    VersionedClause<OMPC_NumThreads>,
631    VersionedClause<OMPC_ProcBind>,
632    VersionedClause<OMPC_Device>,
633    VersionedClause<OMPC_DefaultMap>,
634    VersionedClause<OMPC_Schedule>,
635    VersionedClause<OMPC_Collapse>,
636    VersionedClause<OMPC_Ordered>,
637    VersionedClause<OMPC_NoWait>
638  ];
639}
640def OMP_TargetUpdate : Directive<"target update"> {
641  let allowedClauses = [
642    VersionedClause<OMPC_If>,
643    VersionedClause<OMPC_Device>,
644    VersionedClause<OMPC_To>,
645    VersionedClause<OMPC_From>,
646    VersionedClause<OMPC_NoWait>,
647    VersionedClause<OMPC_Depend>
648  ];
649}
650def OMP_ParallelFor : Directive<"parallel for"> {
651  let allowedClauses = [
652    VersionedClause<OMPC_If>,
653    VersionedClause<OMPC_NumThreads>,
654    VersionedClause<OMPC_Default>,
655    VersionedClause<OMPC_ProcBind>,
656    VersionedClause<OMPC_Private>,
657    VersionedClause<OMPC_FirstPrivate>,
658    VersionedClause<OMPC_Shared>,
659    VersionedClause<OMPC_Reduction>,
660    VersionedClause<OMPC_Copyin>,
661    VersionedClause<OMPC_LastPrivate>,
662    VersionedClause<OMPC_Collapse>,
663    VersionedClause<OMPC_Schedule>,
664    VersionedClause<OMPC_Ordered>,
665    VersionedClause<OMPC_Linear>,
666    VersionedClause<OMPC_Allocate>,
667    VersionedClause<OMPC_Order, 50>
668  ];
669}
670def OMP_ParallelDo : Directive<"parallel do"> {
671  let allowedClauses = [
672    VersionedClause<OMPC_Default>,
673    VersionedClause<OMPC_Private>,
674    VersionedClause<OMPC_FirstPrivate>,
675    VersionedClause<OMPC_Shared>,
676    VersionedClause<OMPC_Reduction>,
677    VersionedClause<OMPC_Copyin>,
678    VersionedClause<OMPC_LastPrivate>,
679    VersionedClause<OMPC_Linear>
680  ];
681  let allowedOnceClauses = [
682    VersionedClause<OMPC_If>,
683    VersionedClause<OMPC_NumThreads>,
684    VersionedClause<OMPC_ProcBind>,
685    VersionedClause<OMPC_Schedule>,
686    VersionedClause<OMPC_Ordered>,
687    VersionedClause<OMPC_Collapse>
688  ];
689}
690def OMP_ParallelForSimd : Directive<"parallel for simd"> {
691  let allowedClauses = [
692    VersionedClause<OMPC_If>,
693    VersionedClause<OMPC_NumThreads>,
694    VersionedClause<OMPC_Default>,
695    VersionedClause<OMPC_ProcBind>,
696    VersionedClause<OMPC_Private>,
697    VersionedClause<OMPC_FirstPrivate>,
698    VersionedClause<OMPC_Shared>,
699    VersionedClause<OMPC_Reduction>,
700    VersionedClause<OMPC_Copyin>,
701    VersionedClause<OMPC_LastPrivate>,
702    VersionedClause<OMPC_Collapse>,
703    VersionedClause<OMPC_Schedule>,
704    VersionedClause<OMPC_SafeLen>,
705    VersionedClause<OMPC_SimdLen>,
706    VersionedClause<OMPC_Linear>,
707    VersionedClause<OMPC_Aligned>,
708    VersionedClause<OMPC_Ordered>,
709    VersionedClause<OMPC_Allocate>,
710    VersionedClause<OMPC_NonTemporal, 50>,
711    VersionedClause<OMPC_Order, 50>
712  ];
713}
714def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
715  let allowedClauses = [
716    VersionedClause<OMPC_Default>,
717    VersionedClause<OMPC_Private>,
718    VersionedClause<OMPC_FirstPrivate>,
719    VersionedClause<OMPC_Shared>,
720    VersionedClause<OMPC_Reduction>,
721    VersionedClause<OMPC_Copyin>,
722    VersionedClause<OMPC_LastPrivate>,
723    VersionedClause<OMPC_Linear>,
724    VersionedClause<OMPC_Aligned>,
725    VersionedClause<OMPC_Allocate>,
726    VersionedClause<OMPC_NonTemporal>,
727    VersionedClause<OMPC_Order>
728  ];
729  let allowedOnceClauses = [
730    VersionedClause<OMPC_If>,
731    VersionedClause<OMPC_NumThreads>,
732    VersionedClause<OMPC_ProcBind>,
733    VersionedClause<OMPC_Schedule>,
734    VersionedClause<OMPC_Ordered>,
735    VersionedClause<OMPC_Collapse>,
736    VersionedClause<OMPC_SafeLen>,
737    VersionedClause<OMPC_SimdLen>
738  ];
739}
740def OMP_ParallelMaster : Directive<"parallel master"> {
741  let allowedClauses = [
742    VersionedClause<OMPC_If>,
743    VersionedClause<OMPC_NumThreads>,
744    VersionedClause<OMPC_Default>,
745    VersionedClause<OMPC_Private>,
746    VersionedClause<OMPC_FirstPrivate>,
747    VersionedClause<OMPC_Shared>,
748    VersionedClause<OMPC_Copyin>,
749    VersionedClause<OMPC_Reduction>,
750    VersionedClause<OMPC_ProcBind>,
751    VersionedClause<OMPC_Allocate>
752  ];
753}
754def OMP_ParallelSections : Directive<"parallel sections"> {
755  let allowedClauses = [
756    VersionedClause<OMPC_If>,
757    VersionedClause<OMPC_Default>,
758    VersionedClause<OMPC_ProcBind>,
759    VersionedClause<OMPC_Private>,
760    VersionedClause<OMPC_FirstPrivate>,
761    VersionedClause<OMPC_Shared>,
762    VersionedClause<OMPC_Reduction>,
763    VersionedClause<OMPC_Copyin>,
764    VersionedClause<OMPC_LastPrivate>,
765    VersionedClause<OMPC_Allocate>
766  ];
767  let allowedOnceClauses = [
768    VersionedClause<OMPC_NumThreads>
769  ];
770}
771def OMP_ForSimd : Directive<"for simd"> {
772  let allowedClauses = [
773    VersionedClause<OMPC_Private>,
774    VersionedClause<OMPC_FirstPrivate>,
775    VersionedClause<OMPC_LastPrivate>,
776    VersionedClause<OMPC_Reduction>,
777    VersionedClause<OMPC_Schedule>,
778    VersionedClause<OMPC_Collapse>,
779    VersionedClause<OMPC_NoWait>,
780    VersionedClause<OMPC_SafeLen>,
781    VersionedClause<OMPC_SimdLen>,
782    VersionedClause<OMPC_Linear>,
783    VersionedClause<OMPC_Aligned>,
784    VersionedClause<OMPC_Ordered>,
785    VersionedClause<OMPC_Allocate>,
786    VersionedClause<OMPC_If, 50>,
787    VersionedClause<OMPC_NonTemporal, 50>,
788    VersionedClause<OMPC_Order, 50>,
789  ];
790}
791def OMP_DoSimd : Directive<"do simd"> {
792  let allowedClauses = [
793    VersionedClause<OMPC_Aligned>,
794    VersionedClause<OMPC_Private>,
795    VersionedClause<OMPC_FirstPrivate>,
796    VersionedClause<OMPC_LastPrivate>,
797    VersionedClause<OMPC_Linear>,
798    VersionedClause<OMPC_Reduction>
799  ];
800  let allowedOnceClauses = [
801    VersionedClause<OMPC_Schedule>,
802    VersionedClause<OMPC_Collapse>,
803    VersionedClause<OMPC_Ordered>,
804    VersionedClause<OMPC_SafeLen>,
805    VersionedClause<OMPC_SimdLen>,
806    VersionedClause<OMPC_NoWait>
807  ];
808}
809def OMP_CancellationPoint : Directive<"cancellation point"> {}
810def OMP_DeclareReduction : Directive<"declare reduction"> {}
811def OMP_DeclareMapper : Directive<"declare mapper"> {
812  let allowedClauses = [
813    VersionedClause<OMPC_Map>
814  ];
815}
816def OMP_DeclareSimd : Directive<"declare simd"> {
817  let allowedClauses = [
818    VersionedClause<OMPC_Linear>,
819    VersionedClause<OMPC_Aligned>,
820    VersionedClause<OMPC_Uniform>
821  ];
822  let allowedOnceClauses = [
823    VersionedClause<OMPC_SimdLen>
824  ];
825  let allowedExclusiveClauses = [
826    VersionedClause<OMPC_Inbranch>,
827    VersionedClause<OMPC_Notinbranch>
828  ];
829}
830def OMP_TaskLoop : Directive<"taskloop"> {
831  let allowedClauses = [
832    VersionedClause<OMPC_Shared>,
833    VersionedClause<OMPC_Private>,
834    VersionedClause<OMPC_FirstPrivate>,
835    VersionedClause<OMPC_LastPrivate>,
836    VersionedClause<OMPC_Untied>,
837    VersionedClause<OMPC_Mergeable>,
838    VersionedClause<OMPC_NoGroup>,
839    VersionedClause<OMPC_Reduction>,
840    VersionedClause<OMPC_InReduction>,
841    VersionedClause<OMPC_Allocate>
842  ];
843  let allowedOnceClauses = [
844    VersionedClause<OMPC_Default>,
845    VersionedClause<OMPC_If>,
846    VersionedClause<OMPC_Collapse>,
847    VersionedClause<OMPC_Final>,
848    VersionedClause<OMPC_Priority>,
849  ];
850  let allowedExclusiveClauses = [
851    VersionedClause<OMPC_GrainSize>,
852    VersionedClause<OMPC_NumTasks>
853  ];
854}
855def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
856  let allowedClauses = [
857    VersionedClause<OMPC_Aligned>,
858    VersionedClause<OMPC_Allocate>,
859    VersionedClause<OMPC_Default>,
860    VersionedClause<OMPC_FirstPrivate>,
861    VersionedClause<OMPC_InReduction>,
862    VersionedClause<OMPC_LastPrivate>,
863    VersionedClause<OMPC_Linear>,
864    VersionedClause<OMPC_Mergeable>,
865    VersionedClause<OMPC_NoGroup>,
866    VersionedClause<OMPC_NonTemporal, 50>,
867    VersionedClause<OMPC_Order, 50>,
868    VersionedClause<OMPC_Private>,
869    VersionedClause<OMPC_Reduction>,
870    VersionedClause<OMPC_Shared>,
871    VersionedClause<OMPC_Untied>
872  ];
873  let allowedOnceClauses = [
874    VersionedClause<OMPC_If>,
875    VersionedClause<OMPC_Collapse>,
876    VersionedClause<OMPC_SafeLen>,
877    VersionedClause<OMPC_SimdLen>,
878    VersionedClause<OMPC_Final>,
879    VersionedClause<OMPC_Priority>
880  ];
881  let allowedExclusiveClauses = [
882    VersionedClause<OMPC_GrainSize>,
883    VersionedClause<OMPC_NumTasks>
884  ];
885}
886def OMP_Distribute : Directive<"distribute"> {
887  let allowedClauses = [
888    VersionedClause<OMPC_Private>,
889    VersionedClause<OMPC_FirstPrivate>,
890    VersionedClause<OMPC_LastPrivate>,
891    VersionedClause<OMPC_Allocate>
892  ];
893  let allowedOnceClauses = [
894    VersionedClause<OMPC_Collapse>,
895    VersionedClause<OMPC_DistSchedule>
896  ];
897}
898def OMP_DeclareTarget : Directive<"declare target"> {
899  let allowedClauses = [
900    VersionedClause<OMPC_To>,
901    VersionedClause<OMPC_Link>
902  ];
903}
904def OMP_EndDeclareTarget : Directive<"end declare target"> {}
905def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
906  let allowedClauses = [
907    VersionedClause<OMPC_FirstPrivate>,
908    VersionedClause<OMPC_LastPrivate>,
909    VersionedClause<OMPC_Collapse>,
910    VersionedClause<OMPC_DistSchedule>,
911    VersionedClause<OMPC_If>,
912    VersionedClause<OMPC_NumThreads>,
913    VersionedClause<OMPC_Default>,
914    VersionedClause<OMPC_ProcBind>,
915    VersionedClause<OMPC_Private>,
916    VersionedClause<OMPC_Shared>,
917    VersionedClause<OMPC_Reduction>,
918    VersionedClause<OMPC_Copyin>,
919    VersionedClause<OMPC_Schedule>,
920    VersionedClause<OMPC_Allocate>,
921    VersionedClause<OMPC_Order, 50>
922  ];
923}
924def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
925  let allowedClauses = [
926    VersionedClause<OMPC_Private>,
927    VersionedClause<OMPC_FirstPrivate>,
928    VersionedClause<OMPC_LastPrivate>,
929    VersionedClause<OMPC_Allocate>,
930    VersionedClause<OMPC_Order>,
931    VersionedClause<OMPC_Default>,
932    VersionedClause<OMPC_Shared>,
933    VersionedClause<OMPC_Reduction>,
934    VersionedClause<OMPC_Copyin>,
935    VersionedClause<OMPC_Linear>
936  ];
937  let allowedOnceClauses = [
938    VersionedClause<OMPC_Collapse>,
939    VersionedClause<OMPC_DistSchedule>,
940    VersionedClause<OMPC_If>,
941    VersionedClause<OMPC_NumThreads>,
942    VersionedClause<OMPC_ProcBind>,
943    VersionedClause<OMPC_Schedule>,
944    VersionedClause<OMPC_Ordered>
945  ];
946}
947def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
948  let allowedClauses = [
949    VersionedClause<OMPC_FirstPrivate>,
950    VersionedClause<OMPC_LastPrivate>,
951    VersionedClause<OMPC_Collapse>,
952    VersionedClause<OMPC_DistSchedule>,
953    VersionedClause<OMPC_If>,
954    VersionedClause<OMPC_NumThreads>,
955    VersionedClause<OMPC_Default>,
956    VersionedClause<OMPC_ProcBind>,
957    VersionedClause<OMPC_Private>,
958    VersionedClause<OMPC_Shared>,
959    VersionedClause<OMPC_Reduction>,
960    VersionedClause<OMPC_Copyin>,
961    VersionedClause<OMPC_Schedule>,
962    VersionedClause<OMPC_Linear>,
963    VersionedClause<OMPC_Aligned>,
964    VersionedClause<OMPC_SafeLen>,
965    VersionedClause<OMPC_SimdLen>,
966    VersionedClause<OMPC_Allocate>,
967    VersionedClause<OMPC_NonTemporal, 50>,
968    VersionedClause<OMPC_Order, 50>
969  ];
970}
971def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
972  let allowedClauses = [
973    VersionedClause<OMPC_FirstPrivate>,
974    VersionedClause<OMPC_LastPrivate>,
975    VersionedClause<OMPC_Collapse>,
976    VersionedClause<OMPC_DistSchedule>,
977    VersionedClause<OMPC_If>,
978    VersionedClause<OMPC_NumThreads>,
979    VersionedClause<OMPC_Default>,
980    VersionedClause<OMPC_ProcBind>,
981    VersionedClause<OMPC_Private>,
982    VersionedClause<OMPC_Shared>,
983    VersionedClause<OMPC_Reduction>,
984    VersionedClause<OMPC_Copyin>,
985    VersionedClause<OMPC_Schedule>,
986    VersionedClause<OMPC_Linear>,
987    VersionedClause<OMPC_Aligned>,
988    VersionedClause<OMPC_SafeLen>,
989    VersionedClause<OMPC_SimdLen>,
990    VersionedClause<OMPC_Allocate>,
991    VersionedClause<OMPC_NonTemporal>,
992    VersionedClause<OMPC_Order>
993  ];
994}
995def OMP_DistributeSimd : Directive<"distribute simd"> {
996  let allowedClauses = [
997    VersionedClause<OMPC_Aligned>,
998    VersionedClause<OMPC_Allocate>,
999    VersionedClause<OMPC_Copyin>,
1000    VersionedClause<OMPC_Default>,
1001    VersionedClause<OMPC_Linear>,
1002    VersionedClause<OMPC_FirstPrivate>,
1003    VersionedClause<OMPC_LastPrivate>,
1004    VersionedClause<OMPC_NonTemporal, 50>,
1005    VersionedClause<OMPC_Order, 50>,
1006    VersionedClause<OMPC_Private>,
1007    VersionedClause<OMPC_Reduction>
1008  ];
1009  let allowedOnceClauses = [
1010    VersionedClause<OMPC_Collapse>,
1011    VersionedClause<OMPC_DistSchedule>,
1012    VersionedClause<OMPC_If, 50>,
1013    VersionedClause<OMPC_NumThreads>,
1014    VersionedClause<OMPC_Ordered>,
1015    VersionedClause<OMPC_ProcBind>,
1016    VersionedClause<OMPC_Schedule>,
1017    VersionedClause<OMPC_SafeLen>,
1018    VersionedClause<OMPC_SimdLen>
1019  ];
1020}
1021
1022def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1023  let allowedClauses = [
1024    VersionedClause<OMPC_If>,
1025    VersionedClause<OMPC_Device>,
1026    VersionedClause<OMPC_Map>,
1027    VersionedClause<OMPC_Private>,
1028    VersionedClause<OMPC_FirstPrivate>,
1029    VersionedClause<OMPC_LastPrivate>,
1030    VersionedClause<OMPC_NoWait>,
1031    VersionedClause<OMPC_Depend>,
1032    VersionedClause<OMPC_DefaultMap>,
1033    VersionedClause<OMPC_NumThreads>,
1034    VersionedClause<OMPC_Default>,
1035    VersionedClause<OMPC_ProcBind>,
1036    VersionedClause<OMPC_Shared>,
1037    VersionedClause<OMPC_Reduction>,
1038    VersionedClause<OMPC_Collapse>,
1039    VersionedClause<OMPC_Schedule>,
1040    VersionedClause<OMPC_Ordered>,
1041    VersionedClause<OMPC_Linear>,
1042    VersionedClause<OMPC_SafeLen>,
1043    VersionedClause<OMPC_SimdLen>,
1044    VersionedClause<OMPC_Aligned>,
1045    VersionedClause<OMPC_IsDevicePtr>,
1046    VersionedClause<OMPC_Allocate>,
1047    VersionedClause<OMPC_NonTemporal, 50>,
1048    VersionedClause<OMPC_Order, 50>,
1049    VersionedClause<OMPC_UsesAllocators, 50>
1050  ];
1051}
1052def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1053  let allowedClauses = [
1054    VersionedClause<OMPC_If>,
1055    VersionedClause<OMPC_Device>,
1056    VersionedClause<OMPC_Map>,
1057    VersionedClause<OMPC_Private>,
1058    VersionedClause<OMPC_FirstPrivate>,
1059    VersionedClause<OMPC_LastPrivate>,
1060    VersionedClause<OMPC_NoWait>,
1061    VersionedClause<OMPC_Depend>,
1062    VersionedClause<OMPC_DefaultMap>,
1063    VersionedClause<OMPC_NumThreads>,
1064    VersionedClause<OMPC_Default>,
1065    VersionedClause<OMPC_ProcBind>,
1066    VersionedClause<OMPC_Shared>,
1067    VersionedClause<OMPC_Reduction>,
1068    VersionedClause<OMPC_Collapse>,
1069    VersionedClause<OMPC_Schedule>,
1070    VersionedClause<OMPC_Ordered>,
1071    VersionedClause<OMPC_Linear>,
1072    VersionedClause<OMPC_SafeLen>,
1073    VersionedClause<OMPC_SimdLen>,
1074    VersionedClause<OMPC_Aligned>,
1075    VersionedClause<OMPC_IsDevicePtr>,
1076    VersionedClause<OMPC_Allocate>,
1077    VersionedClause<OMPC_NonTemporal>,
1078    VersionedClause<OMPC_Order>,
1079    VersionedClause<OMPC_UsesAllocators>
1080  ];
1081}
1082def OMP_TargetSimd : Directive<"target simd"> {
1083  let allowedClauses = [
1084    VersionedClause<OMPC_Aligned>,
1085    VersionedClause<OMPC_Allocate>,
1086    VersionedClause<OMPC_Depend>,
1087    VersionedClause<OMPC_FirstPrivate>,
1088    VersionedClause<OMPC_IsDevicePtr>,
1089    VersionedClause<OMPC_LastPrivate>,
1090    VersionedClause<OMPC_Linear>,
1091    VersionedClause<OMPC_Map>,
1092    VersionedClause<OMPC_NonTemporal, 50>,
1093    VersionedClause<OMPC_NoWait>,
1094    VersionedClause<OMPC_Order, 50>,
1095    VersionedClause<OMPC_Private>,
1096    VersionedClause<OMPC_Reduction>,
1097    VersionedClause<OMPC_Shared>,
1098    VersionedClause<OMPC_UsesAllocators, 50>
1099  ];
1100  let allowedOnceClauses = [
1101    VersionedClause<OMPC_Collapse>,
1102    VersionedClause<OMPC_SafeLen>,
1103    VersionedClause<OMPC_SimdLen>,
1104    VersionedClause<OMPC_If>,
1105    VersionedClause<OMPC_NumThreads>,
1106    VersionedClause<OMPC_ProcBind>,
1107    VersionedClause<OMPC_Device>,
1108    VersionedClause<OMPC_DefaultMap>,
1109    VersionedClause<OMPC_Schedule>
1110  ];
1111}
1112def OMP_TeamsDistribute : Directive<"teams distribute"> {
1113  let allowedClauses = [
1114    VersionedClause<OMPC_Default>,
1115    VersionedClause<OMPC_Private>,
1116    VersionedClause<OMPC_FirstPrivate>,
1117    VersionedClause<OMPC_Shared>,
1118    VersionedClause<OMPC_Reduction>,
1119    VersionedClause<OMPC_NumTeams>,
1120    VersionedClause<OMPC_ThreadLimit>,
1121    VersionedClause<OMPC_LastPrivate>,
1122    VersionedClause<OMPC_Collapse>,
1123    VersionedClause<OMPC_DistSchedule>,
1124    VersionedClause<OMPC_Allocate>
1125  ];
1126}
1127def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
1128  let allowedClauses = [
1129    VersionedClause<OMPC_Aligned>,
1130    VersionedClause<OMPC_Allocate>,
1131    VersionedClause<OMPC_FirstPrivate>,
1132    VersionedClause<OMPC_LastPrivate>,
1133    VersionedClause<OMPC_Linear>,
1134    VersionedClause<OMPC_NonTemporal, 50>,
1135    VersionedClause<OMPC_Order, 50>,
1136    VersionedClause<OMPC_Private>,
1137    VersionedClause<OMPC_Reduction>,
1138    VersionedClause<OMPC_Shared>
1139  ];
1140  let allowedOnceClauses = [
1141    VersionedClause<OMPC_Collapse>,
1142    VersionedClause<OMPC_Default>,
1143    VersionedClause<OMPC_DistSchedule>,
1144    VersionedClause<OMPC_If, 50>,
1145    VersionedClause<OMPC_NumTeams>,
1146    VersionedClause<OMPC_SafeLen>,
1147    VersionedClause<OMPC_SimdLen>,
1148    VersionedClause<OMPC_ThreadLimit>
1149  ];
1150}
1151
1152def OMP_TeamsDistributeParallelForSimd :
1153    Directive<"teams distribute parallel for simd"> {
1154  let allowedClauses = [
1155    VersionedClause<OMPC_FirstPrivate>,
1156    VersionedClause<OMPC_LastPrivate>,
1157    VersionedClause<OMPC_Collapse>,
1158    VersionedClause<OMPC_DistSchedule>,
1159    VersionedClause<OMPC_If>,
1160    VersionedClause<OMPC_NumThreads>,
1161    VersionedClause<OMPC_Default>,
1162    VersionedClause<OMPC_ProcBind>,
1163    VersionedClause<OMPC_Private>,
1164    VersionedClause<OMPC_Shared>,
1165    VersionedClause<OMPC_Reduction>,
1166    VersionedClause<OMPC_Schedule>,
1167    VersionedClause<OMPC_Linear>,
1168    VersionedClause<OMPC_Aligned>,
1169    VersionedClause<OMPC_SafeLen>,
1170    VersionedClause<OMPC_SimdLen>,
1171    VersionedClause<OMPC_NumTeams>,
1172    VersionedClause<OMPC_ThreadLimit>,
1173    VersionedClause<OMPC_Allocate>,
1174    VersionedClause<OMPC_NonTemporal, 50>,
1175    VersionedClause<OMPC_Order, 50>
1176  ];
1177}
1178def OMP_TeamsDistributeParallelDoSimd :
1179    Directive<"teams distribute parallel do simd"> {
1180  let allowedClauses = [
1181    VersionedClause<OMPC_Private>,
1182    VersionedClause<OMPC_FirstPrivate>,
1183    VersionedClause<OMPC_LastPrivate>,
1184    VersionedClause<OMPC_Allocate>,
1185    VersionedClause<OMPC_Shared>,
1186    VersionedClause<OMPC_Reduction>,
1187    VersionedClause<OMPC_Linear>,
1188    VersionedClause<OMPC_Order>,
1189    VersionedClause<OMPC_Aligned>,
1190    VersionedClause<OMPC_NonTemporal>
1191  ];
1192  let allowedOnceClauses = [
1193    VersionedClause<OMPC_Default>,
1194    VersionedClause<OMPC_NumTeams>,
1195    VersionedClause<OMPC_ThreadLimit>,
1196    VersionedClause<OMPC_Collapse>,
1197    VersionedClause<OMPC_DistSchedule>,
1198    VersionedClause<OMPC_NumThreads>,
1199    VersionedClause<OMPC_ProcBind>,
1200    VersionedClause<OMPC_Schedule>,
1201    VersionedClause<OMPC_SafeLen>,
1202    VersionedClause<OMPC_SimdLen>,
1203    VersionedClause<OMPC_If>,
1204  ];
1205}
1206def OMP_TeamsDistributeParallelFor :
1207    Directive<"teams distribute parallel for"> {
1208  let allowedClauses = [
1209    VersionedClause<OMPC_FirstPrivate>,
1210    VersionedClause<OMPC_LastPrivate>,
1211    VersionedClause<OMPC_Collapse>,
1212    VersionedClause<OMPC_DistSchedule>,
1213    VersionedClause<OMPC_If>,
1214    VersionedClause<OMPC_NumThreads>,
1215    VersionedClause<OMPC_Default>,
1216    VersionedClause<OMPC_ProcBind>,
1217    VersionedClause<OMPC_Private>,
1218    VersionedClause<OMPC_Shared>,
1219    VersionedClause<OMPC_Reduction>,
1220    VersionedClause<OMPC_Schedule>,
1221    VersionedClause<OMPC_NumTeams>,
1222    VersionedClause<OMPC_ThreadLimit>,
1223    VersionedClause<OMPC_Copyin>,
1224    VersionedClause<OMPC_Allocate>,
1225    VersionedClause<OMPC_Order, 50>
1226  ];
1227}
1228def OMP_TeamsDistributeParallelDo :
1229    Directive<"teams distribute parallel do"> {
1230  let allowedClauses = [
1231    VersionedClause<OMPC_Private>,
1232    VersionedClause<OMPC_FirstPrivate>,
1233    VersionedClause<OMPC_LastPrivate>,
1234    VersionedClause<OMPC_Shared>,
1235    VersionedClause<OMPC_Reduction>,
1236    VersionedClause<OMPC_Allocate>,
1237    VersionedClause<OMPC_Copyin>,
1238    VersionedClause<OMPC_Linear>
1239  ];
1240let allowedOnceClauses = [
1241    VersionedClause<OMPC_NumTeams>,
1242    VersionedClause<OMPC_ThreadLimit>,
1243    VersionedClause<OMPC_Default>,
1244    VersionedClause<OMPC_Collapse>,
1245    VersionedClause<OMPC_DistSchedule>,
1246    VersionedClause<OMPC_Ordered>,
1247    VersionedClause<OMPC_Order>,
1248    VersionedClause<OMPC_If>,
1249    VersionedClause<OMPC_NumThreads>,
1250    VersionedClause<OMPC_ProcBind>,
1251    VersionedClause<OMPC_Schedule>
1252  ];
1253}
1254def OMP_TargetTeams : Directive<"target teams"> {
1255  let allowedClauses = [
1256    VersionedClause<OMPC_If>,
1257    VersionedClause<OMPC_Map>,
1258    VersionedClause<OMPC_Private>,
1259    VersionedClause<OMPC_Depend>,
1260    VersionedClause<OMPC_FirstPrivate>,
1261    VersionedClause<OMPC_IsDevicePtr>,
1262    VersionedClause<OMPC_Reduction>,
1263    VersionedClause<OMPC_Allocate>,
1264    VersionedClause<OMPC_UsesAllocators, 50>,
1265    VersionedClause<OMPC_Shared>
1266  ];
1267
1268  let allowedOnceClauses = [
1269    VersionedClause<OMPC_Device>,
1270    VersionedClause<OMPC_NoWait>,
1271    VersionedClause<OMPC_DefaultMap>,
1272    VersionedClause<OMPC_Default>,
1273    VersionedClause<OMPC_NumTeams>,
1274    VersionedClause<OMPC_ThreadLimit>
1275  ];
1276}
1277def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
1278  let allowedClauses = [
1279    VersionedClause<OMPC_If>,
1280    VersionedClause<OMPC_Map>,
1281    VersionedClause<OMPC_Private>,
1282    VersionedClause<OMPC_Depend>,
1283    VersionedClause<OMPC_FirstPrivate>,
1284    VersionedClause<OMPC_IsDevicePtr>,
1285    VersionedClause<OMPC_Reduction>,
1286    VersionedClause<OMPC_Allocate>,
1287    VersionedClause<OMPC_UsesAllocators, 50>,
1288    VersionedClause<OMPC_Shared>,
1289    VersionedClause<OMPC_LastPrivate>
1290  ];
1291  let allowedOnceClauses = [
1292    VersionedClause<OMPC_Device>,
1293    VersionedClause<OMPC_NoWait>,
1294    VersionedClause<OMPC_DefaultMap>,
1295    VersionedClause<OMPC_Default>,
1296    VersionedClause<OMPC_NumTeams>,
1297    VersionedClause<OMPC_ThreadLimit>,
1298    VersionedClause<OMPC_Collapse>,
1299    VersionedClause<OMPC_DistSchedule>
1300  ];
1301}
1302
1303def OMP_TargetTeamsDistributeParallelFor :
1304    Directive<"target teams distribute parallel for"> {
1305  let allowedClauses = [
1306    VersionedClause<OMPC_If>,
1307    VersionedClause<OMPC_Device>,
1308    VersionedClause<OMPC_Map>,
1309    VersionedClause<OMPC_Private>,
1310    VersionedClause<OMPC_NoWait>,
1311    VersionedClause<OMPC_Depend>,
1312    VersionedClause<OMPC_DefaultMap>,
1313    VersionedClause<OMPC_FirstPrivate>,
1314    VersionedClause<OMPC_IsDevicePtr>,
1315    VersionedClause<OMPC_Default>,
1316    VersionedClause<OMPC_Shared>,
1317    VersionedClause<OMPC_Reduction>,
1318    VersionedClause<OMPC_NumTeams>,
1319    VersionedClause<OMPC_ThreadLimit>,
1320    VersionedClause<OMPC_LastPrivate>,
1321    VersionedClause<OMPC_Collapse>,
1322    VersionedClause<OMPC_DistSchedule>,
1323    VersionedClause<OMPC_NumThreads>,
1324    VersionedClause<OMPC_ProcBind>,
1325    VersionedClause<OMPC_Schedule>,
1326    VersionedClause<OMPC_Allocate>,
1327    VersionedClause<OMPC_Order, 50>,
1328    VersionedClause<OMPC_UsesAllocators, 50>
1329  ];
1330}
1331def OMP_TargetTeamsDistributeParallelDo :
1332    Directive<"target teams distribute parallel do"> {
1333  let allowedClauses = [
1334    VersionedClause<OMPC_If>,
1335    VersionedClause<OMPC_Map>,
1336    VersionedClause<OMPC_Private>,
1337    VersionedClause<OMPC_Depend>,
1338    VersionedClause<OMPC_FirstPrivate>,
1339    VersionedClause<OMPC_IsDevicePtr>,
1340    VersionedClause<OMPC_Reduction>,
1341    VersionedClause<OMPC_Allocate>,
1342    VersionedClause<OMPC_UsesAllocators>,
1343    VersionedClause<OMPC_Shared>,
1344    VersionedClause<OMPC_LastPrivate>,
1345    VersionedClause<OMPC_Copyin>,
1346    VersionedClause<OMPC_Linear>,
1347    VersionedClause<OMPC_Ordered>,
1348    VersionedClause<OMPC_Order>
1349  ];
1350  let allowedOnceClauses = [
1351    VersionedClause<OMPC_Device>,
1352    VersionedClause<OMPC_DefaultMap>,
1353    VersionedClause<OMPC_NoWait>,
1354    VersionedClause<OMPC_Default>,
1355    VersionedClause<OMPC_NumTeams>,
1356    VersionedClause<OMPC_ThreadLimit>,
1357    VersionedClause<OMPC_Collapse>,
1358    VersionedClause<OMPC_DistSchedule>,
1359    VersionedClause<OMPC_NumThreads>,
1360    VersionedClause<OMPC_ProcBind>,
1361    VersionedClause<OMPC_Schedule>,
1362  ];
1363}
1364def OMP_TargetTeamsDistributeParallelForSimd :
1365    Directive<"target teams distribute parallel for simd"> {
1366  let allowedClauses = [
1367    VersionedClause<OMPC_If>,
1368    VersionedClause<OMPC_Device>,
1369    VersionedClause<OMPC_Map>,
1370    VersionedClause<OMPC_Private>,
1371    VersionedClause<OMPC_NoWait>,
1372    VersionedClause<OMPC_Depend>,
1373    VersionedClause<OMPC_DefaultMap>,
1374    VersionedClause<OMPC_FirstPrivate>,
1375    VersionedClause<OMPC_IsDevicePtr>,
1376    VersionedClause<OMPC_Default>,
1377    VersionedClause<OMPC_Shared>,
1378    VersionedClause<OMPC_Reduction>,
1379    VersionedClause<OMPC_NumTeams>,
1380    VersionedClause<OMPC_ThreadLimit>,
1381    VersionedClause<OMPC_LastPrivate>,
1382    VersionedClause<OMPC_Collapse>,
1383    VersionedClause<OMPC_DistSchedule>,
1384    VersionedClause<OMPC_NumThreads>,
1385    VersionedClause<OMPC_ProcBind>,
1386    VersionedClause<OMPC_Schedule>,
1387    VersionedClause<OMPC_Linear>,
1388    VersionedClause<OMPC_Aligned>,
1389    VersionedClause<OMPC_SafeLen>,
1390    VersionedClause<OMPC_SimdLen>,
1391    VersionedClause<OMPC_Allocate>,
1392    VersionedClause<OMPC_NonTemporal, 50>,
1393    VersionedClause<OMPC_Order, 50>,
1394    VersionedClause<OMPC_UsesAllocators, 50>
1395  ];
1396}
1397def OMP_TargetTeamsDistributeParallelDoSimd :
1398    Directive<"target teams distribute parallel do simd"> {
1399  let allowedClauses = [
1400    VersionedClause<OMPC_Map>,
1401    VersionedClause<OMPC_Private>,
1402    VersionedClause<OMPC_Depend>,
1403    VersionedClause<OMPC_FirstPrivate>,
1404    VersionedClause<OMPC_IsDevicePtr>,
1405    VersionedClause<OMPC_Reduction>,
1406    VersionedClause<OMPC_Allocate>,
1407    VersionedClause<OMPC_UsesAllocators>,
1408    VersionedClause<OMPC_Shared>,
1409    VersionedClause<OMPC_LastPrivate>,
1410    VersionedClause<OMPC_Copyin>,
1411    VersionedClause<OMPC_Linear>,
1412    VersionedClause<OMPC_Ordered>,
1413    VersionedClause<OMPC_Order>,
1414    VersionedClause<OMPC_Aligned>,
1415    VersionedClause<OMPC_NonTemporal>
1416  ];
1417  let allowedOnceClauses = [
1418    VersionedClause<OMPC_If>,
1419    VersionedClause<OMPC_Device>,
1420    VersionedClause<OMPC_NoWait>,
1421    VersionedClause<OMPC_DefaultMap>,
1422    VersionedClause<OMPC_Default>,
1423    VersionedClause<OMPC_NumTeams>,
1424    VersionedClause<OMPC_ThreadLimit>,
1425    VersionedClause<OMPC_Collapse>,
1426    VersionedClause<OMPC_DistSchedule>,
1427    VersionedClause<OMPC_NumThreads>,
1428    VersionedClause<OMPC_ProcBind>,
1429    VersionedClause<OMPC_Schedule>,
1430    VersionedClause<OMPC_SafeLen>,
1431    VersionedClause<OMPC_SimdLen>
1432  ];
1433}
1434def OMP_TargetTeamsDistributeSimd :
1435    Directive<"target teams distribute simd"> {
1436  let allowedClauses = [
1437    VersionedClause<OMPC_Aligned>,
1438    VersionedClause<OMPC_Allocate>,
1439    VersionedClause<OMPC_Depend>,
1440    VersionedClause<OMPC_FirstPrivate>,
1441    VersionedClause<OMPC_If>,
1442    VersionedClause<OMPC_IsDevicePtr>,
1443    VersionedClause<OMPC_LastPrivate>,
1444    VersionedClause<OMPC_Linear>,
1445    VersionedClause<OMPC_Map>,
1446    VersionedClause<OMPC_NonTemporal, 50>,
1447    VersionedClause<OMPC_Order, 50>,
1448    VersionedClause<OMPC_Private>,
1449    VersionedClause<OMPC_Reduction>,
1450    VersionedClause<OMPC_Shared>,
1451    VersionedClause<OMPC_UsesAllocators, 50>
1452  ];
1453  let allowedOnceClauses = [
1454    VersionedClause<OMPC_Device>,
1455    VersionedClause<OMPC_DefaultMap>,
1456    VersionedClause<OMPC_NoWait>,
1457    VersionedClause<OMPC_NumTeams>,
1458    VersionedClause<OMPC_ThreadLimit>,
1459    VersionedClause<OMPC_Collapse>,
1460    VersionedClause<OMPC_DistSchedule>,
1461    VersionedClause<OMPC_SafeLen>,
1462    VersionedClause<OMPC_SimdLen>,
1463  ];
1464}
1465def OMP_Allocate : Directive<"allocate"> {
1466  let allowedClauses = [
1467    VersionedClause<OMPC_Allocator>
1468  ];
1469}
1470def OMP_DeclareVariant : Directive<"declare variant"> {
1471  let allowedClauses = [
1472    VersionedClause<OMPC_Match>
1473  ];
1474}
1475def OMP_MasterTaskloop : Directive<"master taskloop"> {
1476  let allowedClauses = [
1477    VersionedClause<OMPC_If>,
1478    VersionedClause<OMPC_Shared>,
1479    VersionedClause<OMPC_Private>,
1480    VersionedClause<OMPC_FirstPrivate>,
1481    VersionedClause<OMPC_LastPrivate>,
1482    VersionedClause<OMPC_Default>,
1483    VersionedClause<OMPC_Collapse>,
1484    VersionedClause<OMPC_Final>,
1485    VersionedClause<OMPC_Untied>,
1486    VersionedClause<OMPC_Mergeable>,
1487    VersionedClause<OMPC_Priority>,
1488    VersionedClause<OMPC_GrainSize>,
1489    VersionedClause<OMPC_NoGroup>,
1490    VersionedClause<OMPC_NumTasks>,
1491    VersionedClause<OMPC_Reduction>,
1492    VersionedClause<OMPC_InReduction>,
1493    VersionedClause<OMPC_Allocate>
1494  ];
1495}
1496def OMP_ParallelMasterTaskloop :
1497    Directive<"parallel master taskloop"> {
1498  let allowedClauses = [
1499    VersionedClause<OMPC_If>,
1500    VersionedClause<OMPC_Shared>,
1501    VersionedClause<OMPC_Private>,
1502    VersionedClause<OMPC_FirstPrivate>,
1503    VersionedClause<OMPC_LastPrivate>,
1504    VersionedClause<OMPC_Default>,
1505    VersionedClause<OMPC_Collapse>,
1506    VersionedClause<OMPC_Final>,
1507    VersionedClause<OMPC_Untied>,
1508    VersionedClause<OMPC_Mergeable>,
1509    VersionedClause<OMPC_Priority>,
1510    VersionedClause<OMPC_GrainSize>,
1511    VersionedClause<OMPC_NoGroup>,
1512    VersionedClause<OMPC_NumTasks>,
1513    VersionedClause<OMPC_Reduction>,
1514    VersionedClause<OMPC_Allocate>,
1515    VersionedClause<OMPC_NumThreads>,
1516    VersionedClause<OMPC_ProcBind>,
1517    VersionedClause<OMPC_Copyin>
1518  ];
1519}
1520def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1521  let allowedClauses = [
1522    VersionedClause<OMPC_If>,
1523    VersionedClause<OMPC_Shared>,
1524    VersionedClause<OMPC_Private>,
1525    VersionedClause<OMPC_FirstPrivate>,
1526    VersionedClause<OMPC_LastPrivate>,
1527    VersionedClause<OMPC_Default>,
1528    VersionedClause<OMPC_Collapse>,
1529    VersionedClause<OMPC_Final>,
1530    VersionedClause<OMPC_Untied>,
1531    VersionedClause<OMPC_Mergeable>,
1532    VersionedClause<OMPC_Priority>,
1533    VersionedClause<OMPC_Linear>,
1534    VersionedClause<OMPC_Aligned>,
1535    VersionedClause<OMPC_SafeLen>,
1536    VersionedClause<OMPC_SimdLen>,
1537    VersionedClause<OMPC_GrainSize>,
1538    VersionedClause<OMPC_NoGroup>,
1539    VersionedClause<OMPC_NumTasks>,
1540    VersionedClause<OMPC_Reduction>,
1541    VersionedClause<OMPC_InReduction>,
1542    VersionedClause<OMPC_Allocate>,
1543    VersionedClause<OMPC_NonTemporal, 50>,
1544    VersionedClause<OMPC_Order, 50>
1545  ];
1546}
1547def OMP_ParallelMasterTaskloopSimd :
1548    Directive<"parallel master taskloop simd"> {
1549  let allowedClauses = [
1550    VersionedClause<OMPC_If>,
1551    VersionedClause<OMPC_Shared>,
1552    VersionedClause<OMPC_Private>,
1553    VersionedClause<OMPC_FirstPrivate>,
1554    VersionedClause<OMPC_LastPrivate>,
1555    VersionedClause<OMPC_Default>,
1556    VersionedClause<OMPC_Collapse>,
1557    VersionedClause<OMPC_Final>,
1558    VersionedClause<OMPC_Untied>,
1559    VersionedClause<OMPC_Mergeable>,
1560    VersionedClause<OMPC_Priority>,
1561    VersionedClause<OMPC_GrainSize>,
1562    VersionedClause<OMPC_NoGroup>,
1563    VersionedClause<OMPC_NumTasks>,
1564    VersionedClause<OMPC_Reduction>,
1565    VersionedClause<OMPC_Allocate>,
1566    VersionedClause<OMPC_NumThreads>,
1567    VersionedClause<OMPC_ProcBind>,
1568    VersionedClause<OMPC_Copyin>,
1569    VersionedClause<OMPC_Linear>,
1570    VersionedClause<OMPC_Aligned>,
1571    VersionedClause<OMPC_SafeLen>,
1572    VersionedClause<OMPC_SimdLen>,
1573    VersionedClause<OMPC_NonTemporal, 50>,
1574    VersionedClause<OMPC_Order, 50>
1575  ];
1576}
1577def OMP_Depobj : Directive<"depobj"> {
1578  let allowedClauses = [
1579    VersionedClause<OMPC_Depend, 50>,
1580    VersionedClause<OMPC_Destroy, 50>,
1581    VersionedClause<OMPC_Update, 50>,
1582    // TODO This should ne `none` instead. Comment carried over from
1583    // OMPKinds.def.
1584    VersionedClause<OMPC_Depobj, 50>
1585  ];
1586}
1587def OMP_Scan : Directive<"scan"> {
1588  let allowedClauses = [
1589    VersionedClause<OMPC_Inclusive, 50>,
1590    VersionedClause<OMPC_Exclusive, 50>
1591  ];
1592}
1593def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {}
1594def OMP_EndDeclareVariant : Directive<"end declare variant"> {}
1595def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
1596  let allowedClauses = [
1597    VersionedClause<OMPC_Allocate>,
1598    VersionedClause<OMPC_Copyin>,
1599    VersionedClause<OMPC_Default>,
1600    VersionedClause<OMPC_FirstPrivate>,
1601    VersionedClause<OMPC_Private>,
1602    VersionedClause<OMPC_Reduction>,
1603    VersionedClause<OMPC_Shared>
1604  ];
1605  let allowedOnceClauses = [
1606    VersionedClause<OMPC_If>,
1607    VersionedClause<OMPC_NumThreads>,
1608    VersionedClause<OMPC_ProcBind>
1609  ];
1610}
1611def OMP_Workshare : Directive<"workshare"> {}
1612def OMP_EndDo : Directive<"end do"> {}
1613def OMP_EndDoSimd : Directive<"end do simd"> {}
1614def OMP_EndSections : Directive<"end sections"> {
1615  let allowedOnceClauses = [
1616    VersionedClause<OMPC_NoWait>
1617  ];
1618}
1619def OMP_EndSingle : Directive<"end single"> {
1620  let allowedClauses = [
1621    VersionedClause<OMPC_CopyPrivate>
1622  ];
1623  let allowedOnceClauses = [
1624    VersionedClause<OMPC_NoWait>
1625  ];
1626}
1627def OMP_EndWorkshare : Directive<"end workshare"> {
1628  let allowedClauses = [
1629    VersionedClause<OMPC_NoWait>
1630  ];
1631}
1632def OMP_Unknown : Directive<"unknown"> {
1633  let isDefault = true;
1634}
1635