Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/llvm/Frontend/OpenMP/OMP.td is written in an unsupported language. File is not indexed.

0001 //===-- OMP.td - OpenMP directive definition file ----------*- tablegen -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // This is the definition file for OpenMP directives and clauses.
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 include "llvm/Frontend/Directive/DirectiveBase.td"
0014 
0015 //===----------------------------------------------------------------------===//
0016 // Definition of general OpenMP information
0017 //===----------------------------------------------------------------------===//
0018 
0019 def OpenMP : DirectiveLanguage {
0020   let name = "OpenMP";
0021   let cppNamespace = "omp"; // final namespace will be llvm::omp
0022   let directivePrefix = "OMPD_";
0023   let clausePrefix = "OMPC_";
0024   let makeEnumAvailableInNamespace = true;
0025   let enableBitmaskEnumInNamespace = true;
0026   let clauseEnumSetClass = "OmpClauseSet";
0027   let flangClauseBaseClass = "OmpClause";
0028 }
0029 
0030 //===----------------------------------------------------------------------===//
0031 // Definitions of OpenMP clauses
0032 // Sorted alphabetically wrt clause spelling.
0033 //===----------------------------------------------------------------------===//
0034 
0035 def OMPC_Absent : Clause<"absent"> {
0036   let clangClass = "OMPAbsentClause";
0037 }
0038 def OMPC_Acquire : Clause<"acquire"> {
0039   let clangClass = "OMPAcquireClause";
0040 }
0041 def OMPC_AcqRel : Clause<"acq_rel"> {
0042   let clangClass = "OMPAcqRelClause";
0043 }
0044 def OMPC_AdjustArgs : Clause<"adjust_args"> {
0045 }
0046 def OMPC_Affinity : Clause<"affinity"> {
0047   let clangClass = "OMPAffinityClause";
0048   let flangClass = "OmpAffinityClause";
0049 }
0050 def OMPC_Align : Clause<"align"> {
0051   let clangClass = "OMPAlignClause";
0052   let flangClass = "OmpAlignClause";
0053 }
0054 def OMPC_Aligned : Clause<"aligned"> {
0055   let clangClass = "OMPAlignedClause";
0056   let flangClass = "OmpAlignedClause";
0057 }
0058 def OMPC_Allocate : Clause<"allocate"> {
0059   let clangClass = "OMPAllocateClause";
0060   let flangClass = "OmpAllocateClause";
0061 }
0062 def OMPC_Allocator : Clause<"allocator"> {
0063   let clangClass = "OMPAllocatorClause";
0064   let flangClass = "ScalarIntExpr";
0065 }
0066 def OMPC_AppendArgs : Clause<"append_args"> {
0067 }
0068 def OMPC_At : Clause<"at"> {
0069   let clangClass = "OMPAtClause";
0070   let flangClass = "OmpAtClause";
0071 }
0072 def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
0073   let clangClass = "OMPAtomicDefaultMemOrderClause";
0074   let flangClass = "OmpAtomicDefaultMemOrderClause";
0075 }
0076 
0077 def OMP_BIND_parallel : ClauseVal<"parallel",1,1> {}
0078 def OMP_BIND_teams : ClauseVal<"teams",2,1> {}
0079 def OMP_BIND_thread : ClauseVal<"thread",3,1> { let isDefault = true; }
0080 def OMPC_Bind : Clause<"bind"> {
0081   let clangClass = "OMPBindClause";
0082   let flangClass = "OmpBindClause";
0083   let enumClauseValue = "BindKind";
0084   let allowedClauseValues = [
0085     OMP_BIND_parallel,
0086     OMP_BIND_teams,
0087     OMP_BIND_thread
0088   ];
0089 }
0090 
0091 def OMP_CANCELLATION_CONSTRUCT_Parallel : ClauseVal<"parallel", 1, 1> {}
0092 def OMP_CANCELLATION_CONSTRUCT_Loop : ClauseVal<"loop", 2, 1> {}
0093 def OMP_CANCELLATION_CONSTRUCT_Sections : ClauseVal<"sections", 3, 1> {}
0094 def OMP_CANCELLATION_CONSTRUCT_Taskgroup : ClauseVal<"taskgroup", 4, 1> {}
0095 def OMP_CANCELLATION_CONSTRUCT_None : ClauseVal<"none", 5, 0> {
0096   let isDefault = 1;
0097 }
0098 def OMPC_CancellationConstructType : Clause<"cancellation_construct_type"> {
0099   let enumClauseValue = "CancellationConstructType";
0100   let allowedClauseValues = [
0101     OMP_CANCELLATION_CONSTRUCT_Parallel,
0102     OMP_CANCELLATION_CONSTRUCT_Loop,
0103     OMP_CANCELLATION_CONSTRUCT_Sections,
0104     OMP_CANCELLATION_CONSTRUCT_Taskgroup,
0105     OMP_CANCELLATION_CONSTRUCT_None
0106   ];
0107 }
0108 def OMPC_Contains : Clause<"contains"> {
0109   let clangClass = "OMPContainsClause";
0110 }
0111 def OMPC_Capture : Clause<"capture"> {
0112   let clangClass = "OMPCaptureClause";
0113 }
0114 def OMPC_Collapse : Clause<"collapse"> {
0115   let clangClass = "OMPCollapseClause";
0116   let flangClass = "ScalarIntConstantExpr";
0117 }
0118 def OMPC_Compare : Clause<"compare"> {
0119   let clangClass = "OMPCompareClause";
0120 }
0121 def OMPC_Copyin : Clause<"copyin"> {
0122   let clangClass = "OMPCopyinClause";
0123   let flangClass = "OmpObjectList";
0124 }
0125 def OMPC_CopyPrivate : Clause<"copyprivate"> {
0126   let clangClass = "OMPCopyprivateClause";
0127   let flangClass = "OmpObjectList";
0128 }
0129 def OMPC_Default : Clause<"default"> {
0130   let clangClass = "OMPDefaultClause";
0131   let flangClass = "OmpDefaultClause";
0132 }
0133 def OMPC_DefaultMap : Clause<"defaultmap"> {
0134   let clangClass = "OMPDefaultmapClause";
0135   let flangClass = "OmpDefaultmapClause";
0136 }
0137 def OMPC_Depend : Clause<"depend"> {
0138   let clangClass = "OMPDependClause";
0139   let flangClass = "OmpDependClause";
0140 }
0141 def OMPC_Depobj : Clause<"depobj"> {
0142   let clangClass = "OMPDepobjClause";
0143   let isImplicit = true;
0144 }
0145 def OMPC_Destroy : Clause<"destroy"> {
0146   let clangClass = "OMPDestroyClause";
0147   let flangClass = "OmpDestroyClause";
0148   let isValueOptional = true;
0149 }
0150 def OMPC_Detach : Clause<"detach"> {
0151   let clangClass = "OMPDetachClause";
0152   let flangClass = "OmpDetachClause";
0153 }
0154 def OMPC_Device : Clause<"device"> {
0155   let clangClass = "OMPDeviceClause";
0156   let flangClass = "OmpDeviceClause";
0157 }
0158 def OMPC_DeviceType : Clause<"device_type"> {
0159   let flangClass = "OmpDeviceTypeClause";
0160 }
0161 def OMPC_DistSchedule : Clause<"dist_schedule"> {
0162   let clangClass = "OMPDistScheduleClause";
0163   let flangClass = "ScalarIntExpr";
0164   let isValueOptional = true;
0165 }
0166 def OMPC_Doacross : Clause<"doacross"> {
0167   let clangClass = "OMPDoacrossClause";
0168   let flangClass = "OmpDoacrossClause";
0169 }
0170 def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
0171   let clangClass = "OMPDynamicAllocatorsClause";
0172 }
0173 def OMPC_Enter : Clause<"enter"> {
0174   let flangClass = "OmpObjectList";
0175 }
0176 def OMPC_Exclusive : Clause<"exclusive"> {
0177   let clangClass = "OMPExclusiveClause";
0178   let flangClass = "OmpObjectList";
0179 }
0180 def OMPC_Fail : Clause<"fail"> {
0181   let clangClass = "OMPFailClause";
0182   let flangClass = "OmpFailClause";
0183 }
0184 def OMPC_Filter : Clause<"filter"> {
0185   let clangClass = "OMPFilterClause";
0186   let flangClass = "ScalarIntExpr";
0187 }
0188 def OMPC_Final : Clause<"final"> {
0189   let clangClass = "OMPFinalClause";
0190   let flangClass = "ScalarLogicalExpr";
0191 }
0192 def OMPC_FirstPrivate : Clause<"firstprivate"> {
0193   let clangClass = "OMPFirstprivateClause";
0194   let flangClass = "OmpObjectList";
0195 }
0196 def OMPC_Flush : Clause<"flush"> {
0197   let clangClass = "OMPFlushClause";
0198   let isImplicit = true;
0199 }
0200 def OMPC_From : Clause<"from"> {
0201   let clangClass = "OMPFromClause";
0202   let flangClass = "OmpFromClause";
0203 }
0204 def OMPC_Full: Clause<"full"> {
0205   let clangClass = "OMPFullClause";
0206 }
0207 def OMP_GRAINSIZE_Strict : ClauseVal<"strict", 1, 1> {}
0208 def OMP_GRAINSIZE_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
0209 def OMPC_GrainSize : Clause<"grainsize"> {
0210   let clangClass = "OMPGrainsizeClause";
0211   let flangClass = "OmpGrainsizeClause";
0212   let enumClauseValue = "GrainsizeType";
0213   let allowedClauseValues = [
0214     OMP_GRAINSIZE_Strict,
0215     OMP_GRAINSIZE_Unknown
0216   ];
0217 }
0218 def OMPC_HasDeviceAddr : Clause<"has_device_addr"> {
0219   let clangClass = "OMPHasDeviceAddrClause";
0220   let flangClass = "OmpObjectList";
0221 }
0222 def OMPC_Hint : Clause<"hint"> {
0223   let clangClass = "OMPHintClause";
0224   let flangClass = "ConstantExpr";
0225 }
0226 def OMPC_Holds : Clause<"holds"> {
0227   let clangClass = "OMPHoldsClause";
0228 }
0229 def OMPC_If : Clause<"if"> {
0230   let clangClass = "OMPIfClause";
0231   let flangClass = "OmpIfClause";
0232 }
0233 def OMPC_Inbranch : Clause<"inbranch"> {
0234 }
0235 def OMPC_Inclusive : Clause<"inclusive"> {
0236   let clangClass = "OMPInclusiveClause";
0237   let flangClass = "OmpObjectList";
0238 }
0239 def OMPC_Indirect : Clause<"indirect"> {
0240 }
0241 def OMPC_Init : Clause<"init"> {
0242   let clangClass = "OMPInitClause";
0243 }
0244 def OMPC_InReduction : Clause<"in_reduction"> {
0245   let clangClass = "OMPInReductionClause";
0246   let flangClass = "OmpInReductionClause";
0247 }
0248 def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
0249   let clangClass = "OMPIsDevicePtrClause";
0250   let flangClass = "OmpObjectList";
0251 }
0252 def OMPC_LastPrivate : Clause<"lastprivate"> {
0253   let clangClass = "OMPLastprivateClause";
0254   let flangClass = "OmpLastprivateClause";
0255 }
0256 def OMPC_Linear : Clause<"linear"> {
0257   let clangClass = "OMPLinearClause";
0258   let flangClass = "OmpLinearClause";
0259 }
0260 def OMPC_Link : Clause<"link"> {
0261   let flangClass = "OmpObjectList";
0262 }
0263 def OMPC_Map : Clause<"map"> {
0264   let clangClass = "OMPMapClause";
0265   let flangClass = "OmpMapClause";
0266 }
0267 def OMPC_Match : Clause<"match"> {
0268 }
0269 def OMP_MEMORY_ORDER_SeqCst : ClauseVal<"seq_cst", 1, 1> {}
0270 def OMP_MEMORY_ORDER_AcqRel : ClauseVal<"acq_rel", 2, 1> {}
0271 def OMP_MEMORY_ORDER_Acquire : ClauseVal<"acquire", 3, 1> {}
0272 def OMP_MEMORY_ORDER_Release : ClauseVal<"release", 4, 1> {}
0273 def OMP_MEMORY_ORDER_Relaxed : ClauseVal<"relaxed", 5, 1> {}
0274 def OMP_MEMORY_ORDER_Default : ClauseVal<"default", 6, 0> {
0275   let isDefault = 1;
0276 }
0277 def OMPC_MemoryOrder : Clause<"memory_order"> {
0278   let enumClauseValue = "MemoryOrderKind";
0279   let allowedClauseValues = [
0280     OMP_MEMORY_ORDER_SeqCst,
0281     OMP_MEMORY_ORDER_AcqRel,
0282     OMP_MEMORY_ORDER_Acquire,
0283     OMP_MEMORY_ORDER_Release,
0284     OMP_MEMORY_ORDER_Relaxed,
0285     OMP_MEMORY_ORDER_Default
0286   ];
0287 }
0288 def OMPC_Mergeable : Clause<"mergeable"> {
0289   let clangClass = "OMPMergeableClause";
0290 }
0291 def OMPC_Message : Clause<"message"> {
0292   let clangClass = "OMPMessageClause";
0293   let flangClass = "OmpMessageClause";
0294 }
0295 def OMPC_NoOpenMP : Clause<"no_openmp"> {
0296   let clangClass = "OMPNoOpenMPClause";
0297 }
0298 def OMPC_NoOpenMPRoutines : Clause<"no_openmp_routines"> {
0299   let clangClass = "OMPNoOpenMPRoutinesClause";
0300 }
0301 def OMPC_NoParallelism : Clause<"no_parallelism"> {
0302   let clangClass = "OMPNoParallelismClause";
0303 }
0304 def OMPC_Nocontext : Clause<"nocontext"> {
0305   let clangClass = "OMPNocontextClause";
0306   let flangClass = "ScalarLogicalExpr";
0307 }
0308 def OMPC_NoGroup : Clause<"nogroup"> {
0309   let clangClass = "OMPNogroupClause";
0310 }
0311 def OMPC_NonTemporal : Clause<"nontemporal"> {
0312   let clangClass = "OMPNontemporalClause";
0313   let flangClass = "Name";
0314   let isValueList = true;
0315 }
0316 def OMPC_Notinbranch : Clause<"notinbranch"> {
0317 }
0318 def OMPC_Novariants : Clause<"novariants"> {
0319   let clangClass = "OMPNovariantsClause";
0320   let flangClass = "ScalarLogicalExpr";
0321 }
0322 def OMPC_NoWait : Clause<"nowait"> {
0323   let clangClass = "OMPNowaitClause";
0324 }
0325 def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
0326 def OMP_NUMTASKS_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
0327 def OMPC_NumTasks : Clause<"num_tasks"> {
0328   let clangClass = "OMPNumTasksClause";
0329   let flangClass = "OmpNumTasksClause";
0330   let enumClauseValue = "NumTasksType";
0331   let allowedClauseValues = [
0332     OMP_NUMTASKS_Strict,
0333     OMP_NUMTASKS_Unknown
0334   ];
0335 }
0336 def OMPC_NumTeams : Clause<"num_teams"> {
0337   let clangClass = "OMPNumTeamsClause";
0338   let flangClass = "ScalarIntExpr";
0339 }
0340 def OMPC_NumThreads : Clause<"num_threads"> {
0341   let clangClass = "OMPNumThreadsClause";
0342   let flangClass = "ScalarIntExpr";
0343 }
0344 def OMPC_OMPX_Attribute : Clause<"ompx_attribute"> {
0345   let clangClass = "OMPXAttributeClause";
0346 }
0347 def OMPC_OMPX_Bare : Clause<"ompx_bare"> {
0348   let clangClass = "OMPXBareClause";
0349 }
0350 def OMPC_OMPX_DynCGroupMem : Clause<"ompx_dyn_cgroup_mem"> {
0351   let clangClass = "OMPXDynCGroupMemClause";
0352   let flangClass = "ScalarIntExpr";
0353 }
0354 def OMP_ORDER_concurrent : ClauseVal<"concurrent",1,1> {}
0355 def OMP_ORDER_unknown : ClauseVal<"unknown",2,0> { let isDefault = 1; }
0356 def OMPC_Order : Clause<"order"> {
0357   let clangClass = "OMPOrderClause";
0358   let flangClass = "OmpOrderClause";
0359   let enumClauseValue = "OrderKind";
0360   let allowedClauseValues = [
0361     OMP_ORDER_unknown,
0362     OMP_ORDER_concurrent
0363   ];
0364 }
0365 def OMPC_Ordered : Clause<"ordered"> {
0366   let clangClass = "OMPOrderedClause";
0367   let flangClass = "ScalarIntConstantExpr";
0368   let isValueOptional = true;
0369 }
0370 def OMPC_Partial: Clause<"partial"> {
0371   let clangClass = "OMPPartialClause";
0372   let flangClass = "ScalarIntConstantExpr";
0373   let isValueOptional = true;
0374 }
0375 def OMPC_Permutation: Clause<"permutation"> {
0376   let clangClass = "OMPPermutationClause";
0377   let flangClass = "ScalarIntExpr";
0378   let isValueList = true;
0379 }
0380 def OMPC_Priority : Clause<"priority"> {
0381   let clangClass = "OMPPriorityClause";
0382   let flangClass = "ScalarIntExpr";
0383 }
0384 def OMPC_Private : Clause<"private"> {
0385   let clangClass = "OMPPrivateClause";
0386   let flangClass = "OmpObjectList";
0387 }
0388 def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
0389 def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
0390 def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
0391 def OMP_PROC_BIND_primary : ClauseVal<"primary",5,1> {}
0392 def OMP_PROC_BIND_default : ClauseVal<"default",6,0> {}
0393 def OMP_PROC_BIND_unknown : ClauseVal<"unknown",7,0> { let isDefault = true; }
0394 def OMPC_ProcBind : Clause<"proc_bind"> {
0395   let clangClass = "OMPProcBindClause";
0396   let flangClass = "OmpProcBindClause";
0397   let enumClauseValue = "ProcBindKind";
0398   let allowedClauseValues = [
0399     OMP_PROC_BIND_primary,
0400     OMP_PROC_BIND_master,
0401     OMP_PROC_BIND_close,
0402     OMP_PROC_BIND_spread,
0403     OMP_PROC_BIND_default,
0404     OMP_PROC_BIND_unknown
0405   ];
0406 }
0407 def OMPC_Read : Clause<"read"> {
0408   let clangClass = "OMPReadClause";
0409 }
0410 def OMPC_Reduction : Clause<"reduction"> {
0411   let clangClass = "OMPReductionClause";
0412   let flangClass = "OmpReductionClause";
0413 }
0414 def OMPC_Relaxed : Clause<"relaxed"> {
0415   let clangClass = "OMPRelaxedClause";
0416 }
0417 def OMPC_Release : Clause<"release"> {
0418   let clangClass = "OMPReleaseClause";
0419 }
0420 def OMPC_ReverseOffload : Clause<"reverse_offload"> {
0421   let clangClass = "OMPReverseOffloadClause";
0422 }
0423 def OMPC_SafeLen : Clause<"safelen"> {
0424   let clangClass = "OMPSafelenClause";
0425   let flangClass = "ScalarIntConstantExpr";
0426 }
0427 def OMP_SCHEDULE_Static : ClauseVal<"static", 2, 1> {}
0428 def OMP_SCHEDULE_Dynamic : ClauseVal<"dynamic", 3, 1> {}
0429 def OMP_SCHEDULE_Guided : ClauseVal<"guided", 4, 1> {}
0430 def OMP_SCHEDULE_Auto : ClauseVal<"auto", 5, 1> {}
0431 def OMP_SCHEDULE_Runtime : ClauseVal<"runtime", 6, 1> {}
0432 def OMP_SCHEDULE_Default : ClauseVal<"default", 7, 0> { let isDefault = 1; }
0433 def OMPC_Schedule : Clause<"schedule"> {
0434   let clangClass = "OMPScheduleClause";
0435   let flangClass = "OmpScheduleClause";
0436   let enumClauseValue = "ScheduleKind";
0437   let allowedClauseValues = [
0438     OMP_SCHEDULE_Static,
0439     OMP_SCHEDULE_Dynamic,
0440     OMP_SCHEDULE_Guided,
0441     OMP_SCHEDULE_Auto,
0442     OMP_SCHEDULE_Runtime,
0443     OMP_SCHEDULE_Default
0444   ];
0445 }
0446 def OMPC_SeqCst : Clause<"seq_cst"> {
0447   let clangClass = "OMPSeqCstClause";
0448 }
0449 def OMPC_Severity : Clause<"severity"> {
0450   let clangClass = "OMPSeverityClause";
0451   let flangClass = "OmpSeverityClause";
0452 }
0453 def OMPC_Shared : Clause<"shared"> {
0454   let clangClass = "OMPSharedClause";
0455   let flangClass = "OmpObjectList";
0456 }
0457 def OMPC_Simd : Clause<"simd"> {
0458   let clangClass = "OMPSIMDClause";
0459 }
0460 def OMPC_SimdLen : Clause<"simdlen"> {
0461   let clangClass = "OMPSimdlenClause";
0462   let flangClass = "ScalarIntConstantExpr";
0463 }
0464 def OMPC_Sizes: Clause<"sizes"> {
0465   let clangClass = "OMPSizesClause";
0466   let flangClass = "ScalarIntExpr";
0467   let isValueList = true;
0468 }
0469 def OMPC_TaskReduction : Clause<"task_reduction"> {
0470   let clangClass = "OMPTaskReductionClause";
0471   let flangClass = "OmpTaskReductionClause";
0472 }
0473 def OMPC_ThreadLimit : Clause<"thread_limit"> {
0474   let clangClass = "OMPThreadLimitClause";
0475   let flangClass = "ScalarIntExpr";
0476 }
0477 def OMPC_ThreadPrivate : Clause<"threadprivate"> {
0478   let alternativeName = "threadprivate or thread local";
0479   let isImplicit = true;
0480 }
0481 def OMPC_Threads : Clause<"threads"> {
0482   let clangClass = "OMPThreadsClause";
0483 }
0484 def OMPC_To : Clause<"to"> {
0485   let clangClass = "OMPToClause";
0486   let flangClass = "OmpToClause";
0487 }
0488 def OMPC_UnifiedAddress : Clause<"unified_address"> {
0489   let clangClass = "OMPUnifiedAddressClause";
0490 }
0491 def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
0492   let clangClass = "OMPUnifiedSharedMemoryClause";
0493 }
0494 def OMPC_Uniform : Clause<"uniform"> {
0495   let flangClass = "Name";
0496   let isValueList = true;
0497 }
0498 def OMPC_Unknown : Clause<"unknown"> {
0499   let isImplicit = true;
0500   let isDefault = true;
0501 }
0502 def OMPC_Untied : Clause<"untied"> {
0503   let clangClass = "OMPUntiedClause";
0504 }
0505 def OMPC_Update : Clause<"update"> {
0506   let clangClass = "OMPUpdateClause";
0507   let flangClass = "OmpUpdateClause";
0508 }
0509 def OMPC_Use : Clause<"use"> {
0510   let clangClass = "OMPUseClause";
0511 }
0512 def OMPC_UsesAllocators : Clause<"uses_allocators"> {
0513   let clangClass = "OMPUsesAllocatorsClause";
0514 }
0515 def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
0516   let clangClass = "OMPUseDeviceAddrClause";
0517   let flangClass = "OmpObjectList";
0518 }
0519 def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
0520   let clangClass = "OMPUseDevicePtrClause";
0521   let flangClass = "OmpObjectList";
0522 }
0523 def OMPC_Weak : Clause<"weak"> {
0524   let clangClass = "OMPWeakClause";
0525 }
0526 def OMPC_When: Clause<"when"> {
0527 }
0528 def OMPC_Write : Clause<"write"> {
0529   let clangClass = "OMPWriteClause";
0530 }
0531 
0532 //===----------------------------------------------------------------------===//
0533 // Definitions of OpenMP leaf directives
0534 // Sorted alphabetically wrt directive spelling, except "end xyz" immediately
0535 // follows "xyz".
0536 //===----------------------------------------------------------------------===//
0537 
0538 def OMP_Allocate : Directive<"allocate"> {
0539   let allowedOnceClauses = [
0540     VersionedClause<OMPC_Align, 51>,
0541     VersionedClause<OMPC_Allocator>,
0542   ];
0543   let association = AS_None;
0544   let category = CA_Declarative;
0545 }
0546 def OMP_Allocators : Directive<"allocators"> {
0547   let allowedClauses = [
0548     VersionedClause<OMPC_Allocate>,
0549   ];
0550   let association = AS_Block;
0551   let category = CA_Executable;
0552 }
0553 def OMP_Assumes : Directive<"assumes"> {
0554   let association = AS_None;
0555   let category = CA_Informational;
0556 }
0557 def OMP_EndAssumes : Directive<"end assumes"> {
0558   let association = AS_Delimited;
0559   let category = OMP_Assumes.category;
0560 }
0561 def OMP_Assume : Directive<"assume"> {
0562   let association = AS_Block;
0563   let category = CA_Informational;
0564   let allowedOnceClauses = [
0565     VersionedClause<OMPC_Absent, 51>,
0566     VersionedClause<OMPC_Contains, 51>,
0567     VersionedClause<OMPC_Holds, 51>,
0568     VersionedClause<OMPC_NoOpenMP, 51>,
0569     VersionedClause<OMPC_NoOpenMPRoutines, 51>,
0570     VersionedClause<OMPC_NoParallelism, 51>,
0571   ];
0572 }
0573 def OMP_Atomic : Directive<"atomic"> {
0574   let allowedClauses = [
0575     VersionedClause<OMPC_Capture>,
0576     VersionedClause<OMPC_Compare, 51>,
0577     VersionedClause<OMPC_Read>,
0578     VersionedClause<OMPC_Update>,
0579     VersionedClause<OMPC_Write>,
0580   ];
0581   let allowedOnceClauses = [
0582     VersionedClause<OMPC_AcqRel, 50>,
0583     VersionedClause<OMPC_Acquire, 50>,
0584     VersionedClause<OMPC_Fail, 51>,
0585     VersionedClause<OMPC_Hint, 50>,
0586     VersionedClause<OMPC_Relaxed, 50>,
0587     VersionedClause<OMPC_Release, 50>,
0588     VersionedClause<OMPC_SeqCst>,
0589     VersionedClause<OMPC_Weak, 51>,
0590   ];
0591   let association = AS_Block;
0592   let category = CA_Executable;
0593 }
0594 def OMP_Barrier : Directive<"barrier"> {
0595   let association = AS_None;
0596   let category = CA_Executable;
0597 }
0598 def OMP_BeginAssumes : Directive<"begin assumes"> {
0599   let association = AS_Delimited;
0600   let category = CA_Informational;
0601 }
0602 def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
0603   let allowedClauses = [
0604     VersionedClause<OMPC_DeviceType>,
0605     VersionedClause<OMPC_Indirect>,
0606     VersionedClause<OMPC_Link>,
0607     VersionedClause<OMPC_To>,
0608   ];
0609   let association = AS_Delimited;
0610   let category = CA_Declarative;
0611 }
0612 def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {
0613   let association = AS_Delimited;
0614   let category = CA_Declarative;
0615 }
0616 def OMP_Cancel : Directive<"cancel"> {
0617   let allowedOnceClauses = [
0618     VersionedClause<OMPC_If>,
0619   ];
0620   let association = AS_None;
0621   let category = CA_Executable;
0622 }
0623 def OMP_CancellationPoint : Directive<"cancellation point"> {
0624   let association = AS_None;
0625   let category = CA_Executable;
0626 }
0627 def OMP_Critical : Directive<"critical"> {
0628   let allowedClauses = [
0629     VersionedClause<OMPC_Hint>,
0630   ];
0631   let association = AS_Block;
0632   let category = CA_Executable;
0633 }
0634 def OMP_DeclareMapper : Directive<"declare mapper"> {
0635   let requiredClauses = [
0636     VersionedClause<OMPC_Map, 45>,
0637   ];
0638   let association = AS_None;
0639   let category = CA_Declarative;
0640 }
0641 def OMP_DeclareReduction : Directive<"declare reduction"> {
0642   let association = AS_None;
0643   let category = CA_Declarative;
0644 }
0645 def OMP_DeclareSimd : Directive<"declare simd"> {
0646   let allowedClauses = [
0647     VersionedClause<OMPC_Aligned>,
0648     VersionedClause<OMPC_Linear>,
0649     VersionedClause<OMPC_Uniform>,
0650   ];
0651   let allowedOnceClauses = [
0652     VersionedClause<OMPC_SimdLen>,
0653   ];
0654   let allowedExclusiveClauses = [
0655     VersionedClause<OMPC_Inbranch>,
0656     VersionedClause<OMPC_Notinbranch>,
0657   ];
0658   let association = AS_Declaration;
0659   let category = CA_Declarative;
0660 }
0661 def OMP_DeclareTarget : Directive<"declare target"> {
0662   let allowedClauses = [
0663     VersionedClause<OMPC_Enter, 52>,
0664     VersionedClause<OMPC_Indirect>,
0665     VersionedClause<OMPC_Link>,
0666     VersionedClause<OMPC_To>,
0667   ];
0668   let allowedOnceClauses = [
0669     VersionedClause<OMPC_DeviceType, 50>,
0670   ];
0671   let association = AS_None;
0672   let category = CA_Declarative;
0673 }
0674 def OMP_EndDeclareTarget : Directive<"end declare target"> {
0675   let association = AS_Delimited;
0676   let category = OMP_DeclareTarget.category;
0677 }
0678 def OMP_DeclareVariant : Directive<"declare variant"> {
0679   let allowedClauses = [
0680     VersionedClause<OMPC_Match>,
0681   ];
0682   let allowedExclusiveClauses = [
0683     VersionedClause<OMPC_AdjustArgs, 51>,
0684     VersionedClause<OMPC_AppendArgs, 51>,
0685   ];
0686   let association = AS_Declaration;
0687   let category = CA_Declarative;
0688 }
0689 def OMP_EndDeclareVariant : Directive<"end declare variant"> {
0690   let association = AS_Delimited;
0691   let category = OMP_DeclareVariant.category;
0692 }
0693 def OMP_Depobj : Directive<"depobj"> {
0694   let allowedClauses = [
0695     VersionedClause<OMPC_Depend, 50>,
0696     // TODO This should ne `none` instead. Comment carried over from
0697     // OMPKinds.def.
0698     VersionedClause<OMPC_Depobj, 50>,
0699     VersionedClause<OMPC_Destroy, 50>,
0700     VersionedClause<OMPC_Update, 50>,
0701   ];
0702   let association = AS_None;
0703   let category = CA_Executable;
0704 }
0705 def OMP_dispatch : Directive<"dispatch"> {
0706   let allowedClauses = [
0707     VersionedClause<OMPC_Depend>,
0708     VersionedClause<OMPC_Device>,
0709     VersionedClause<OMPC_HasDeviceAddr, 51>,
0710     VersionedClause<OMPC_IsDevicePtr>,
0711     VersionedClause<OMPC_Nocontext>,
0712     VersionedClause<OMPC_Novariants>,
0713     VersionedClause<OMPC_NoWait>,
0714   ];
0715   let association = AS_Block;
0716   let category = CA_Executable;
0717 }
0718 def OMP_Distribute : Directive<"distribute"> {
0719   let allowedClauses = [
0720     VersionedClause<OMPC_Allocate>,
0721     VersionedClause<OMPC_FirstPrivate>,
0722     VersionedClause<OMPC_LastPrivate>,
0723     VersionedClause<OMPC_Private>,
0724   ];
0725   let allowedOnceClauses = [
0726     VersionedClause<OMPC_Collapse>,
0727     VersionedClause<OMPC_DistSchedule>,
0728     VersionedClause<OMPC_Order, 50>,
0729   ];
0730   let association = AS_Loop;
0731   let category = CA_Executable;
0732 }
0733 def OMP_Do : Directive<"do"> {
0734   let allowedClauses = [
0735     VersionedClause<OMPC_FirstPrivate>,
0736     VersionedClause<OMPC_LastPrivate>,
0737     VersionedClause<OMPC_Linear>,
0738     VersionedClause<OMPC_Private>,
0739     VersionedClause<OMPC_Reduction>,
0740   ];
0741   let allowedOnceClauses = [
0742     VersionedClause<OMPC_Collapse>,
0743     VersionedClause<OMPC_NoWait>,
0744     VersionedClause<OMPC_Order, 50>,
0745     VersionedClause<OMPC_Ordered>,
0746     VersionedClause<OMPC_Schedule>,
0747   ];
0748   let association = AS_Loop;
0749   let category = CA_Executable;
0750 }
0751 def OMP_EndDo : Directive<"end do"> {
0752   let allowedOnceClauses = [
0753     VersionedClause<OMPC_NoWait>,
0754   ];
0755   // Needed for association computation, since OMP_Do has it "from leafConstructs".
0756   let leafConstructs = OMP_Do.leafConstructs;
0757   let association = OMP_Do.association;
0758   let category = OMP_Do.category;
0759 }
0760 def OMP_Error : Directive<"error"> {
0761   let allowedClauses = [
0762     VersionedClause<OMPC_At, 51>,
0763     VersionedClause<OMPC_Message, 51>,
0764     VersionedClause<OMPC_Severity, 51>,
0765   ];
0766   let association = AS_None;
0767   let category = CA_Utility;
0768 }
0769 def OMP_Flush : Directive<"flush"> {
0770   let allowedOnceClauses = [
0771     VersionedClause<OMPC_AcqRel, 50>,
0772     VersionedClause<OMPC_Acquire, 50>,
0773     // TODO This should ne `none` instead. Comment carried over from
0774     // OMPKinds.def.
0775     VersionedClause<OMPC_Flush>,
0776     VersionedClause<OMPC_Release, 50>,
0777     VersionedClause<OMPC_SeqCst, 51>,
0778   ];
0779   let association = AS_None;
0780   let category = CA_Executable;
0781 }
0782 def OMP_For : Directive<"for"> {
0783   let allowedClauses = [
0784     VersionedClause<OMPC_Allocate>,
0785     VersionedClause<OMPC_Collapse>,
0786     VersionedClause<OMPC_FirstPrivate>,
0787     VersionedClause<OMPC_LastPrivate>,
0788     VersionedClause<OMPC_Linear>,
0789     VersionedClause<OMPC_NoWait>,
0790     VersionedClause<OMPC_Order, 50>,
0791     VersionedClause<OMPC_Ordered>,
0792     VersionedClause<OMPC_Private>,
0793     VersionedClause<OMPC_Reduction>,
0794     VersionedClause<OMPC_Schedule>,
0795   ];
0796   let association = AS_Loop;
0797   let category = CA_Executable;
0798 }
0799 def OMP_Interchange : Directive<"interchange"> {
0800   let allowedOnceClauses = [
0801     VersionedClause<OMPC_Permutation>,
0802   ];
0803   let association = AS_Loop;
0804   let category = CA_Executable;
0805 }
0806 def OMP_interop : Directive<"interop"> {
0807   let allowedClauses = [
0808     VersionedClause<OMPC_Depend>,
0809     VersionedClause<OMPC_Destroy>,
0810     VersionedClause<OMPC_Device>,
0811     VersionedClause<OMPC_Init>,
0812     VersionedClause<OMPC_NoWait>,
0813     VersionedClause<OMPC_Use>,
0814   ];
0815   let association = AS_None;
0816   let category = CA_Executable;
0817 }
0818 def OMP_loop : Directive<"loop"> {
0819   let allowedClauses = [
0820     VersionedClause<OMPC_LastPrivate>,
0821     VersionedClause<OMPC_Private>,
0822     VersionedClause<OMPC_Reduction>,
0823   ];
0824   let allowedOnceClauses = [
0825     VersionedClause<OMPC_Bind, 50>,
0826     VersionedClause<OMPC_Collapse>,
0827     VersionedClause<OMPC_Order, 50>,
0828   ];
0829   let association = AS_Loop;
0830   let category = CA_Executable;
0831 }
0832 def OMP_masked : Directive<"masked"> {
0833   let allowedOnceClauses = [
0834     VersionedClause<OMPC_Filter>,
0835   ];
0836   let association = AS_Block;
0837   let category = CA_Executable;
0838 }
0839 def OMP_Master : Directive<"master"> {
0840   let association = AS_Block;
0841   let category = CA_Executable;
0842 }
0843 def OMP_Metadirective : Directive<"metadirective"> {
0844   let allowedClauses = [
0845     VersionedClause<OMPC_When>,
0846   ];
0847   let allowedOnceClauses = [
0848     VersionedClause<OMPC_Default>,
0849   ];
0850   let association = AS_None;
0851   let category = CA_Meta;
0852 }
0853 def OMP_Nothing : Directive<"nothing"> {
0854   let association = AS_None;
0855   let category = CA_Utility;
0856 }
0857 def OMP_Ordered : Directive<"ordered"> {
0858   let allowedClauses = [
0859     VersionedClause<OMPC_Depend>,
0860     VersionedClause<OMPC_Doacross, 52>,
0861   ];
0862   let allowedOnceClauses = [
0863     VersionedClause<OMPC_Simd>,
0864     VersionedClause<OMPC_Threads>,
0865   ];
0866   let association = AS_None;
0867   // There is also a block-associated "ordered" directive.
0868   let category = CA_Executable;
0869 }
0870 def OMP_Parallel : Directive<"parallel"> {
0871   let allowedClauses = [
0872     VersionedClause<OMPC_Allocate>,
0873     VersionedClause<OMPC_Copyin>,
0874     VersionedClause<OMPC_FirstPrivate>,
0875     VersionedClause<OMPC_OMPX_Attribute>,
0876     VersionedClause<OMPC_Private>,
0877     VersionedClause<OMPC_Reduction>,
0878     VersionedClause<OMPC_Shared>,
0879   ];
0880   let allowedOnceClauses = [
0881     VersionedClause<OMPC_Default>,
0882     VersionedClause<OMPC_If>,
0883     VersionedClause<OMPC_NumThreads>,
0884     VersionedClause<OMPC_ProcBind>,
0885   ];
0886   let association = AS_Block;
0887   let category = CA_Executable;
0888 }
0889 def OMP_Requires : Directive<"requires"> {
0890   let allowedOnceClauses = [
0891     VersionedClause<OMPC_UnifiedAddress>,
0892     VersionedClause<OMPC_UnifiedSharedMemory>,
0893     // OpenMP 5.2 Spec: If an implementation is not supporting a requirement
0894     // (reverse offload in this case) then it should give compile-time error
0895     // termination.
0896     // Seeting supported version for reverse_offload to a distant future version
0897     // 9.9 so that its partial support can be tested in the meantime.
0898     //
0899     // TODO: Correct this supprted version number whenever complete
0900     // implementation of reverse_offload is available.
0901     VersionedClause<OMPC_AtomicDefaultMemOrder>,
0902     VersionedClause<OMPC_DynamicAllocators>,
0903     VersionedClause<OMPC_ReverseOffload, 99>,
0904   ];
0905   let association = AS_None;
0906   let category = CA_Informational;
0907 }
0908 def OMP_Reverse : Directive<"reverse"> {
0909   let association = AS_Loop;
0910   let category = CA_Executable;
0911 }
0912 def OMP_Scan : Directive<"scan"> {
0913   let allowedClauses = [
0914     VersionedClause<OMPC_Exclusive>,
0915     VersionedClause<OMPC_Inclusive>,
0916   ];
0917   let association = AS_Separating;
0918   let category = CA_Subsidiary;
0919 }
0920 def OMP_Scope : Directive<"scope"> {
0921   let allowedClauses = [
0922     VersionedClause<OMPC_Private, 51>,
0923     VersionedClause<OMPC_Reduction, 51>,
0924     VersionedClause<OMPC_FirstPrivate, 52>,
0925     VersionedClause<OMPC_Allocate, 52>,
0926   ];
0927   let allowedOnceClauses = [
0928     VersionedClause<OMPC_NoWait, 51>,
0929   ];
0930   let association = AS_Block;
0931   let category = CA_Executable;
0932 }
0933 def OMP_EndScope : Directive<"end scope"> {
0934   let allowedOnceClauses = [
0935     VersionedClause<OMPC_NoWait>,
0936   ];
0937   let leafConstructs = OMP_Scope.leafConstructs;
0938   let association = OMP_Scope.association;
0939   let category = OMP_Scope.category;
0940 }
0941 def OMP_Section : Directive<"section"> {
0942   let association = AS_Separating;
0943   let category = CA_Subsidiary;
0944 }
0945 def OMP_Sections : Directive<"sections"> {
0946   let allowedClauses = [
0947     VersionedClause<OMPC_Allocate>,
0948     VersionedClause<OMPC_FirstPrivate>,
0949     VersionedClause<OMPC_LastPrivate>,
0950     VersionedClause<OMPC_NoWait>,
0951     VersionedClause<OMPC_Private>,
0952     VersionedClause<OMPC_Reduction>,
0953   ];
0954   let association = AS_Block;
0955   let category = CA_Executable;
0956 }
0957 def OMP_EndSections : Directive<"end sections"> {
0958   let allowedOnceClauses = [
0959     VersionedClause<OMPC_NoWait>,
0960   ];
0961   let leafConstructs = OMP_Sections.leafConstructs;
0962   let association = OMP_Sections.association;
0963   let category = OMP_Sections.category;
0964 }
0965 def OMP_Simd : Directive<"simd"> {
0966   let allowedClauses = [
0967     VersionedClause<OMPC_Aligned>,
0968     VersionedClause<OMPC_Allocate>,
0969     VersionedClause<OMPC_LastPrivate>,
0970     VersionedClause<OMPC_Linear>,
0971     VersionedClause<OMPC_NonTemporal, 50>,
0972     VersionedClause<OMPC_Private>,
0973     VersionedClause<OMPC_Reduction>,
0974   ];
0975   let allowedOnceClauses = [
0976     VersionedClause<OMPC_Collapse>,
0977     VersionedClause<OMPC_If, 50>,
0978     VersionedClause<OMPC_Order, 50>,
0979     VersionedClause<OMPC_SafeLen>,
0980     VersionedClause<OMPC_SimdLen>,
0981   ];
0982   let association = AS_Loop;
0983   let category = CA_Executable;
0984 }
0985 def OMP_Single : Directive<"single"> {
0986   let allowedClauses = [
0987     VersionedClause<OMPC_Allocate>,
0988     VersionedClause<OMPC_CopyPrivate>,
0989     VersionedClause<OMPC_FirstPrivate>,
0990     VersionedClause<OMPC_NoWait>,
0991     VersionedClause<OMPC_Private>,
0992   ];
0993   let association = AS_Block;
0994   let category = CA_Executable;
0995 }
0996 def OMP_EndSingle : Directive<"end single"> {
0997   let allowedClauses = [
0998     VersionedClause<OMPC_CopyPrivate>,
0999   ];
1000   let allowedOnceClauses = [
1001     VersionedClause<OMPC_NoWait>,
1002   ];
1003   let leafConstructs = OMP_Single.leafConstructs;
1004   let association = OMP_Single.association;
1005   let category = OMP_Single.category;
1006 }
1007 def OMP_Target : Directive<"target"> {
1008   let allowedClauses = [
1009     VersionedClause<OMPC_Allocate>,
1010     VersionedClause<OMPC_Depend>,
1011     VersionedClause<OMPC_FirstPrivate>,
1012     VersionedClause<OMPC_HasDeviceAddr, 51>,
1013     VersionedClause<OMPC_InReduction, 50>,
1014     VersionedClause<OMPC_IsDevicePtr>,
1015     VersionedClause<OMPC_Map>,
1016     VersionedClause<OMPC_OMPX_Attribute>,
1017     VersionedClause<OMPC_Private>,
1018     VersionedClause<OMPC_UsesAllocators, 50>,
1019   ];
1020   let allowedOnceClauses = [
1021     VersionedClause<OMPC_DefaultMap>,
1022     VersionedClause<OMPC_Device>,
1023     VersionedClause<OMPC_If>,
1024     VersionedClause<OMPC_NoWait>,
1025     VersionedClause<OMPC_OMPX_Bare>,
1026     VersionedClause<OMPC_OMPX_DynCGroupMem>,
1027     VersionedClause<OMPC_ThreadLimit, 51>,
1028   ];
1029   let association = AS_Block;
1030   let category = CA_Executable;
1031 }
1032 def OMP_TargetData : Directive<"target data"> {
1033   let allowedOnceClauses = [
1034     VersionedClause<OMPC_Device>,
1035     VersionedClause<OMPC_If>,
1036   ];
1037   let requiredClauses = [
1038     VersionedClause<OMPC_Map>,
1039     VersionedClause<OMPC_UseDeviceAddr, 50>,
1040     VersionedClause<OMPC_UseDevicePtr>,
1041   ];
1042   let association = AS_Block;
1043   let category = CA_Executable;
1044 }
1045 def OMP_TargetEnterData : Directive<"target enter data"> {
1046   let allowedClauses = [
1047     VersionedClause<OMPC_Depend>,
1048   ];
1049   let allowedOnceClauses = [
1050     VersionedClause<OMPC_Device>,
1051     VersionedClause<OMPC_If>,
1052     VersionedClause<OMPC_NoWait>,
1053   ];
1054   let requiredClauses = [
1055     VersionedClause<OMPC_Map>,
1056   ];
1057   let association = AS_None;
1058   let category = CA_Executable;
1059 }
1060 def OMP_TargetExitData : Directive<"target exit data"> {
1061   let allowedClauses = [
1062     VersionedClause<OMPC_Depend>,
1063   ];
1064   let allowedOnceClauses = [
1065     VersionedClause<OMPC_Device>,
1066     VersionedClause<OMPC_If>,
1067     VersionedClause<OMPC_NoWait>,
1068   ];
1069   let requiredClauses = [
1070     VersionedClause<OMPC_Map>,
1071   ];
1072   let association = AS_None;
1073   let category = CA_Executable;
1074 }
1075 def OMP_TargetUpdate : Directive<"target update"> {
1076   let allowedClauses = [
1077     VersionedClause<OMPC_Depend>,
1078     VersionedClause<OMPC_From>,
1079     VersionedClause<OMPC_To>,
1080   ];
1081   let allowedOnceClauses = [
1082     VersionedClause<OMPC_Device>,
1083     VersionedClause<OMPC_If>,
1084     VersionedClause<OMPC_NoWait>,
1085   ];
1086   let association = AS_None;
1087   let category = CA_Executable;
1088 }
1089 def OMP_Task : Directive<"task"> {
1090   let allowedClauses = [
1091     VersionedClause<OMPC_Affinity, 50>,
1092     VersionedClause<OMPC_Allocate>,
1093     VersionedClause<OMPC_Depend>,
1094     VersionedClause<OMPC_Detach, 50>,
1095     VersionedClause<OMPC_FirstPrivate>,
1096     VersionedClause<OMPC_InReduction>,
1097     VersionedClause<OMPC_Mergeable>,
1098     VersionedClause<OMPC_Private>,
1099     VersionedClause<OMPC_Shared>,
1100     VersionedClause<OMPC_Untied>,
1101   ];
1102   let allowedOnceClauses = [
1103     VersionedClause<OMPC_Default>,
1104     VersionedClause<OMPC_Final>,
1105     VersionedClause<OMPC_If>,
1106     VersionedClause<OMPC_Priority>,
1107   ];
1108   let association = AS_Block;
1109   let category = CA_Executable;
1110 }
1111 def OMP_TaskGroup : Directive<"taskgroup"> {
1112   let allowedClauses = [
1113     VersionedClause<OMPC_Allocate, 50>,
1114     VersionedClause<OMPC_TaskReduction, 50>,
1115   ];
1116   let association = AS_Block;
1117   let category = CA_Executable;
1118 }
1119 def OMP_TaskLoop : Directive<"taskloop"> {
1120   let allowedClauses = [
1121     VersionedClause<OMPC_Allocate>,
1122     VersionedClause<OMPC_FirstPrivate>,
1123     VersionedClause<OMPC_InReduction>,
1124     VersionedClause<OMPC_LastPrivate>,
1125     VersionedClause<OMPC_Mergeable>,
1126     VersionedClause<OMPC_NoGroup>,
1127     VersionedClause<OMPC_Private>,
1128     VersionedClause<OMPC_Reduction>,
1129     VersionedClause<OMPC_Shared>,
1130     VersionedClause<OMPC_Untied>,
1131   ];
1132   let allowedOnceClauses = [
1133     VersionedClause<OMPC_Collapse>,
1134     VersionedClause<OMPC_Default>,
1135     VersionedClause<OMPC_Final>,
1136     VersionedClause<OMPC_If>,
1137     VersionedClause<OMPC_Priority>,
1138   ];
1139   let allowedExclusiveClauses = [
1140     VersionedClause<OMPC_GrainSize>,
1141     VersionedClause<OMPC_NumTasks>,
1142   ];
1143   let association = AS_Loop;
1144   let category = CA_Executable;
1145 }
1146 def OMP_TaskWait : Directive<"taskwait"> {
1147   let allowedClauses = [
1148     VersionedClause<OMPC_Depend, 50>,
1149     VersionedClause<OMPC_NoWait, 51>,
1150   ];
1151   let association = AS_None;
1152   let category = CA_Executable;
1153 }
1154 def OMP_TaskYield : Directive<"taskyield"> {
1155   let association = AS_None;
1156   let category = CA_Executable;
1157 }
1158 def OMP_Teams : Directive<"teams"> {
1159   let allowedClauses = [
1160     VersionedClause<OMPC_Allocate>,
1161     VersionedClause<OMPC_FirstPrivate>,
1162     VersionedClause<OMPC_OMPX_Attribute>,
1163     VersionedClause<OMPC_Private>,
1164     VersionedClause<OMPC_Reduction>,
1165     VersionedClause<OMPC_Shared>,
1166   ];
1167   let allowedOnceClauses = [
1168     VersionedClause<OMPC_Default>,
1169     VersionedClause<OMPC_If, 52>,
1170     VersionedClause<OMPC_NumTeams>,
1171     VersionedClause<OMPC_ThreadLimit>,
1172   ];
1173   let association = AS_Block;
1174   let category = CA_Executable;
1175 }
1176 def OMP_ThreadPrivate : Directive<"threadprivate"> {
1177   let association = AS_None;
1178   let category = CA_Declarative;
1179 }
1180 def OMP_Tile : Directive<"tile"> {
1181   let allowedOnceClauses = [
1182     VersionedClause<OMPC_Sizes, 51>,
1183   ];
1184   let association = AS_Loop;
1185   let category = CA_Executable;
1186 }
1187 def OMP_Unknown : Directive<"unknown"> {
1188   let isDefault = true;
1189   let association = AS_None;
1190   let category = CA_Utility;
1191 }
1192 def OMP_Unroll : Directive<"unroll"> {
1193   let allowedOnceClauses = [
1194     VersionedClause<OMPC_Full, 51>,
1195     VersionedClause<OMPC_Partial, 51>,
1196   ];
1197   let association = AS_Loop;
1198   let category = CA_Executable;
1199 }
1200 def OMP_Workshare : Directive<"workshare"> {
1201   let allowedOnceClauses = [
1202     VersionedClause<OMPC_NoWait>,
1203   ];
1204   let association = AS_Block;
1205   let category = CA_Executable;
1206 }
1207 def OMP_EndWorkshare : Directive<"end workshare"> {
1208   let allowedOnceClauses = [
1209     VersionedClause<OMPC_NoWait>,
1210   ];
1211   let leafConstructs = OMP_Workshare.leafConstructs;
1212   let association = OMP_Workshare.association;
1213   let category = OMP_Workshare.category;
1214 }
1215 
1216 //===----------------------------------------------------------------------===//
1217 // Definitions of OpenMP compound directives
1218 // Sorted alphabetically wrt directive spelling, except "end xyz" immediately
1219 // follows "xyz".
1220 //===----------------------------------------------------------------------===//
1221 
1222 def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
1223   let allowedClauses = [
1224     VersionedClause<OMPC_Allocate>,
1225     VersionedClause<OMPC_Copyin>,
1226     VersionedClause<OMPC_Default>,
1227     VersionedClause<OMPC_FirstPrivate>,
1228     VersionedClause<OMPC_LastPrivate>,
1229     VersionedClause<OMPC_Linear>,
1230     VersionedClause<OMPC_Private>,
1231     VersionedClause<OMPC_Reduction>,
1232     VersionedClause<OMPC_Shared>,
1233   ];
1234   let allowedOnceClauses = [
1235     VersionedClause<OMPC_Collapse>,
1236     VersionedClause<OMPC_DistSchedule>,
1237     VersionedClause<OMPC_If>,
1238     VersionedClause<OMPC_NumThreads>,
1239     VersionedClause<OMPC_Order, 50>,
1240     VersionedClause<OMPC_ProcBind>,
1241     VersionedClause<OMPC_Schedule>,
1242   ];
1243   let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_Do];
1244   let category = CA_Executable;
1245 }
1246 def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
1247   let allowedClauses = [
1248     VersionedClause<OMPC_Aligned>,
1249     VersionedClause<OMPC_Allocate>,
1250     VersionedClause<OMPC_Collapse>,
1251     VersionedClause<OMPC_Copyin>,
1252     VersionedClause<OMPC_Default>,
1253     VersionedClause<OMPC_DistSchedule>,
1254     VersionedClause<OMPC_FirstPrivate>,
1255     VersionedClause<OMPC_If>,
1256     VersionedClause<OMPC_LastPrivate>,
1257     VersionedClause<OMPC_Linear>,
1258     VersionedClause<OMPC_NonTemporal>,
1259     VersionedClause<OMPC_NumThreads>,
1260     VersionedClause<OMPC_Order, 50>,
1261     VersionedClause<OMPC_Private>,
1262     VersionedClause<OMPC_ProcBind>,
1263     VersionedClause<OMPC_Reduction>,
1264     VersionedClause<OMPC_SafeLen>,
1265     VersionedClause<OMPC_Schedule>,
1266     VersionedClause<OMPC_Shared>,
1267     VersionedClause<OMPC_SimdLen>,
1268   ];
1269   let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
1270   let category = CA_Executable;
1271 }
1272 def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
1273   let allowedClauses = [
1274     VersionedClause<OMPC_Allocate>,
1275     VersionedClause<OMPC_Collapse>,
1276     VersionedClause<OMPC_Copyin>,
1277     VersionedClause<OMPC_Default>,
1278     VersionedClause<OMPC_DistSchedule>,
1279     VersionedClause<OMPC_FirstPrivate>,
1280     VersionedClause<OMPC_If>,
1281     VersionedClause<OMPC_LastPrivate>,
1282     VersionedClause<OMPC_NumThreads>,
1283     VersionedClause<OMPC_OMPX_Attribute>,
1284     VersionedClause<OMPC_Order, 50>,
1285     VersionedClause<OMPC_Private>,
1286     VersionedClause<OMPC_ProcBind>,
1287     VersionedClause<OMPC_Reduction>,
1288     VersionedClause<OMPC_Schedule>,
1289     VersionedClause<OMPC_Shared>,
1290   ];
1291   let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_For];
1292   let category = CA_Executable;
1293 }
1294 def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
1295   let allowedClauses = [
1296     VersionedClause<OMPC_Aligned>,
1297     VersionedClause<OMPC_Allocate>,
1298     VersionedClause<OMPC_Collapse>,
1299     VersionedClause<OMPC_Copyin>,
1300     VersionedClause<OMPC_Default>,
1301     VersionedClause<OMPC_DistSchedule>,
1302     VersionedClause<OMPC_FirstPrivate>,
1303     VersionedClause<OMPC_If>,
1304     VersionedClause<OMPC_LastPrivate>,
1305     VersionedClause<OMPC_Linear>,
1306     VersionedClause<OMPC_NonTemporal, 50>,
1307     VersionedClause<OMPC_NumThreads>,
1308     VersionedClause<OMPC_OMPX_Attribute>,
1309     VersionedClause<OMPC_Order, 50>,
1310     VersionedClause<OMPC_Private>,
1311     VersionedClause<OMPC_ProcBind>,
1312     VersionedClause<OMPC_Reduction>,
1313     VersionedClause<OMPC_SafeLen>,
1314     VersionedClause<OMPC_Schedule>,
1315     VersionedClause<OMPC_Shared>,
1316     VersionedClause<OMPC_SimdLen>,
1317   ];
1318   let leafConstructs = [OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
1319   let category = CA_Executable;
1320 }
1321 def OMP_DistributeSimd : Directive<"distribute simd"> {
1322   let allowedClauses = [
1323     VersionedClause<OMPC_Aligned>,
1324     VersionedClause<OMPC_Allocate>,
1325     VersionedClause<OMPC_Copyin>,
1326     VersionedClause<OMPC_Default>,
1327     VersionedClause<OMPC_FirstPrivate>,
1328     VersionedClause<OMPC_LastPrivate>,
1329     VersionedClause<OMPC_Linear>,
1330     VersionedClause<OMPC_NonTemporal, 50>,
1331     VersionedClause<OMPC_Private>,
1332     VersionedClause<OMPC_Reduction>,
1333   ];
1334   let allowedOnceClauses = [
1335     VersionedClause<OMPC_Collapse>,
1336     VersionedClause<OMPC_DistSchedule>,
1337     VersionedClause<OMPC_If, 50>,
1338     VersionedClause<OMPC_NumThreads>,
1339     VersionedClause<OMPC_Order, 50>,
1340     VersionedClause<OMPC_ProcBind>,
1341     VersionedClause<OMPC_SafeLen>,
1342     VersionedClause<OMPC_Schedule>,
1343     VersionedClause<OMPC_SimdLen>,
1344   ];
1345   let leafConstructs = [OMP_Distribute, OMP_Simd];
1346   let category = CA_Executable;
1347 }
1348 def OMP_DoSimd : Directive<"do simd"> {
1349   let allowedClauses = [
1350     VersionedClause<OMPC_Aligned>,
1351     VersionedClause<OMPC_FirstPrivate>,
1352     VersionedClause<OMPC_LastPrivate>,
1353     VersionedClause<OMPC_Linear>,
1354     VersionedClause<OMPC_Private>,
1355     VersionedClause<OMPC_Reduction>,
1356   ];
1357   let allowedOnceClauses = [
1358     VersionedClause<OMPC_Collapse>,
1359     VersionedClause<OMPC_If>,
1360     VersionedClause<OMPC_NoWait>,
1361     VersionedClause<OMPC_Order, 50>,
1362     VersionedClause<OMPC_Ordered>,
1363     VersionedClause<OMPC_SafeLen>,
1364     VersionedClause<OMPC_Schedule>,
1365     VersionedClause<OMPC_SimdLen>,
1366   ];
1367   let leafConstructs = [OMP_Do, OMP_Simd];
1368   let category = CA_Executable;
1369 }
1370 def OMP_EndDoSimd : Directive<"end do simd"> {
1371   let allowedOnceClauses = [
1372     VersionedClause<OMPC_NoWait>,
1373   ];
1374   let leafConstructs = OMP_DoSimd.leafConstructs;
1375   let association = OMP_DoSimd.association;
1376   let category = OMP_DoSimd.category;
1377 }
1378 def OMP_ForSimd : Directive<"for simd"> {
1379   let allowedClauses = [
1380     VersionedClause<OMPC_Aligned>,
1381     VersionedClause<OMPC_Allocate>,
1382     VersionedClause<OMPC_Collapse>,
1383     VersionedClause<OMPC_FirstPrivate>,
1384     VersionedClause<OMPC_If, 50>,
1385     VersionedClause<OMPC_LastPrivate>,
1386     VersionedClause<OMPC_Linear>,
1387     VersionedClause<OMPC_NonTemporal, 50>,
1388     VersionedClause<OMPC_NoWait>,
1389     VersionedClause<OMPC_Order, 50>,
1390     VersionedClause<OMPC_Ordered>,
1391     VersionedClause<OMPC_Private>,
1392     VersionedClause<OMPC_Reduction>,
1393     VersionedClause<OMPC_SafeLen>,
1394     VersionedClause<OMPC_Schedule>,
1395     VersionedClause<OMPC_SimdLen>,
1396   ];
1397   let leafConstructs = [OMP_For, OMP_Simd];
1398   let category = CA_Executable;
1399 }
1400 def OMP_target_loop : Directive<"target loop"> {
1401   let allowedClauses = [
1402     VersionedClause<OMPC_Allocate>,
1403     VersionedClause<OMPC_Depend>,
1404     VersionedClause<OMPC_FirstPrivate>,
1405     VersionedClause<OMPC_IsDevicePtr>,
1406     VersionedClause<OMPC_HasDeviceAddr, 51>,
1407     VersionedClause<OMPC_LastPrivate>,
1408     VersionedClause<OMPC_Map>,
1409     VersionedClause<OMPC_Private>,
1410     VersionedClause<OMPC_Reduction>,
1411     VersionedClause<OMPC_UsesAllocators, 50>,
1412     VersionedClause<OMPC_OMPX_Attribute>,
1413     VersionedClause<OMPC_InReduction, 50>,
1414 
1415   ];
1416   let allowedOnceClauses = [
1417     VersionedClause<OMPC_Bind, 50>,
1418     VersionedClause<OMPC_Collapse>,
1419     VersionedClause<OMPC_Order>,
1420     VersionedClause<OMPC_ThreadLimit>,
1421     VersionedClause<OMPC_OMPX_DynCGroupMem>,
1422     VersionedClause<OMPC_If>,
1423     VersionedClause<OMPC_Device>,
1424     VersionedClause<OMPC_DefaultMap>,
1425     VersionedClause<OMPC_NoWait>,
1426   ];
1427   let leafConstructs = [OMP_Target, OMP_loop];
1428   let category = CA_Executable;
1429 }
1430 def OMP_MaskedTaskloop : Directive<"masked taskloop"> {
1431   let allowedClauses = [
1432     VersionedClause<OMPC_Allocate>,
1433     VersionedClause<OMPC_Collapse>,
1434     VersionedClause<OMPC_Default>,
1435     VersionedClause<OMPC_Filter>,
1436     VersionedClause<OMPC_Final>,
1437     VersionedClause<OMPC_FirstPrivate>,
1438     VersionedClause<OMPC_GrainSize>,
1439     VersionedClause<OMPC_If>,
1440     VersionedClause<OMPC_InReduction>,
1441     VersionedClause<OMPC_LastPrivate>,
1442     VersionedClause<OMPC_Mergeable>,
1443     VersionedClause<OMPC_NoGroup>,
1444     VersionedClause<OMPC_NumTasks>,
1445     VersionedClause<OMPC_Priority>,
1446     VersionedClause<OMPC_Private>,
1447     VersionedClause<OMPC_Reduction>,
1448     VersionedClause<OMPC_Shared>,
1449     VersionedClause<OMPC_Untied>,
1450   ];
1451   let leafConstructs = [OMP_masked, OMP_TaskLoop];
1452   let category = CA_Executable;
1453 }
1454 def OMP_MaskedTaskloopSimd : Directive<"masked taskloop simd"> {
1455   let allowedClauses = [
1456     VersionedClause<OMPC_Aligned>,
1457     VersionedClause<OMPC_Allocate>,
1458     VersionedClause<OMPC_Collapse>,
1459     VersionedClause<OMPC_Default>,
1460     VersionedClause<OMPC_Filter>,
1461     VersionedClause<OMPC_Final>,
1462     VersionedClause<OMPC_FirstPrivate>,
1463     VersionedClause<OMPC_GrainSize>,
1464     VersionedClause<OMPC_If>,
1465     VersionedClause<OMPC_InReduction>,
1466     VersionedClause<OMPC_LastPrivate>,
1467     VersionedClause<OMPC_Linear>,
1468     VersionedClause<OMPC_Mergeable>,
1469     VersionedClause<OMPC_NoGroup>,
1470     VersionedClause<OMPC_NonTemporal, 50>,
1471     VersionedClause<OMPC_NumTasks>,
1472     VersionedClause<OMPC_Order, 50>,
1473     VersionedClause<OMPC_Priority>,
1474     VersionedClause<OMPC_Private>,
1475     VersionedClause<OMPC_Reduction>,
1476     VersionedClause<OMPC_SafeLen>,
1477     VersionedClause<OMPC_Shared>,
1478     VersionedClause<OMPC_SimdLen>,
1479     VersionedClause<OMPC_Untied>,
1480   ];
1481   let leafConstructs = [OMP_masked, OMP_TaskLoop, OMP_Simd];
1482   let category = CA_Executable;
1483 }
1484 def OMP_MasterTaskloop : Directive<"master taskloop"> {
1485   let allowedClauses = [
1486     VersionedClause<OMPC_Allocate>,
1487     VersionedClause<OMPC_Collapse>,
1488     VersionedClause<OMPC_Default>,
1489     VersionedClause<OMPC_Final>,
1490     VersionedClause<OMPC_FirstPrivate>,
1491     VersionedClause<OMPC_GrainSize>,
1492     VersionedClause<OMPC_If>,
1493     VersionedClause<OMPC_InReduction>,
1494     VersionedClause<OMPC_LastPrivate>,
1495     VersionedClause<OMPC_Mergeable>,
1496     VersionedClause<OMPC_NoGroup>,
1497     VersionedClause<OMPC_NumTasks>,
1498     VersionedClause<OMPC_Priority>,
1499     VersionedClause<OMPC_Private>,
1500     VersionedClause<OMPC_Reduction>,
1501     VersionedClause<OMPC_Shared>,
1502     VersionedClause<OMPC_Untied>,
1503   ];
1504   let leafConstructs = [OMP_Master, OMP_TaskLoop];
1505   let category = CA_Executable;
1506 }
1507 def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1508   let allowedClauses = [
1509     VersionedClause<OMPC_Aligned>,
1510     VersionedClause<OMPC_Allocate>,
1511     VersionedClause<OMPC_Collapse>,
1512     VersionedClause<OMPC_Default>,
1513     VersionedClause<OMPC_Final>,
1514     VersionedClause<OMPC_FirstPrivate>,
1515     VersionedClause<OMPC_GrainSize>,
1516     VersionedClause<OMPC_If>,
1517     VersionedClause<OMPC_InReduction>,
1518     VersionedClause<OMPC_LastPrivate>,
1519     VersionedClause<OMPC_Linear>,
1520     VersionedClause<OMPC_Mergeable>,
1521     VersionedClause<OMPC_NoGroup>,
1522     VersionedClause<OMPC_NonTemporal, 50>,
1523     VersionedClause<OMPC_NumTasks>,
1524     VersionedClause<OMPC_Order, 50>,
1525     VersionedClause<OMPC_Priority>,
1526     VersionedClause<OMPC_Private>,
1527     VersionedClause<OMPC_Reduction>,
1528     VersionedClause<OMPC_SafeLen>,
1529     VersionedClause<OMPC_Shared>,
1530     VersionedClause<OMPC_SimdLen>,
1531     VersionedClause<OMPC_Untied>,
1532   ];
1533   let leafConstructs = [OMP_Master, OMP_TaskLoop, OMP_Simd];
1534   let category = CA_Executable;
1535 }
1536 def OMP_ParallelDo : Directive<"parallel do"> {
1537   let allowedClauses = [
1538     VersionedClause<OMPC_Copyin>,
1539     VersionedClause<OMPC_Default>,
1540     VersionedClause<OMPC_FirstPrivate>,
1541     VersionedClause<OMPC_LastPrivate>,
1542     VersionedClause<OMPC_Linear>,
1543     VersionedClause<OMPC_Private>,
1544     VersionedClause<OMPC_Reduction>,
1545     VersionedClause<OMPC_Shared>,
1546   ];
1547   let allowedOnceClauses = [
1548     VersionedClause<OMPC_Collapse>,
1549     VersionedClause<OMPC_If>,
1550     VersionedClause<OMPC_NumThreads>,
1551     VersionedClause<OMPC_Order, 50>,
1552     VersionedClause<OMPC_Ordered>,
1553     VersionedClause<OMPC_ProcBind>,
1554     VersionedClause<OMPC_Schedule>,
1555   ];
1556   let leafConstructs = [OMP_Parallel, OMP_Do];
1557   let category = CA_Executable;
1558 }
1559 def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
1560   let allowedClauses = [
1561     VersionedClause<OMPC_Aligned>,
1562     VersionedClause<OMPC_Allocate>,
1563     VersionedClause<OMPC_Copyin>,
1564     VersionedClause<OMPC_Default>,
1565     VersionedClause<OMPC_FirstPrivate>,
1566     VersionedClause<OMPC_If>,
1567     VersionedClause<OMPC_LastPrivate>,
1568     VersionedClause<OMPC_Linear>,
1569     VersionedClause<OMPC_NonTemporal>,
1570     VersionedClause<OMPC_Private>,
1571     VersionedClause<OMPC_Reduction>,
1572     VersionedClause<OMPC_Shared>,
1573   ];
1574   let allowedOnceClauses = [
1575     VersionedClause<OMPC_Collapse>,
1576     VersionedClause<OMPC_NumThreads>,
1577     VersionedClause<OMPC_Order, 50>,
1578     VersionedClause<OMPC_Ordered>,
1579     VersionedClause<OMPC_ProcBind>,
1580     VersionedClause<OMPC_SafeLen>,
1581     VersionedClause<OMPC_Schedule>,
1582     VersionedClause<OMPC_SimdLen>,
1583   ];
1584   let leafConstructs = [OMP_Parallel, OMP_Do, OMP_Simd];
1585   let category = CA_Executable;
1586 }
1587 def OMP_ParallelFor : Directive<"parallel for"> {
1588   let allowedClauses = [
1589     VersionedClause<OMPC_Allocate>,
1590     VersionedClause<OMPC_Collapse>,
1591     VersionedClause<OMPC_Copyin>,
1592     VersionedClause<OMPC_Default>,
1593     VersionedClause<OMPC_FirstPrivate>,
1594     VersionedClause<OMPC_If>,
1595     VersionedClause<OMPC_LastPrivate>,
1596     VersionedClause<OMPC_Linear>,
1597     VersionedClause<OMPC_NumThreads>,
1598     VersionedClause<OMPC_OMPX_Attribute>,
1599     VersionedClause<OMPC_Order, 50>,
1600     VersionedClause<OMPC_Ordered>,
1601     VersionedClause<OMPC_Private>,
1602     VersionedClause<OMPC_ProcBind>,
1603     VersionedClause<OMPC_Reduction>,
1604     VersionedClause<OMPC_Schedule>,
1605     VersionedClause<OMPC_Shared>,
1606   ];
1607   let leafConstructs = [OMP_Parallel, OMP_For];
1608   let category = CA_Executable;
1609 }
1610 def OMP_ParallelForSimd : Directive<"parallel for simd"> {
1611   let allowedClauses = [
1612     VersionedClause<OMPC_Aligned>,
1613     VersionedClause<OMPC_Allocate>,
1614     VersionedClause<OMPC_Collapse>,
1615     VersionedClause<OMPC_Copyin>,
1616     VersionedClause<OMPC_Default>,
1617     VersionedClause<OMPC_FirstPrivate>,
1618     VersionedClause<OMPC_If>,
1619     VersionedClause<OMPC_LastPrivate>,
1620     VersionedClause<OMPC_Linear>,
1621     VersionedClause<OMPC_NonTemporal, 50>,
1622     VersionedClause<OMPC_NumThreads>,
1623     VersionedClause<OMPC_OMPX_Attribute>,
1624     VersionedClause<OMPC_Order, 50>,
1625     VersionedClause<OMPC_Ordered>,
1626     VersionedClause<OMPC_Private>,
1627     VersionedClause<OMPC_ProcBind>,
1628     VersionedClause<OMPC_Reduction>,
1629     VersionedClause<OMPC_SafeLen>,
1630     VersionedClause<OMPC_Schedule>,
1631     VersionedClause<OMPC_Shared>,
1632     VersionedClause<OMPC_SimdLen>,
1633   ];
1634   let leafConstructs = [OMP_Parallel, OMP_For, OMP_Simd];
1635   let category = CA_Executable;
1636 }
1637 def OMP_parallel_loop : Directive<"parallel loop"> {
1638   let allowedClauses = [
1639     VersionedClause<OMPC_Allocate>,
1640     VersionedClause<OMPC_Copyin>,
1641     VersionedClause<OMPC_FirstPrivate>,
1642     VersionedClause<OMPC_LastPrivate>,
1643     VersionedClause<OMPC_OMPX_Attribute>,
1644     VersionedClause<OMPC_Private>,
1645     VersionedClause<OMPC_Reduction>,
1646     VersionedClause<OMPC_Shared>,
1647   ];
1648   let allowedOnceClauses = [
1649     VersionedClause<OMPC_Bind, 50>,
1650     VersionedClause<OMPC_Collapse>,
1651     VersionedClause<OMPC_Default>,
1652     VersionedClause<OMPC_If>,
1653     VersionedClause<OMPC_NumThreads>,
1654     VersionedClause<OMPC_Order>,
1655     VersionedClause<OMPC_ProcBind>,
1656   ];
1657   let leafConstructs = [OMP_Parallel, OMP_loop];
1658   let category = CA_Executable;
1659 }
1660 def OMP_ParallelMasked : Directive<"parallel masked"> {
1661   let allowedClauses = [
1662     VersionedClause<OMPC_Allocate>,
1663     VersionedClause<OMPC_Copyin>,
1664     VersionedClause<OMPC_Default>,
1665     VersionedClause<OMPC_Filter>,
1666     VersionedClause<OMPC_FirstPrivate>,
1667     VersionedClause<OMPC_If>,
1668     VersionedClause<OMPC_NumThreads>,
1669     VersionedClause<OMPC_OMPX_Attribute>,
1670     VersionedClause<OMPC_Private>,
1671     VersionedClause<OMPC_ProcBind>,
1672     VersionedClause<OMPC_Reduction>,
1673     VersionedClause<OMPC_Shared>,
1674   ];
1675   let leafConstructs = [OMP_Parallel, OMP_masked];
1676   let category = CA_Executable;
1677 }
1678 def OMP_ParallelMaskedTaskloop :
1679     Directive<"parallel masked taskloop"> {
1680   let allowedClauses = [
1681     VersionedClause<OMPC_Allocate>,
1682     VersionedClause<OMPC_Collapse>,
1683     VersionedClause<OMPC_Copyin>,
1684     VersionedClause<OMPC_Default>,
1685     VersionedClause<OMPC_Filter>,
1686     VersionedClause<OMPC_Final>,
1687     VersionedClause<OMPC_FirstPrivate>,
1688     VersionedClause<OMPC_GrainSize>,
1689     VersionedClause<OMPC_If>,
1690     VersionedClause<OMPC_LastPrivate>,
1691     VersionedClause<OMPC_Mergeable>,
1692     VersionedClause<OMPC_NoGroup>,
1693     VersionedClause<OMPC_NumTasks>,
1694     VersionedClause<OMPC_NumThreads>,
1695     VersionedClause<OMPC_OMPX_Attribute>,
1696     VersionedClause<OMPC_Priority>,
1697     VersionedClause<OMPC_Private>,
1698     VersionedClause<OMPC_ProcBind>,
1699     VersionedClause<OMPC_Reduction>,
1700     VersionedClause<OMPC_Shared>,
1701     VersionedClause<OMPC_Untied>,
1702   ];
1703   let leafConstructs = [OMP_Parallel, OMP_masked, OMP_TaskLoop];
1704   let category = CA_Executable;
1705 }
1706 def OMP_ParallelMaskedTaskloopSimd :
1707     Directive<"parallel masked taskloop simd"> {
1708   let allowedClauses = [
1709     VersionedClause<OMPC_Aligned>,
1710     VersionedClause<OMPC_Allocate>,
1711     VersionedClause<OMPC_Collapse>,
1712     VersionedClause<OMPC_Copyin>,
1713     VersionedClause<OMPC_Default>,
1714     VersionedClause<OMPC_Filter>,
1715     VersionedClause<OMPC_Final>,
1716     VersionedClause<OMPC_FirstPrivate>,
1717     VersionedClause<OMPC_GrainSize>,
1718     VersionedClause<OMPC_If>,
1719     VersionedClause<OMPC_LastPrivate>,
1720     VersionedClause<OMPC_Linear>,
1721     VersionedClause<OMPC_Mergeable>,
1722     VersionedClause<OMPC_NoGroup>,
1723     VersionedClause<OMPC_NonTemporal, 50>,
1724     VersionedClause<OMPC_NumTasks>,
1725     VersionedClause<OMPC_NumThreads>,
1726     VersionedClause<OMPC_OMPX_Attribute>,
1727     VersionedClause<OMPC_Order, 50>,
1728     VersionedClause<OMPC_Priority>,
1729     VersionedClause<OMPC_Private>,
1730     VersionedClause<OMPC_ProcBind>,
1731     VersionedClause<OMPC_Reduction>,
1732     VersionedClause<OMPC_SafeLen>,
1733     VersionedClause<OMPC_Shared>,
1734     VersionedClause<OMPC_SimdLen>,
1735     VersionedClause<OMPC_Untied>,
1736   ];
1737   let leafConstructs = [OMP_Parallel, OMP_masked, OMP_TaskLoop, OMP_Simd];
1738   let category = CA_Executable;
1739 }
1740 def OMP_ParallelMaster : Directive<"parallel master"> {
1741   let allowedClauses = [
1742     VersionedClause<OMPC_Allocate>,
1743     VersionedClause<OMPC_Copyin>,
1744     VersionedClause<OMPC_Default>,
1745     VersionedClause<OMPC_FirstPrivate>,
1746     VersionedClause<OMPC_If>,
1747     VersionedClause<OMPC_NumThreads>,
1748     VersionedClause<OMPC_OMPX_Attribute>,
1749     VersionedClause<OMPC_Private>,
1750     VersionedClause<OMPC_ProcBind>,
1751     VersionedClause<OMPC_Reduction>,
1752     VersionedClause<OMPC_Shared>,
1753   ];
1754   let leafConstructs = [OMP_Parallel, OMP_Master];
1755   let category = CA_Executable;
1756 }
1757 def OMP_ParallelMasterTaskloop :
1758     Directive<"parallel master taskloop"> {
1759   let allowedClauses = [
1760     VersionedClause<OMPC_Allocate>,
1761     VersionedClause<OMPC_Collapse>,
1762     VersionedClause<OMPC_Copyin>,
1763     VersionedClause<OMPC_Default>,
1764     VersionedClause<OMPC_Final>,
1765     VersionedClause<OMPC_FirstPrivate>,
1766     VersionedClause<OMPC_GrainSize>,
1767     VersionedClause<OMPC_If>,
1768     VersionedClause<OMPC_LastPrivate>,
1769     VersionedClause<OMPC_Mergeable>,
1770     VersionedClause<OMPC_NoGroup>,
1771     VersionedClause<OMPC_NumTasks>,
1772     VersionedClause<OMPC_NumThreads>,
1773     VersionedClause<OMPC_OMPX_Attribute>,
1774     VersionedClause<OMPC_Priority>,
1775     VersionedClause<OMPC_Private>,
1776     VersionedClause<OMPC_ProcBind>,
1777     VersionedClause<OMPC_Reduction>,
1778     VersionedClause<OMPC_Shared>,
1779     VersionedClause<OMPC_Untied>,
1780   ];
1781   let leafConstructs = [OMP_Parallel, OMP_Master, OMP_TaskLoop];
1782   let category = CA_Executable;
1783 }
1784 def OMP_ParallelMasterTaskloopSimd :
1785     Directive<"parallel master taskloop simd"> {
1786   let allowedClauses = [
1787     VersionedClause<OMPC_Aligned>,
1788     VersionedClause<OMPC_Allocate>,
1789     VersionedClause<OMPC_Collapse>,
1790     VersionedClause<OMPC_Copyin>,
1791     VersionedClause<OMPC_Default>,
1792     VersionedClause<OMPC_Final>,
1793     VersionedClause<OMPC_FirstPrivate>,
1794     VersionedClause<OMPC_GrainSize>,
1795     VersionedClause<OMPC_If>,
1796     VersionedClause<OMPC_LastPrivate>,
1797     VersionedClause<OMPC_Linear>,
1798     VersionedClause<OMPC_Mergeable>,
1799     VersionedClause<OMPC_NoGroup>,
1800     VersionedClause<OMPC_NonTemporal, 50>,
1801     VersionedClause<OMPC_NumTasks>,
1802     VersionedClause<OMPC_NumThreads>,
1803     VersionedClause<OMPC_OMPX_Attribute>,
1804     VersionedClause<OMPC_Order, 50>,
1805     VersionedClause<OMPC_Priority>,
1806     VersionedClause<OMPC_Private>,
1807     VersionedClause<OMPC_ProcBind>,
1808     VersionedClause<OMPC_Reduction>,
1809     VersionedClause<OMPC_SafeLen>,
1810     VersionedClause<OMPC_Shared>,
1811     VersionedClause<OMPC_SimdLen>,
1812     VersionedClause<OMPC_Untied>,
1813   ];
1814   let leafConstructs = [OMP_Parallel, OMP_Master, OMP_TaskLoop, OMP_Simd];
1815   let category = CA_Executable;
1816 }
1817 def OMP_ParallelSections : Directive<"parallel sections"> {
1818   let allowedClauses = [
1819     VersionedClause<OMPC_Allocate>,
1820     VersionedClause<OMPC_Copyin>,
1821     VersionedClause<OMPC_Default>,
1822     VersionedClause<OMPC_FirstPrivate>,
1823     VersionedClause<OMPC_LastPrivate>,
1824     VersionedClause<OMPC_OMPX_Attribute>,
1825     VersionedClause<OMPC_Private>,
1826     VersionedClause<OMPC_ProcBind>,
1827     VersionedClause<OMPC_Reduction>,
1828     VersionedClause<OMPC_Shared>,
1829   ];
1830   let allowedOnceClauses = [
1831     VersionedClause<OMPC_If>,
1832     VersionedClause<OMPC_NumThreads>,
1833   ];
1834   let leafConstructs = [OMP_Parallel, OMP_Sections];
1835   let category = CA_Executable;
1836 }
1837 def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
1838   let allowedClauses = [
1839     VersionedClause<OMPC_Allocate>,
1840     VersionedClause<OMPC_Copyin>,
1841     VersionedClause<OMPC_Default>,
1842     VersionedClause<OMPC_FirstPrivate>,
1843     VersionedClause<OMPC_Private>,
1844     VersionedClause<OMPC_Reduction>,
1845     VersionedClause<OMPC_Shared>,
1846   ];
1847   let allowedOnceClauses = [
1848     VersionedClause<OMPC_If>,
1849     VersionedClause<OMPC_NumThreads>,
1850     VersionedClause<OMPC_ProcBind>,
1851   ];
1852   let leafConstructs = [OMP_Parallel, OMP_Workshare];
1853   let category = CA_Executable;
1854 }
1855 def OMP_TargetParallel : Directive<"target parallel"> {
1856   let allowedClauses = [
1857     VersionedClause<OMPC_Allocate>,
1858     VersionedClause<OMPC_Default>,
1859     VersionedClause<OMPC_Depend>,
1860     VersionedClause<OMPC_FirstPrivate>,
1861     VersionedClause<OMPC_HasDeviceAddr, 51>,
1862     VersionedClause<OMPC_If>,
1863     VersionedClause<OMPC_IsDevicePtr>,
1864     VersionedClause<OMPC_Map>,
1865     VersionedClause<OMPC_NoWait>,
1866     VersionedClause<OMPC_OMPX_Attribute>,
1867     VersionedClause<OMPC_Private>,
1868     VersionedClause<OMPC_Reduction>,
1869     VersionedClause<OMPC_Shared>,
1870     VersionedClause<OMPC_UsesAllocators, 50>,
1871   ];
1872   let allowedOnceClauses = [
1873     VersionedClause<OMPC_DefaultMap>,
1874     VersionedClause<OMPC_Device>,
1875     VersionedClause<OMPC_NumThreads>,
1876     VersionedClause<OMPC_OMPX_DynCGroupMem>,
1877     VersionedClause<OMPC_ProcBind>,
1878     VersionedClause<OMPC_ThreadLimit, 51>,
1879   ];
1880   let leafConstructs = [OMP_Target, OMP_Parallel];
1881   let category = CA_Executable;
1882 }
1883 def OMP_TargetParallelDo : Directive<"target parallel do"> {
1884   let allowedClauses = [
1885     VersionedClause<OMPC_Allocator>,
1886     VersionedClause<OMPC_Default>,
1887     VersionedClause<OMPC_Depend>,
1888     VersionedClause<OMPC_FirstPrivate>,
1889     VersionedClause<OMPC_HasDeviceAddr, 51>,
1890     VersionedClause<OMPC_If>,
1891     VersionedClause<OMPC_IsDevicePtr>,
1892     VersionedClause<OMPC_LastPrivate>,
1893     VersionedClause<OMPC_Linear>,
1894     VersionedClause<OMPC_Map>,
1895     VersionedClause<OMPC_Private>,
1896     VersionedClause<OMPC_Reduction>,
1897     VersionedClause<OMPC_Shared>,
1898     VersionedClause<OMPC_UsesAllocators>,
1899   ];
1900   let allowedOnceClauses = [
1901     VersionedClause<OMPC_Collapse>,
1902     VersionedClause<OMPC_DefaultMap>,
1903     VersionedClause<OMPC_Device>,
1904     VersionedClause<OMPC_NoWait>,
1905     VersionedClause<OMPC_NumThreads>,
1906     VersionedClause<OMPC_Order, 50>,
1907     VersionedClause<OMPC_Ordered>,
1908     VersionedClause<OMPC_ProcBind>,
1909     VersionedClause<OMPC_Schedule>,
1910   ];
1911   let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do];
1912   let category = CA_Executable;
1913 }
1914 def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1915   let allowedClauses = [
1916     VersionedClause<OMPC_Aligned>,
1917     VersionedClause<OMPC_Allocate>,
1918     VersionedClause<OMPC_Collapse>,
1919     VersionedClause<OMPC_Default>,
1920     VersionedClause<OMPC_DefaultMap>,
1921     VersionedClause<OMPC_Depend>,
1922     VersionedClause<OMPC_Device>,
1923     VersionedClause<OMPC_FirstPrivate>,
1924     VersionedClause<OMPC_HasDeviceAddr, 51>,
1925     VersionedClause<OMPC_If>,
1926     VersionedClause<OMPC_IsDevicePtr>,
1927     VersionedClause<OMPC_LastPrivate>,
1928     VersionedClause<OMPC_Linear>,
1929     VersionedClause<OMPC_Map>,
1930     VersionedClause<OMPC_NonTemporal>,
1931     VersionedClause<OMPC_NoWait>,
1932     VersionedClause<OMPC_NumThreads>,
1933     VersionedClause<OMPC_Order, 50>,
1934     VersionedClause<OMPC_Ordered>,
1935     VersionedClause<OMPC_Private>,
1936     VersionedClause<OMPC_ProcBind>,
1937     VersionedClause<OMPC_Reduction>,
1938     VersionedClause<OMPC_SafeLen>,
1939     VersionedClause<OMPC_Schedule>,
1940     VersionedClause<OMPC_Shared>,
1941     VersionedClause<OMPC_SimdLen>,
1942     VersionedClause<OMPC_UsesAllocators>,
1943   ];
1944   let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do, OMP_Simd];
1945   let category = CA_Executable;
1946 }
1947 def OMP_TargetParallelFor : Directive<"target parallel for"> {
1948   let allowedClauses = [
1949     VersionedClause<OMPC_Allocate>,
1950     VersionedClause<OMPC_Collapse>,
1951     VersionedClause<OMPC_Default>,
1952     VersionedClause<OMPC_DefaultMap>,
1953     VersionedClause<OMPC_Depend>,
1954     VersionedClause<OMPC_Device>,
1955     VersionedClause<OMPC_FirstPrivate>,
1956     VersionedClause<OMPC_HasDeviceAddr, 51>,
1957     VersionedClause<OMPC_If>,
1958     VersionedClause<OMPC_IsDevicePtr>,
1959     VersionedClause<OMPC_LastPrivate>,
1960     VersionedClause<OMPC_Linear>,
1961     VersionedClause<OMPC_Map>,
1962     VersionedClause<OMPC_NoWait>,
1963     VersionedClause<OMPC_NumThreads>,
1964     VersionedClause<OMPC_OMPX_Attribute>,
1965     VersionedClause<OMPC_Order, 50>,
1966     VersionedClause<OMPC_Ordered>,
1967     VersionedClause<OMPC_Private>,
1968     VersionedClause<OMPC_ProcBind>,
1969     VersionedClause<OMPC_Reduction>,
1970     VersionedClause<OMPC_Schedule>,
1971     VersionedClause<OMPC_Shared>,
1972     VersionedClause<OMPC_UsesAllocators, 50>,
1973   ];
1974   let allowedOnceClauses = [
1975     VersionedClause<OMPC_OMPX_DynCGroupMem>,
1976     VersionedClause<OMPC_ThreadLimit, 51>,
1977   ];
1978   let leafConstructs = [OMP_Target, OMP_Parallel, OMP_For];
1979   let category = CA_Executable;
1980 }
1981 def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1982   let allowedClauses = [
1983     VersionedClause<OMPC_Aligned>,
1984     VersionedClause<OMPC_Allocate>,
1985     VersionedClause<OMPC_Collapse>,
1986     VersionedClause<OMPC_Default>,
1987     VersionedClause<OMPC_DefaultMap>,
1988     VersionedClause<OMPC_Depend>,
1989     VersionedClause<OMPC_Device>,
1990     VersionedClause<OMPC_FirstPrivate>,
1991     VersionedClause<OMPC_HasDeviceAddr, 51>,
1992     VersionedClause<OMPC_If>,
1993     VersionedClause<OMPC_IsDevicePtr>,
1994     VersionedClause<OMPC_LastPrivate>,
1995     VersionedClause<OMPC_Linear>,
1996     VersionedClause<OMPC_Map>,
1997     VersionedClause<OMPC_NonTemporal, 50>,
1998     VersionedClause<OMPC_NoWait>,
1999     VersionedClause<OMPC_NumThreads>,
2000     VersionedClause<OMPC_OMPX_Attribute>,
2001     VersionedClause<OMPC_Order, 50>,
2002     VersionedClause<OMPC_Ordered>,
2003     VersionedClause<OMPC_Private>,
2004     VersionedClause<OMPC_ProcBind>,
2005     VersionedClause<OMPC_Reduction>,
2006     VersionedClause<OMPC_SafeLen>,
2007     VersionedClause<OMPC_Schedule>,
2008     VersionedClause<OMPC_Shared>,
2009     VersionedClause<OMPC_SimdLen>,
2010     VersionedClause<OMPC_UsesAllocators, 50>,
2011   ];
2012   let allowedOnceClauses = [
2013     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2014     VersionedClause<OMPC_ThreadLimit, 51>,
2015   ];
2016   let leafConstructs = [OMP_Target, OMP_Parallel, OMP_For, OMP_Simd];
2017   let category = CA_Executable;
2018 }
2019 def OMP_target_parallel_loop : Directive<"target parallel loop"> {
2020   let allowedClauses = [
2021     VersionedClause<OMPC_Allocate>,
2022     VersionedClause<OMPC_Depend>,
2023     VersionedClause<OMPC_Device>,
2024     VersionedClause<OMPC_FirstPrivate>,
2025     VersionedClause<OMPC_HasDeviceAddr, 51>,
2026     VersionedClause<OMPC_If>,
2027     VersionedClause<OMPC_IsDevicePtr>,
2028     VersionedClause<OMPC_LastPrivate>,
2029     VersionedClause<OMPC_Map>,
2030     VersionedClause<OMPC_OMPX_Attribute>,
2031     VersionedClause<OMPC_Private>,
2032     VersionedClause<OMPC_Reduction>,
2033     VersionedClause<OMPC_Shared>,
2034     VersionedClause<OMPC_UsesAllocators, 50>,
2035   ];
2036   let allowedOnceClauses = [
2037     VersionedClause<OMPC_Bind, 50>,
2038     VersionedClause<OMPC_Collapse>,
2039     VersionedClause<OMPC_Default>,
2040     VersionedClause<OMPC_DefaultMap>,
2041     VersionedClause<OMPC_NoWait>,
2042     VersionedClause<OMPC_NumThreads>,
2043     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2044     VersionedClause<OMPC_Order>,
2045     VersionedClause<OMPC_ProcBind>,
2046     VersionedClause<OMPC_ThreadLimit, 51>,
2047   ];
2048   let leafConstructs = [OMP_Target, OMP_Parallel, OMP_loop];
2049   let category = CA_Executable;
2050 }
2051 def OMP_TargetSimd : Directive<"target simd"> {
2052   let allowedClauses = [
2053     VersionedClause<OMPC_Aligned>,
2054     VersionedClause<OMPC_Allocate>,
2055     VersionedClause<OMPC_Depend>,
2056     VersionedClause<OMPC_FirstPrivate>,
2057     VersionedClause<OMPC_HasDeviceAddr, 51>,
2058     VersionedClause<OMPC_If>,
2059     VersionedClause<OMPC_IsDevicePtr>,
2060     VersionedClause<OMPC_LastPrivate>,
2061     VersionedClause<OMPC_Linear>,
2062     VersionedClause<OMPC_Map>,
2063     VersionedClause<OMPC_NonTemporal, 50>,
2064     VersionedClause<OMPC_NoWait>,
2065     VersionedClause<OMPC_OMPX_Attribute>,
2066     VersionedClause<OMPC_Private>,
2067     VersionedClause<OMPC_Reduction>,
2068     VersionedClause<OMPC_Shared>,
2069     VersionedClause<OMPC_UsesAllocators, 50>,
2070   ];
2071   let allowedOnceClauses = [
2072     VersionedClause<OMPC_Collapse>,
2073     VersionedClause<OMPC_DefaultMap>,
2074     VersionedClause<OMPC_Device>,
2075     VersionedClause<OMPC_NumThreads>,
2076     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2077     VersionedClause<OMPC_Order, 50>,
2078     VersionedClause<OMPC_ProcBind>,
2079     VersionedClause<OMPC_SafeLen>,
2080     VersionedClause<OMPC_Schedule>,
2081     VersionedClause<OMPC_SimdLen>,
2082     VersionedClause<OMPC_ThreadLimit, 51>,
2083   ];
2084   let leafConstructs = [OMP_Target, OMP_Simd];
2085   let category = CA_Executable;
2086 }
2087 def OMP_TargetTeams : Directive<"target teams"> {
2088   let allowedClauses = [
2089     VersionedClause<OMPC_Allocate>,
2090     VersionedClause<OMPC_Depend>,
2091     VersionedClause<OMPC_FirstPrivate>,
2092     VersionedClause<OMPC_HasDeviceAddr, 51>,
2093     VersionedClause<OMPC_If>,
2094     VersionedClause<OMPC_IsDevicePtr>,
2095     VersionedClause<OMPC_Map>,
2096     VersionedClause<OMPC_OMPX_Attribute>,
2097     VersionedClause<OMPC_Private>,
2098     VersionedClause<OMPC_Reduction>,
2099     VersionedClause<OMPC_Shared>,
2100     VersionedClause<OMPC_UsesAllocators, 50>,
2101   ];
2102   let allowedOnceClauses = [
2103     VersionedClause<OMPC_Default>,
2104     VersionedClause<OMPC_DefaultMap>,
2105     VersionedClause<OMPC_Device>,
2106     VersionedClause<OMPC_NoWait>,
2107     VersionedClause<OMPC_NumTeams>,
2108     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2109     VersionedClause<OMPC_OMPX_Bare>,
2110     VersionedClause<OMPC_ThreadLimit>,
2111   ];
2112   let leafConstructs = [OMP_Target, OMP_Teams];
2113   let category = CA_Executable;
2114 }
2115 def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
2116   let allowedClauses = [
2117     VersionedClause<OMPC_Allocate>,
2118     VersionedClause<OMPC_Depend>,
2119     VersionedClause<OMPC_FirstPrivate>,
2120     VersionedClause<OMPC_HasDeviceAddr, 51>,
2121     VersionedClause<OMPC_If>,
2122     VersionedClause<OMPC_IsDevicePtr>,
2123     VersionedClause<OMPC_LastPrivate>,
2124     VersionedClause<OMPC_Map>,
2125     VersionedClause<OMPC_OMPX_Attribute>,
2126     VersionedClause<OMPC_Private>,
2127     VersionedClause<OMPC_Reduction>,
2128     VersionedClause<OMPC_Shared>,
2129     VersionedClause<OMPC_UsesAllocators, 50>,
2130   ];
2131   let allowedOnceClauses = [
2132     VersionedClause<OMPC_Collapse>,
2133     VersionedClause<OMPC_Default>,
2134     VersionedClause<OMPC_DefaultMap>,
2135     VersionedClause<OMPC_Device>,
2136     VersionedClause<OMPC_DistSchedule>,
2137     VersionedClause<OMPC_NoWait>,
2138     VersionedClause<OMPC_NumTeams>,
2139     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2140     VersionedClause<OMPC_Order, 50>,
2141     VersionedClause<OMPC_ThreadLimit>,
2142   ];
2143   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute];
2144   let category = CA_Executable;
2145 }
2146 def OMP_TargetTeamsDistributeParallelDo :
2147     Directive<"target teams distribute parallel do"> {
2148   let allowedClauses = [
2149     VersionedClause<OMPC_Allocate>,
2150     VersionedClause<OMPC_Depend>,
2151     VersionedClause<OMPC_FirstPrivate>,
2152     VersionedClause<OMPC_HasDeviceAddr, 51>,
2153     VersionedClause<OMPC_If>,
2154     VersionedClause<OMPC_IsDevicePtr>,
2155     VersionedClause<OMPC_LastPrivate>,
2156     VersionedClause<OMPC_Linear>,
2157     VersionedClause<OMPC_Map>,
2158     VersionedClause<OMPC_Private>,
2159     VersionedClause<OMPC_Reduction>,
2160     VersionedClause<OMPC_Shared>,
2161     VersionedClause<OMPC_UsesAllocators>,
2162   ];
2163   let allowedOnceClauses = [
2164     VersionedClause<OMPC_Collapse>,
2165     VersionedClause<OMPC_Default>,
2166     VersionedClause<OMPC_DefaultMap>,
2167     VersionedClause<OMPC_Device>,
2168     VersionedClause<OMPC_DistSchedule>,
2169     VersionedClause<OMPC_NoWait>,
2170     VersionedClause<OMPC_NumTeams>,
2171     VersionedClause<OMPC_NumThreads>,
2172     VersionedClause<OMPC_Order, 50>,
2173     VersionedClause<OMPC_ProcBind>,
2174     VersionedClause<OMPC_Schedule>,
2175     VersionedClause<OMPC_ThreadLimit>,
2176   ];
2177   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do];
2178   let category = CA_Executable;
2179 }
2180 def OMP_TargetTeamsDistributeParallelDoSimd :
2181     Directive<"target teams distribute parallel do simd"> {
2182   let allowedClauses = [
2183     VersionedClause<OMPC_Aligned>,
2184     VersionedClause<OMPC_Allocate>,
2185     VersionedClause<OMPC_Depend>,
2186     VersionedClause<OMPC_FirstPrivate>,
2187     VersionedClause<OMPC_HasDeviceAddr, 51>,
2188     VersionedClause<OMPC_If>,
2189     VersionedClause<OMPC_IsDevicePtr>,
2190     VersionedClause<OMPC_LastPrivate>,
2191     VersionedClause<OMPC_Linear>,
2192     VersionedClause<OMPC_Map>,
2193     VersionedClause<OMPC_NonTemporal>,
2194     VersionedClause<OMPC_Private>,
2195     VersionedClause<OMPC_Reduction>,
2196     VersionedClause<OMPC_Shared>,
2197     VersionedClause<OMPC_UsesAllocators>,
2198   ];
2199   let allowedOnceClauses = [
2200     VersionedClause<OMPC_Collapse>,
2201     VersionedClause<OMPC_Default>,
2202     VersionedClause<OMPC_DefaultMap>,
2203     VersionedClause<OMPC_Device>,
2204     VersionedClause<OMPC_DistSchedule>,
2205     VersionedClause<OMPC_NoWait>,
2206     VersionedClause<OMPC_NumTeams>,
2207     VersionedClause<OMPC_NumThreads>,
2208     VersionedClause<OMPC_Order, 50>,
2209     VersionedClause<OMPC_ProcBind>,
2210     VersionedClause<OMPC_SafeLen>,
2211     VersionedClause<OMPC_Schedule>,
2212     VersionedClause<OMPC_SimdLen>,
2213     VersionedClause<OMPC_ThreadLimit>,
2214   ];
2215   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
2216   let category = CA_Executable;
2217 }
2218 def OMP_TargetTeamsDistributeParallelFor :
2219     Directive<"target teams distribute parallel for"> {
2220   let allowedClauses = [
2221     VersionedClause<OMPC_Allocate>,
2222     VersionedClause<OMPC_Collapse>,
2223     VersionedClause<OMPC_Default>,
2224     VersionedClause<OMPC_DefaultMap>,
2225     VersionedClause<OMPC_Depend>,
2226     VersionedClause<OMPC_Device>,
2227     VersionedClause<OMPC_DistSchedule>,
2228     VersionedClause<OMPC_FirstPrivate>,
2229     VersionedClause<OMPC_HasDeviceAddr, 51>,
2230     VersionedClause<OMPC_If>,
2231     VersionedClause<OMPC_IsDevicePtr>,
2232     VersionedClause<OMPC_LastPrivate>,
2233     VersionedClause<OMPC_Map>,
2234     VersionedClause<OMPC_NoWait>,
2235     VersionedClause<OMPC_NumTeams>,
2236     VersionedClause<OMPC_NumThreads>,
2237     VersionedClause<OMPC_OMPX_Attribute>,
2238     VersionedClause<OMPC_Order, 50>,
2239     VersionedClause<OMPC_Private>,
2240     VersionedClause<OMPC_ProcBind>,
2241     VersionedClause<OMPC_Reduction>,
2242     VersionedClause<OMPC_Schedule>,
2243     VersionedClause<OMPC_Shared>,
2244     VersionedClause<OMPC_ThreadLimit>,
2245     VersionedClause<OMPC_UsesAllocators, 50>,
2246   ];
2247   let allowedOnceClauses = [
2248     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2249   ];
2250   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
2251   let category = CA_Executable;
2252 }
2253 def OMP_TargetTeamsDistributeParallelForSimd :
2254     Directive<"target teams distribute parallel for simd"> {
2255   let allowedClauses = [
2256     VersionedClause<OMPC_Aligned>,
2257     VersionedClause<OMPC_Allocate>,
2258     VersionedClause<OMPC_Collapse>,
2259     VersionedClause<OMPC_Default>,
2260     VersionedClause<OMPC_DefaultMap>,
2261     VersionedClause<OMPC_Depend>,
2262     VersionedClause<OMPC_Device>,
2263     VersionedClause<OMPC_DistSchedule>,
2264     VersionedClause<OMPC_FirstPrivate>,
2265     VersionedClause<OMPC_HasDeviceAddr, 51>,
2266     VersionedClause<OMPC_If>,
2267     VersionedClause<OMPC_IsDevicePtr>,
2268     VersionedClause<OMPC_LastPrivate>,
2269     VersionedClause<OMPC_Linear>,
2270     VersionedClause<OMPC_Map>,
2271     VersionedClause<OMPC_NonTemporal, 50>,
2272     VersionedClause<OMPC_NoWait>,
2273     VersionedClause<OMPC_NumTeams>,
2274     VersionedClause<OMPC_NumThreads>,
2275     VersionedClause<OMPC_OMPX_Attribute>,
2276     VersionedClause<OMPC_Order, 50>,
2277     VersionedClause<OMPC_Private>,
2278     VersionedClause<OMPC_ProcBind>,
2279     VersionedClause<OMPC_Reduction>,
2280     VersionedClause<OMPC_SafeLen>,
2281     VersionedClause<OMPC_Schedule>,
2282     VersionedClause<OMPC_Shared>,
2283     VersionedClause<OMPC_SimdLen>,
2284     VersionedClause<OMPC_ThreadLimit>,
2285     VersionedClause<OMPC_UsesAllocators, 50>,
2286   ];
2287   let allowedOnceClauses = [
2288     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2289   ];
2290   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
2291   let category = CA_Executable;
2292 }
2293 def OMP_TargetTeamsDistributeSimd :
2294     Directive<"target teams distribute simd"> {
2295   let allowedClauses = [
2296     VersionedClause<OMPC_Aligned>,
2297     VersionedClause<OMPC_Allocate>,
2298     VersionedClause<OMPC_Depend>,
2299     VersionedClause<OMPC_FirstPrivate>,
2300     VersionedClause<OMPC_HasDeviceAddr, 51>,
2301     VersionedClause<OMPC_If>,
2302     VersionedClause<OMPC_IsDevicePtr>,
2303     VersionedClause<OMPC_LastPrivate>,
2304     VersionedClause<OMPC_Linear>,
2305     VersionedClause<OMPC_Map>,
2306     VersionedClause<OMPC_NonTemporal, 50>,
2307     VersionedClause<OMPC_OMPX_Attribute>,
2308     VersionedClause<OMPC_Private>,
2309     VersionedClause<OMPC_Reduction>,
2310     VersionedClause<OMPC_Shared>,
2311     VersionedClause<OMPC_UsesAllocators, 50>,
2312   ];
2313   let allowedOnceClauses = [
2314     VersionedClause<OMPC_Collapse>,
2315     VersionedClause<OMPC_DefaultMap>,
2316     VersionedClause<OMPC_Device>,
2317     VersionedClause<OMPC_DistSchedule>,
2318     VersionedClause<OMPC_NoWait>,
2319     VersionedClause<OMPC_NumTeams>,
2320     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2321     VersionedClause<OMPC_Order, 50>,
2322     VersionedClause<OMPC_SafeLen>,
2323     VersionedClause<OMPC_SimdLen>,
2324     VersionedClause<OMPC_ThreadLimit>,
2325   ];
2326   let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute, OMP_Simd];
2327   let category = CA_Executable;
2328 }
2329 def OMP_target_teams_loop : Directive<"target teams loop"> {
2330   let allowedClauses = [
2331     VersionedClause<OMPC_Allocate>,
2332     VersionedClause<OMPC_DefaultMap>,
2333     VersionedClause<OMPC_Depend>,
2334     VersionedClause<OMPC_Device>,
2335     VersionedClause<OMPC_FirstPrivate>,
2336     VersionedClause<OMPC_HasDeviceAddr, 51>,
2337     VersionedClause<OMPC_If>,
2338     VersionedClause<OMPC_IsDevicePtr>,
2339     VersionedClause<OMPC_LastPrivate>,
2340     VersionedClause<OMPC_Map>,
2341     VersionedClause<OMPC_OMPX_Attribute>,
2342     VersionedClause<OMPC_Private>,
2343     VersionedClause<OMPC_Reduction>,
2344     VersionedClause<OMPC_Shared>,
2345     VersionedClause<OMPC_UsesAllocators, 50>,
2346   ];
2347   let allowedOnceClauses = [
2348     VersionedClause<OMPC_Bind, 50>,
2349     VersionedClause<OMPC_Collapse>,
2350     VersionedClause<OMPC_Default>,
2351     VersionedClause<OMPC_NoWait>,
2352     VersionedClause<OMPC_NumTeams>,
2353     VersionedClause<OMPC_OMPX_DynCGroupMem>,
2354     VersionedClause<OMPC_Order>,
2355     VersionedClause<OMPC_ThreadLimit>,
2356   ];
2357   let leafConstructs = [OMP_Target, OMP_Teams, OMP_loop];
2358   let category = CA_Executable;
2359 }
2360 def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
2361   let allowedClauses = [
2362     VersionedClause<OMPC_Aligned>,
2363     VersionedClause<OMPC_Allocate>,
2364     VersionedClause<OMPC_Default>,
2365     VersionedClause<OMPC_FirstPrivate>,
2366     VersionedClause<OMPC_If>,
2367     VersionedClause<OMPC_InReduction>,
2368     VersionedClause<OMPC_LastPrivate>,
2369     VersionedClause<OMPC_Linear>,
2370     VersionedClause<OMPC_Mergeable>,
2371     VersionedClause<OMPC_NoGroup>,
2372     VersionedClause<OMPC_NonTemporal, 50>,
2373     VersionedClause<OMPC_Private>,
2374     VersionedClause<OMPC_Reduction>,
2375     VersionedClause<OMPC_Shared>,
2376     VersionedClause<OMPC_Untied>,
2377   ];
2378   let allowedOnceClauses = [
2379     VersionedClause<OMPC_Collapse>,
2380     VersionedClause<OMPC_Final>,
2381     VersionedClause<OMPC_Order, 50>,
2382     VersionedClause<OMPC_Priority>,
2383     VersionedClause<OMPC_SafeLen>,
2384     VersionedClause<OMPC_SimdLen>,
2385   ];
2386   let allowedExclusiveClauses = [
2387     VersionedClause<OMPC_GrainSize>,
2388     VersionedClause<OMPC_NumTasks>,
2389   ];
2390   let leafConstructs = [OMP_TaskLoop, OMP_Simd];
2391   let category = CA_Executable;
2392 }
2393 def OMP_TeamsDistribute : Directive<"teams distribute"> {
2394   let allowedClauses = [
2395     VersionedClause<OMPC_Allocate>,
2396     VersionedClause<OMPC_Collapse>,
2397     VersionedClause<OMPC_Default>,
2398     VersionedClause<OMPC_DistSchedule>,
2399     VersionedClause<OMPC_FirstPrivate>,
2400     VersionedClause<OMPC_LastPrivate>,
2401     VersionedClause<OMPC_NumTeams>,
2402     VersionedClause<OMPC_OMPX_Attribute>,
2403     VersionedClause<OMPC_Private>,
2404     VersionedClause<OMPC_Reduction>,
2405     VersionedClause<OMPC_Shared>,
2406     VersionedClause<OMPC_ThreadLimit>,
2407   ];
2408   let allowedOnceClauses = [
2409     VersionedClause<OMPC_If>,
2410     VersionedClause<OMPC_Order, 50>,
2411   ];
2412   let leafConstructs = [OMP_Teams, OMP_Distribute];
2413   let category = CA_Executable;
2414 }
2415 def OMP_TeamsDistributeParallelDo :
2416     Directive<"teams distribute parallel do"> {
2417   let allowedClauses = [
2418     VersionedClause<OMPC_Allocate>,
2419     VersionedClause<OMPC_Copyin>,
2420     VersionedClause<OMPC_FirstPrivate>,
2421     VersionedClause<OMPC_If>,
2422     VersionedClause<OMPC_LastPrivate>,
2423     VersionedClause<OMPC_Linear>,
2424     VersionedClause<OMPC_Private>,
2425     VersionedClause<OMPC_Reduction>,
2426     VersionedClause<OMPC_Shared>,
2427   ];
2428   let allowedOnceClauses = [
2429     VersionedClause<OMPC_Collapse>,
2430     VersionedClause<OMPC_Default>,
2431     VersionedClause<OMPC_DistSchedule>,
2432     VersionedClause<OMPC_NumTeams>,
2433     VersionedClause<OMPC_NumThreads>,
2434     VersionedClause<OMPC_Order, 50>,
2435     VersionedClause<OMPC_ProcBind>,
2436     VersionedClause<OMPC_Schedule>,
2437     VersionedClause<OMPC_ThreadLimit>,
2438   ];
2439   let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do];
2440   let category = CA_Executable;
2441 }
2442 def OMP_TeamsDistributeParallelDoSimd :
2443     Directive<"teams distribute parallel do simd"> {
2444   let allowedClauses = [
2445     VersionedClause<OMPC_Aligned>,
2446     VersionedClause<OMPC_Allocate>,
2447     VersionedClause<OMPC_FirstPrivate>,
2448     VersionedClause<OMPC_If>,
2449     VersionedClause<OMPC_LastPrivate>,
2450     VersionedClause<OMPC_Linear>,
2451     VersionedClause<OMPC_NonTemporal>,
2452     VersionedClause<OMPC_Private>,
2453     VersionedClause<OMPC_Reduction>,
2454     VersionedClause<OMPC_Shared>,
2455   ];
2456   let allowedOnceClauses = [
2457     VersionedClause<OMPC_Collapse>,
2458     VersionedClause<OMPC_Default>,
2459     VersionedClause<OMPC_DistSchedule>,
2460     VersionedClause<OMPC_NumTeams>,
2461     VersionedClause<OMPC_NumThreads>,
2462     VersionedClause<OMPC_Order, 50>,
2463     VersionedClause<OMPC_ProcBind>,
2464     VersionedClause<OMPC_SafeLen>,
2465     VersionedClause<OMPC_Schedule>,
2466     VersionedClause<OMPC_SimdLen>,
2467     VersionedClause<OMPC_ThreadLimit>,
2468   ];
2469   let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_Do, OMP_Simd];
2470   let category = CA_Executable;
2471 }
2472 def OMP_TeamsDistributeParallelFor :
2473     Directive<"teams distribute parallel for"> {
2474   let allowedClauses = [
2475     VersionedClause<OMPC_Allocate>,
2476     VersionedClause<OMPC_Collapse>,
2477     VersionedClause<OMPC_Copyin>,
2478     VersionedClause<OMPC_Default>,
2479     VersionedClause<OMPC_DistSchedule>,
2480     VersionedClause<OMPC_FirstPrivate>,
2481     VersionedClause<OMPC_If>,
2482     VersionedClause<OMPC_LastPrivate>,
2483     VersionedClause<OMPC_NumTeams>,
2484     VersionedClause<OMPC_NumThreads>,
2485     VersionedClause<OMPC_OMPX_Attribute>,
2486     VersionedClause<OMPC_Order, 50>,
2487     VersionedClause<OMPC_Private>,
2488     VersionedClause<OMPC_ProcBind>,
2489     VersionedClause<OMPC_Reduction>,
2490     VersionedClause<OMPC_Schedule>,
2491     VersionedClause<OMPC_Shared>,
2492     VersionedClause<OMPC_ThreadLimit>,
2493   ];
2494   let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
2495   let category = CA_Executable;
2496 }
2497 def OMP_TeamsDistributeParallelForSimd :
2498     Directive<"teams distribute parallel for simd"> {
2499   let allowedClauses = [
2500     VersionedClause<OMPC_Aligned>,
2501     VersionedClause<OMPC_Allocate>,
2502     VersionedClause<OMPC_Collapse>,
2503     VersionedClause<OMPC_Default>,
2504     VersionedClause<OMPC_DistSchedule>,
2505     VersionedClause<OMPC_FirstPrivate>,
2506     VersionedClause<OMPC_If>,
2507     VersionedClause<OMPC_LastPrivate>,
2508     VersionedClause<OMPC_Linear>,
2509     VersionedClause<OMPC_NonTemporal, 50>,
2510     VersionedClause<OMPC_NumTeams>,
2511     VersionedClause<OMPC_NumThreads>,
2512     VersionedClause<OMPC_OMPX_Attribute>,
2513     VersionedClause<OMPC_Order, 50>,
2514     VersionedClause<OMPC_Private>,
2515     VersionedClause<OMPC_ProcBind>,
2516     VersionedClause<OMPC_Reduction>,
2517     VersionedClause<OMPC_SafeLen>,
2518     VersionedClause<OMPC_Schedule>,
2519     VersionedClause<OMPC_Shared>,
2520     VersionedClause<OMPC_SimdLen>,
2521     VersionedClause<OMPC_ThreadLimit>,
2522   ];
2523   let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
2524   let category = CA_Executable;
2525 }
2526 def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
2527   let allowedClauses = [
2528     VersionedClause<OMPC_Aligned>,
2529     VersionedClause<OMPC_Allocate>,
2530     VersionedClause<OMPC_FirstPrivate>,
2531     VersionedClause<OMPC_If, 50>,
2532     VersionedClause<OMPC_LastPrivate>,
2533     VersionedClause<OMPC_Linear>,
2534     VersionedClause<OMPC_NonTemporal, 50>,
2535     VersionedClause<OMPC_OMPX_Attribute>,
2536     VersionedClause<OMPC_Private>,
2537     VersionedClause<OMPC_Reduction>,
2538     VersionedClause<OMPC_Shared>,
2539   ];
2540   let allowedOnceClauses = [
2541     VersionedClause<OMPC_Collapse>,
2542     VersionedClause<OMPC_Default>,
2543     VersionedClause<OMPC_DistSchedule>,
2544     VersionedClause<OMPC_NumTeams>,
2545     VersionedClause<OMPC_Order, 50>,
2546     VersionedClause<OMPC_SafeLen>,
2547     VersionedClause<OMPC_SimdLen>,
2548     VersionedClause<OMPC_ThreadLimit>,
2549   ];
2550   let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Simd];
2551   let category = CA_Executable;
2552 }
2553 def OMP_teams_loop : Directive<"teams loop"> {
2554   let allowedClauses = [
2555     VersionedClause<OMPC_Allocate>,
2556     VersionedClause<OMPC_FirstPrivate>,
2557     VersionedClause<OMPC_LastPrivate>,
2558     VersionedClause<OMPC_OMPX_Attribute>,
2559     VersionedClause<OMPC_Private>,
2560     VersionedClause<OMPC_Reduction>,
2561     VersionedClause<OMPC_Shared>,
2562   ];
2563   let allowedOnceClauses = [
2564     VersionedClause<OMPC_Bind, 50>,
2565     VersionedClause<OMPC_Collapse>,
2566     VersionedClause<OMPC_Default>,
2567     VersionedClause<OMPC_NumTeams>,
2568     VersionedClause<OMPC_Order>,
2569     VersionedClause<OMPC_ThreadLimit>,
2570   ];
2571   let leafConstructs = [OMP_Teams, OMP_loop];
2572   let category = CA_Executable;
2573 }