Blame | Last modification | View Log | Download | RSS feed
//===-- ACC.td - OpenACC directive definition file ---------*- tablegen -*-===////// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.// See https://llvm.org/LICENSE.txt for license information.// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception////===----------------------------------------------------------------------===////// This is the definition file for OpenACC 3.1 directives and clauses.////===----------------------------------------------------------------------===//include "llvm/Frontend/Directive/DirectiveBase.td"//===----------------------------------------------------------------------===//// Definition of general OpenACC information//===----------------------------------------------------------------------===//def OpenACC : DirectiveLanguage {let name = "OpenACC";let cppNamespace = "acc"; // final namespace will be llvm::acclet directivePrefix = "ACCD_";let clausePrefix = "ACCC_";let makeEnumAvailableInNamespace = true;let enableBitmaskEnumInNamespace = true;let clauseEnumSetClass = "AccClauseSet";let flangClauseBaseClass = "AccClause";}//===----------------------------------------------------------------------===//// Definition of OpenACC clauses//===----------------------------------------------------------------------===//// 2.16.1def ACCC_Async : Clause<"async"> {let flangClass = "ScalarIntExpr";let isValueOptional = true;}// 2.9.7def ACCC_Auto : Clause<"auto"> {}// 2.7.12def ACCC_Attach : Clause<"attach"> {let flangClass = "AccObjectList";}// 2.15.1def ACCC_Bind : Clause<"bind"> {let flangClass = "AccBindClause";}// 2.12def ACCC_Capture : Clause<"capture"> {}// 2.9.1def ACCC_Collapse : Clause<"collapse"> {let flangClass = "ScalarIntConstantExpr";}// 2.7.6def ACCC_Copy : Clause<"copy"> {let flangClass = "AccObjectList";let aliases = ["present_or_copy", "pcopy"];}// 2.7.7def ACCC_Copyin : Clause<"copyin"> {let flangClass = "AccObjectListWithModifier";let aliases = ["present_or_copyin", "pcopyin"];}// 2.7.8def ACCC_Copyout : Clause<"copyout"> {let flangClass = "AccObjectListWithModifier";let aliases = ["present_or_copyout", "pcopyout"];}// 2.7.9def ACCC_Create : Clause<"create"> {let flangClass = "AccObjectListWithModifier";let aliases = ["present_or_create", "pcreate"];}// 2.5.15def ACC_Default_none : ClauseVal<"none", 1, 1> { let isDefault = 1; }def ACC_Default_present : ClauseVal<"present", 0, 1> {}def ACCC_Default : Clause<"default"> {let flangClass = "AccDefaultClause";let enumClauseValue = "DefaultValue";let allowedClauseValues = [ACC_Default_present,ACC_Default_none];}// 2.14.3def ACCC_DefaultAsync : Clause<"default_async"> {let flangClass = "ScalarIntExpr";}// 2.7.11def ACCC_Delete : Clause<"delete"> {let flangClass = "AccObjectList";}// 2.7.13def ACCC_Detach : Clause<"detach"> {let flangClass = "AccObjectList";}// 2.14.4def ACCC_Device : Clause<"device"> {let flangClass = "AccObjectList";}// 2.14.1 - 2.14.2def ACCC_DeviceNum : Clause<"device_num"> {let flangClass = "ScalarIntExpr";}// 2.7.4def ACCC_DevicePtr : Clause<"deviceptr"> {let flangClass = "AccObjectList";}// 2.13.1def ACCC_DeviceResident : Clause<"device_resident"> {let flangClass = "AccObjectList";}// 2.4def ACCC_DeviceType : Clause<"device_type"> {let flangClass = "AccDeviceTypeExprList";let defaultValue = "*";let aliases = ["dtype"];}// 2.6.6def ACCC_Finalize : Clause<"finalize"> {}// 2.5.13def ACCC_FirstPrivate : Clause<"firstprivate"> {let flangClass = "AccObjectList";}// 2.9.2def ACCC_Gang : Clause<"gang"> {let flangClass = "AccGangArgument";let isValueOptional = true;}// 2.14.4def ACCC_Host : Clause<"host"> {let flangClass = "AccObjectList";}// 2.5.5def ACCC_If : Clause <"if"> {let flangClass = "ScalarLogicalExpr";}// 2.14.4def ACCC_IfPresent : Clause<"if_present"> {}// 2.9.6def ACCC_Independent : Clause<"independent"> {}// 2.13.3def ACCC_Link : Clause<"link"> {let flangClass = "AccObjectList";}// 2.7.10def ACCC_NoCreate : Clause<"no_create"> {let flangClass = "AccObjectList";}// 2.15.1def ACCC_NoHost : Clause<"nohost"> {}// 2.5.9def ACCC_NumGangs : Clause<"num_gangs"> {let flangClass = "ScalarIntExpr";}// 2.5.10def ACCC_NumWorkers : Clause<"num_workers"> {let flangClass = "ScalarIntExpr";}// 2.7.5def ACCC_Present : Clause<"present"> {let flangClass = "AccObjectList";}// 2.5.12def ACCC_Private : Clause<"private"> {let flangClass = "AccObjectList";}// 2.9.8def ACCC_Tile : Clause <"tile"> {let flangClass = "AccTileExprList";}// 2.8.1def ACCC_UseDevice : Clause <"use_device"> {let flangClass = "AccObjectList";}// 2.12def ACCC_Read : Clause<"read"> {}// 2.5.14def ACCC_Reduction : Clause<"reduction"> {let flangClass = "AccObjectListWithReduction";}// 2.5.6def ACCC_Self : Clause<"self"> {let flangClass = "AccSelfClause";let isValueOptional = true;}// 2.9.5def ACCC_Seq : Clause<"seq"> {}// 2.9.4def ACCC_Vector : Clause<"vector"> {let flangClass = "ScalarIntExpr";let isValueOptional = true;let prefix = "length";}// 2.5.11def ACCC_VectorLength : Clause<"vector_length"> {let flangClass = "ScalarIntExpr";}// 2.16.2def ACCC_Wait : Clause<"wait"> {let flangClass = "AccWaitArgument";let isValueOptional = true;}// 2.9.3def ACCC_Worker: Clause<"worker"> {let flangClass = "ScalarIntExpr";let isValueOptional = true;let prefix = "num";}// 2.12def ACCC_Write : Clause<"write"> {}def ACCC_Unknown : Clause<"unknown"> {let isDefault = true;}//===----------------------------------------------------------------------===//// Definition of OpenACC directives//===----------------------------------------------------------------------===//// 2.12def ACC_Atomic : Directive<"atomic"> {}// 2.6.5def ACC_Data : Directive<"data"> {let allowedOnceClauses = [VersionedClause<ACCC_If>,VersionedClause<ACCC_Default>];let requiredClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>];}// 2.13def ACC_Declare : Directive<"declare"> {let allowedClauses = [VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_DeviceResident>,VersionedClause<ACCC_Link>];}// 2.5.3def ACC_Kernels : Directive<"kernels"> {let allowedClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_If>,VersionedClause<ACCC_NumGangs>,VersionedClause<ACCC_NumWorkers>,VersionedClause<ACCC_Self>,VersionedClause<ACCC_VectorLength>];}// 2.5.1def ACC_Parallel : Directive<"parallel"> {let allowedClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_Private>,VersionedClause<ACCC_FirstPrivate>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_If>,VersionedClause<ACCC_NumGangs>,VersionedClause<ACCC_NumWorkers>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Self>,VersionedClause<ACCC_VectorLength>];}// 2.5.2def ACC_Serial : Directive<"serial"> {// Spec line 950-951: clause is as for the parallel construct except that the// num_gangs, num_workers, and vector_length clauses are not permitted.let allowedClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_Private>,VersionedClause<ACCC_FirstPrivate>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_If>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Self>];}// 2.9def ACC_Loop : Directive<"loop"> {let allowedClauses = [VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_Private>];let allowedOnceClauses = [VersionedClause<ACCC_Collapse>,VersionedClause<ACCC_Gang>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Tile>,VersionedClause<ACCC_Vector>,VersionedClause<ACCC_Worker>];let allowedExclusiveClauses = [VersionedClause<ACCC_Auto>,VersionedClause<ACCC_Independent>,VersionedClause<ACCC_Seq>];}// 2.10def ACC_Cache : Directive<"cache"> {}// 2.14.1def ACC_Init : Directive<"init"> {let allowedOnceClauses = [VersionedClause<ACCC_DeviceNum>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_If>];}// 2.15.1def ACC_Routine : Directive<"routine"> {let allowedOnceClauses = [VersionedClause<ACCC_Bind>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_NoHost>];let requiredClauses = [VersionedClause<ACCC_Gang>,VersionedClause<ACCC_Seq>,VersionedClause<ACCC_Vector>,VersionedClause<ACCC_Worker>];}// 2.14.3def ACC_Set : Directive<"set"> {let allowedOnceClauses = [VersionedClause<ACCC_DefaultAsync>,VersionedClause<ACCC_DeviceNum>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_If>];let requiredClauses = [// The three following clauses are also in allowedOnceClauses list due to// restriction 2255 - Two instances of the same clause may not appear on the// same directive.VersionedClause<ACCC_DefaultAsync>,VersionedClause<ACCC_DeviceNum>,VersionedClause<ACCC_DeviceType>];}// 2.14.2def ACC_Shutdown : Directive<"shutdown"> {let allowedOnceClauses = [VersionedClause<ACCC_DeviceNum>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_If>];}// 2.14.4def ACC_Update : Directive<"update"> {let allowedClauses = [VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_If>,VersionedClause<ACCC_IfPresent>];let requiredClauses = [VersionedClause<ACCC_Device>,VersionedClause<ACCC_Host>,VersionedClause<ACCC_Self>];}// 2.16.3def ACC_Wait : Directive<"wait"> {let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_If>];}// 2.14.6def ACC_EnterData : Directive<"enter data"> {let allowedClauses = [VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_If>];let requiredClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_Copyin>];}// 2.14.7def ACC_ExitData : Directive<"exit data"> {let allowedClauses = [VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_If>,VersionedClause<ACCC_Finalize>];let requiredClauses = [VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Delete>,VersionedClause<ACCC_Detach>];}// 2.8def ACC_HostData : Directive<"host_data"> {let allowedOnceClauses = [VersionedClause<ACCC_If>,VersionedClause<ACCC_IfPresent>];let requiredClauses = [VersionedClause<ACCC_UseDevice>];}// 2.11def ACC_KernelsLoop : Directive<"kernels loop"> {let allowedClauses = [VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_Private>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Collapse>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_Gang>,VersionedClause<ACCC_If>,VersionedClause<ACCC_NumGangs>,VersionedClause<ACCC_NumWorkers>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Self>,VersionedClause<ACCC_Tile>,VersionedClause<ACCC_Vector>,VersionedClause<ACCC_VectorLength>,VersionedClause<ACCC_Worker>];let allowedExclusiveClauses = [VersionedClause<ACCC_Auto>,VersionedClause<ACCC_Independent>,VersionedClause<ACCC_Seq>];}// 2.11def ACC_ParallelLoop : Directive<"parallel loop"> {let allowedClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_FirstPrivate>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_Private>,VersionedClause<ACCC_Tile>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Collapse>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_Gang>,VersionedClause<ACCC_If>,VersionedClause<ACCC_NumGangs>,VersionedClause<ACCC_NumWorkers>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Self>,VersionedClause<ACCC_Vector>,VersionedClause<ACCC_VectorLength>,VersionedClause<ACCC_Worker>];let allowedExclusiveClauses = [VersionedClause<ACCC_Auto>,VersionedClause<ACCC_Independent>,VersionedClause<ACCC_Seq>];}// 2.11def ACC_SerialLoop : Directive<"serial loop"> {let allowedClauses = [VersionedClause<ACCC_Attach>,VersionedClause<ACCC_Copy>,VersionedClause<ACCC_Copyin>,VersionedClause<ACCC_Copyout>,VersionedClause<ACCC_Create>,VersionedClause<ACCC_DevicePtr>,VersionedClause<ACCC_DeviceType>,VersionedClause<ACCC_FirstPrivate>,VersionedClause<ACCC_NoCreate>,VersionedClause<ACCC_Present>,VersionedClause<ACCC_Private>,VersionedClause<ACCC_Wait>];let allowedOnceClauses = [VersionedClause<ACCC_Async>,VersionedClause<ACCC_Collapse>,VersionedClause<ACCC_Default>,VersionedClause<ACCC_Gang>,VersionedClause<ACCC_If>,VersionedClause<ACCC_Reduction>,VersionedClause<ACCC_Self>,VersionedClause<ACCC_Tile>,VersionedClause<ACCC_Vector>,VersionedClause<ACCC_Worker>];let allowedExclusiveClauses = [VersionedClause<ACCC_Auto>,VersionedClause<ACCC_Independent>,VersionedClause<ACCC_Seq>];}def ACC_Unknown : Directive<"unknown"> {let isDefault = true;}