123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639 |
- //===-- 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::acc
- let directivePrefix = "ACCD_";
- let clausePrefix = "ACCC_";
- let makeEnumAvailableInNamespace = true;
- let enableBitmaskEnumInNamespace = true;
- let clauseEnumSetClass = "AccClauseSet";
- let flangClauseBaseClass = "AccClause";
- }
- //===----------------------------------------------------------------------===//
- // Definition of OpenACC clauses
- //===----------------------------------------------------------------------===//
- // 2.16.1
- def ACCC_Async : Clause<"async"> {
- let flangClass = "ScalarIntExpr";
- let isValueOptional = true;
- }
- // 2.9.7
- def ACCC_Auto : Clause<"auto"> {}
- // 2.7.12
- def ACCC_Attach : Clause<"attach"> {
- let flangClass = "AccObjectList";
- }
- // 2.15.1
- def ACCC_Bind : Clause<"bind"> {
- let flangClass = "AccBindClause";
- }
- // 2.12
- def ACCC_Capture : Clause<"capture"> {
- }
- // 2.9.1
- def ACCC_Collapse : Clause<"collapse"> {
- let flangClass = "ScalarIntConstantExpr";
- }
- // 2.7.6
- def ACCC_Copy : Clause<"copy"> {
- let flangClass = "AccObjectList";
- let aliases = ["present_or_copy", "pcopy"];
- }
- // 2.7.7
- def ACCC_Copyin : Clause<"copyin"> {
- let flangClass = "AccObjectListWithModifier";
- let aliases = ["present_or_copyin", "pcopyin"];
- }
- // 2.7.8
- def ACCC_Copyout : Clause<"copyout"> {
- let flangClass = "AccObjectListWithModifier";
- let aliases = ["present_or_copyout", "pcopyout"];
- }
- // 2.7.9
- def ACCC_Create : Clause<"create"> {
- let flangClass = "AccObjectListWithModifier";
- let aliases = ["present_or_create", "pcreate"];
- }
- // 2.5.15
- def 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.3
- def ACCC_DefaultAsync : Clause<"default_async"> {
- let flangClass = "ScalarIntExpr";
- }
- // 2.7.11
- def ACCC_Delete : Clause<"delete"> {
- let flangClass = "AccObjectList";
- }
- // 2.7.13
- def ACCC_Detach : Clause<"detach"> {
- let flangClass = "AccObjectList";
- }
- // 2.14.4
- def ACCC_Device : Clause<"device"> {
- let flangClass = "AccObjectList";
- }
- // 2.14.1 - 2.14.2
- def ACCC_DeviceNum : Clause<"device_num"> {
- let flangClass = "ScalarIntExpr";
- }
- // 2.7.4
- def ACCC_DevicePtr : Clause<"deviceptr"> {
- let flangClass = "AccObjectList";
- }
- // 2.13.1
- def ACCC_DeviceResident : Clause<"device_resident"> {
- let flangClass = "AccObjectList";
- }
- // 2.4
- def ACCC_DeviceType : Clause<"device_type"> {
- let flangClass = "AccDeviceTypeExprList";
- let defaultValue = "*";
- let aliases = ["dtype"];
- }
- // 2.6.6
- def ACCC_Finalize : Clause<"finalize"> {}
- // 2.5.13
- def ACCC_FirstPrivate : Clause<"firstprivate"> {
- let flangClass = "AccObjectList";
- }
- // 2.9.2
- def ACCC_Gang : Clause<"gang"> {
- let flangClass = "AccGangArgument";
- let isValueOptional = true;
- }
- // 2.14.4
- def ACCC_Host : Clause<"host"> {
- let flangClass = "AccObjectList";
- }
- // 2.5.5
- def ACCC_If : Clause <"if"> {
- let flangClass = "ScalarLogicalExpr";
- }
- // 2.14.4
- def ACCC_IfPresent : Clause<"if_present"> {}
- // 2.9.6
- def ACCC_Independent : Clause<"independent"> {}
- // 2.13.3
- def ACCC_Link : Clause<"link"> {
- let flangClass = "AccObjectList";
- }
- // 2.7.10
- def ACCC_NoCreate : Clause<"no_create"> {
- let flangClass = "AccObjectList";
- }
- // 2.15.1
- def ACCC_NoHost : Clause<"nohost"> {}
- // 2.5.9
- def ACCC_NumGangs : Clause<"num_gangs"> {
- let flangClass = "ScalarIntExpr";
- }
- // 2.5.10
- def ACCC_NumWorkers : Clause<"num_workers"> {
- let flangClass = "ScalarIntExpr";
- }
- // 2.7.5
- def ACCC_Present : Clause<"present"> {
- let flangClass = "AccObjectList";
- }
- // 2.5.12
- def ACCC_Private : Clause<"private"> {
- let flangClass = "AccObjectList";
- }
- // 2.9.8
- def ACCC_Tile : Clause <"tile"> {
- let flangClass = "AccTileExprList";
- }
- // 2.8.1
- def ACCC_UseDevice : Clause <"use_device"> {
- let flangClass = "AccObjectList";
- }
- // 2.12
- def ACCC_Read : Clause<"read"> {}
- // 2.5.14
- def ACCC_Reduction : Clause<"reduction"> {
- let flangClass = "AccObjectListWithReduction";
- }
- // 2.5.6
- def ACCC_Self : Clause<"self"> {
- let flangClass = "AccSelfClause";
- let isValueOptional = true;
- }
- // 2.9.5
- def ACCC_Seq : Clause<"seq"> {}
- // 2.9.4
- def ACCC_Vector : Clause<"vector"> {
- let flangClass = "ScalarIntExpr";
- let isValueOptional = true;
- let prefix = "length";
- }
- // 2.5.11
- def ACCC_VectorLength : Clause<"vector_length"> {
- let flangClass = "ScalarIntExpr";
- }
- // 2.16.2
- def ACCC_Wait : Clause<"wait"> {
- let flangClass = "AccWaitArgument";
- let isValueOptional = true;
- }
- // 2.9.3
- def ACCC_Worker: Clause<"worker"> {
- let flangClass = "ScalarIntExpr";
- let isValueOptional = true;
- let prefix = "num";
- }
- // 2.12
- def ACCC_Write : Clause<"write"> {}
- def ACCC_Unknown : Clause<"unknown"> {
- let isDefault = true;
- }
- //===----------------------------------------------------------------------===//
- // Definition of OpenACC directives
- //===----------------------------------------------------------------------===//
- // 2.12
- def ACC_Atomic : Directive<"atomic"> {}
- // 2.6.5
- def 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.13
- def 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.3
- def 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.1
- def 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.2
- def 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.9
- def 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.10
- def ACC_Cache : Directive<"cache"> {}
- // 2.14.1
- def ACC_Init : Directive<"init"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_DeviceNum>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_If>
- ];
- }
- // 2.15.1
- def 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.3
- def 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.2
- def ACC_Shutdown : Directive<"shutdown"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_DeviceNum>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_If>
- ];
- }
- // 2.14.4
- def 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.3
- def ACC_Wait : Directive<"wait"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_If>
- ];
- }
- // 2.14.6
- def 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.7
- def 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.8
- def ACC_HostData : Directive<"host_data"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_IfPresent>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_UseDevice>
- ];
- }
- // 2.11
- def 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.11
- def 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.11
- def 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;
- }
|