xref: /llvm-project/llvm/include/llvm/Frontend/OpenACC/ACC.td (revision 8ca6401fdd36c17a8d68a8fb06b7d43c2540a027)
1//===-- ACC.td - OpenACC directive definition file ---------*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is the definition file for OpenACC 3.3 directives and clauses.
10//
11//===----------------------------------------------------------------------===//
12
13include "llvm/Frontend/Directive/DirectiveBase.td"
14
15//===----------------------------------------------------------------------===//
16// Definition of general OpenACC information
17//===----------------------------------------------------------------------===//
18
19def OpenACC : DirectiveLanguage {
20  let name = "OpenACC";
21  let cppNamespace = "acc"; // final namespace will be llvm::acc
22  let directivePrefix = "ACCD_";
23  let clausePrefix = "ACCC_";
24  let makeEnumAvailableInNamespace = true;
25  let enableBitmaskEnumInNamespace = true;
26  let clauseEnumSetClass = "AccClauseSet";
27  let flangClauseBaseClass = "AccClause";
28}
29
30//===----------------------------------------------------------------------===//
31// Definition of OpenACC clauses
32//===----------------------------------------------------------------------===//
33
34// 2.16.1
35def ACCC_Async : Clause<"async"> {
36  let flangClass = "ScalarIntExpr";
37  let isValueOptional = true;
38}
39
40// 2.9.7
41def ACCC_Auto : Clause<"auto"> {}
42
43// 2.7.12
44def ACCC_Attach : Clause<"attach"> {
45  let flangClass = "AccObjectList";
46}
47
48// 2.15.1
49def ACCC_Bind : Clause<"bind"> {
50  let flangClass = "AccBindClause";
51}
52
53// 2.12
54def ACCC_Capture : Clause<"capture"> {
55}
56
57// 2.9.1
58def ACCC_Collapse : Clause<"collapse"> {
59  let flangClass = "AccCollapseArg";
60}
61
62// 2.7.6
63def ACCC_Copy : Clause<"copy"> {
64  let flangClass = "AccObjectList";
65  let aliases = ["present_or_copy", "pcopy"];
66}
67
68// 2.7.7
69def ACCC_Copyin : Clause<"copyin"> {
70  let flangClass = "AccObjectListWithModifier";
71  let aliases = ["present_or_copyin", "pcopyin"];
72}
73
74// 2.7.8
75def ACCC_Copyout : Clause<"copyout"> {
76  let flangClass = "AccObjectListWithModifier";
77  let aliases = ["present_or_copyout", "pcopyout"];
78}
79
80// 2.7.9
81def ACCC_Create : Clause<"create"> {
82  let flangClass = "AccObjectListWithModifier";
83  let aliases = ["present_or_create", "pcreate"];
84}
85
86// 2.5.16
87def ACC_Default_none : ClauseVal<"none", 1, 1> { let isDefault = 1; }
88def ACC_Default_present : ClauseVal<"present", 0, 1> {}
89
90def ACCC_Default : Clause<"default"> {
91  let flangClass = "AccDefaultClause";
92  let enumClauseValue = "DefaultValue";
93  let allowedClauseValues = [
94    ACC_Default_present,
95    ACC_Default_none
96  ];
97}
98
99// 2.14.3
100def ACCC_DefaultAsync : Clause<"default_async"> {
101  let flangClass = "ScalarIntExpr";
102}
103
104// 2.7.11
105def ACCC_Delete : Clause<"delete"> {
106  let flangClass = "AccObjectList";
107}
108
109// 2.7.13
110def ACCC_Detach : Clause<"detach"> {
111  let flangClass = "AccObjectList";
112}
113
114// 2.14.4
115def ACCC_Device : Clause<"device"> {
116  let flangClass = "AccObjectList";
117}
118
119// 2.14.1 - 2.14.2
120def ACCC_DeviceNum : Clause<"device_num">  {
121  let flangClass = "ScalarIntExpr";
122}
123
124// 2.7.4
125def ACCC_DevicePtr : Clause<"deviceptr"> {
126  let flangClass = "AccObjectList";
127}
128
129// 2.13.1
130def ACCC_DeviceResident : Clause<"device_resident"> {
131  let flangClass = "AccObjectList";
132}
133
134// 2.4
135def ACCC_DeviceType : Clause<"device_type"> {
136  let flangClass = "AccDeviceTypeExprList";
137  let defaultValue = "*";
138  let aliases = ["dtype"];
139}
140
141// 2.6.6
142def ACCC_Finalize : Clause<"finalize"> {}
143
144// 2.5.14
145def ACCC_FirstPrivate : Clause<"firstprivate"> {
146  let flangClass = "AccObjectList";
147}
148
149// 2.9.2
150def ACCC_Gang : Clause<"gang"> {
151  let flangClass = "AccGangArgList";
152  let isValueOptional = true;
153}
154
155// 2.14.4
156def ACCC_Host : Clause<"host"> {
157  let flangClass = "AccObjectList";
158}
159
160// 2.5.6
161def ACCC_If : Clause <"if"> {
162  let flangClass = "ScalarExpr";
163}
164
165// 2.14.4
166def ACCC_IfPresent : Clause<"if_present"> {}
167
168// 2.9.6
169def ACCC_Independent : Clause<"independent"> {}
170
171// 2.13.3
172def ACCC_Link : Clause<"link"> {
173  let flangClass = "AccObjectList";
174}
175
176// 2.7.10
177def ACCC_NoCreate : Clause<"no_create"> {
178  let flangClass = "AccObjectList";
179}
180
181// 2.15.1
182def ACCC_NoHost : Clause<"nohost"> {}
183
184// 2.5.10
185def ACCC_NumGangs : Clause<"num_gangs"> {
186  let flangClass = "ScalarIntExpr";
187  let isValueList = 1;
188}
189
190// 2.5.11
191def ACCC_NumWorkers : Clause<"num_workers"> {
192  let flangClass = "ScalarIntExpr";
193}
194
195// 2.7.5
196def ACCC_Present : Clause<"present"> {
197  let flangClass = "AccObjectList";
198}
199
200// 2.5.13
201def ACCC_Private : Clause<"private"> {
202  let flangClass = "AccObjectList";
203}
204
205// 2.9.8
206def ACCC_Tile : Clause <"tile"> {
207  let flangClass = "AccTileExprList";
208}
209
210// 2.8.1
211def ACCC_UseDevice : Clause <"use_device"> {
212  let flangClass = "AccObjectList";
213}
214
215// 2.12
216def ACCC_Read : Clause<"read"> {}
217
218// 2.5.15
219def ACCC_Reduction : Clause<"reduction"> {
220  let flangClass = "AccObjectListWithReduction";
221}
222
223// 2.5.7
224def ACCC_Self : Clause<"self"> {
225  let flangClass = "AccSelfClause";
226  let isValueOptional = true;
227}
228
229// 2.9.5
230def ACCC_Seq : Clause<"seq"> {}
231
232// Non-standard extension
233def ACCC_ShortLoop : Clause<"shortloop"> {}
234
235// 2.9.4
236def ACCC_Vector : Clause<"vector"> {
237  let flangClass = "ScalarIntExpr";
238  let isValueOptional = true;
239  let prefix = "length";
240}
241
242// 2.5.12
243def ACCC_VectorLength : Clause<"vector_length"> {
244  let flangClass = "ScalarIntExpr";
245}
246
247// 2.16.2
248def ACCC_Wait : Clause<"wait"> {
249  let flangClass = "AccWaitArgument";
250  let isValueOptional = true;
251}
252
253// 2.9.3
254def ACCC_Worker: Clause<"worker"> {
255  let flangClass = "ScalarIntExpr";
256  let isValueOptional = true;
257  let prefix = "num";
258}
259
260// 2.12
261def ACCC_Write : Clause<"write"> {}
262
263def ACCC_Unknown : Clause<"unknown"> {
264  let isDefault = true;
265}
266
267//===----------------------------------------------------------------------===//
268// Definition of OpenACC directives
269//===----------------------------------------------------------------------===//
270
271// 2.12
272def ACC_Atomic : Directive<"atomic"> {
273  let association = AS_Block;
274  let category = CA_Executable;
275}
276
277// 2.6.5
278def ACC_Data : Directive<"data"> {
279  let allowedOnceClauses = [
280    VersionedClause<ACCC_Async, 32>,
281    VersionedClause<ACCC_If>,
282    VersionedClause<ACCC_Default>
283  ];
284  let allowedClauses = [
285    VersionedClause<ACCC_DeviceType, 32>,
286    VersionedClause<ACCC_Wait, 32>
287  ];
288  let requiredClauses = [
289    VersionedClause<ACCC_Attach>,
290    VersionedClause<ACCC_Copy>,
291    VersionedClause<ACCC_Copyin>,
292    VersionedClause<ACCC_Copyout>,
293    VersionedClause<ACCC_Create>,
294    VersionedClause<ACCC_Default>,
295    VersionedClause<ACCC_DevicePtr>,
296    VersionedClause<ACCC_NoCreate>,
297    VersionedClause<ACCC_Present>
298  ];
299  let association = AS_Block;
300  let category = CA_Executable;
301}
302
303// 2.13
304def ACC_Declare : Directive<"declare"> {
305  let allowedClauses = [
306    VersionedClause<ACCC_Copy>,
307    VersionedClause<ACCC_Copyin>,
308    VersionedClause<ACCC_Copyout>,
309    VersionedClause<ACCC_Create>,
310    VersionedClause<ACCC_Present>,
311    VersionedClause<ACCC_DevicePtr>,
312    VersionedClause<ACCC_DeviceResident>,
313    VersionedClause<ACCC_Link>
314  ];
315  let association = AS_None;
316  let category = CA_Declarative;
317}
318
319// 2.5.3
320def ACC_Kernels : Directive<"kernels"> {
321  let allowedClauses = [
322    VersionedClause<ACCC_Attach>,
323    VersionedClause<ACCC_Copy>,
324    VersionedClause<ACCC_Copyin>,
325    VersionedClause<ACCC_Copyout>,
326    VersionedClause<ACCC_Create>,
327    VersionedClause<ACCC_DeviceType>,
328    VersionedClause<ACCC_NoCreate>,
329    VersionedClause<ACCC_Present>,
330    VersionedClause<ACCC_DevicePtr>,
331    VersionedClause<ACCC_Wait>
332  ];
333  let allowedOnceClauses = [
334    VersionedClause<ACCC_Async>,
335    VersionedClause<ACCC_Default>,
336    VersionedClause<ACCC_If>,
337    VersionedClause<ACCC_NumGangs>,
338    VersionedClause<ACCC_NumWorkers>,
339    VersionedClause<ACCC_Self>,
340    VersionedClause<ACCC_VectorLength>
341  ];
342  let association = AS_Block;
343  let category = CA_Executable;
344}
345
346// 2.5.1
347def ACC_Parallel : Directive<"parallel"> {
348  let allowedClauses = [
349    VersionedClause<ACCC_Attach>,
350    VersionedClause<ACCC_Async>,
351    VersionedClause<ACCC_Copy>,
352    VersionedClause<ACCC_Copyin>,
353    VersionedClause<ACCC_Copyout>,
354    VersionedClause<ACCC_Create>,
355    VersionedClause<ACCC_DevicePtr>,
356    VersionedClause<ACCC_DeviceType>,
357    VersionedClause<ACCC_NoCreate>,
358    VersionedClause<ACCC_NumGangs>,
359    VersionedClause<ACCC_NumWorkers>,
360    VersionedClause<ACCC_Present>,
361    VersionedClause<ACCC_Private>,
362    VersionedClause<ACCC_FirstPrivate>,
363    VersionedClause<ACCC_Reduction>,
364    VersionedClause<ACCC_Wait>,
365    VersionedClause<ACCC_VectorLength>
366  ];
367  let allowedOnceClauses = [
368    VersionedClause<ACCC_Default>,
369    VersionedClause<ACCC_If>,
370    VersionedClause<ACCC_Self>
371  ];
372  let association = AS_Block;
373  let category = CA_Executable;
374}
375
376// 2.5.2
377def ACC_Serial : Directive<"serial"> {
378  // Spec line 950-951: clause is as for the parallel construct except that the
379  // num_gangs, num_workers, and vector_length clauses are not permitted.
380  let allowedClauses = [
381    VersionedClause<ACCC_Attach>,
382    VersionedClause<ACCC_Copy>,
383    VersionedClause<ACCC_Copyin>,
384    VersionedClause<ACCC_Copyout>,
385    VersionedClause<ACCC_Create>,
386    VersionedClause<ACCC_DevicePtr>,
387    VersionedClause<ACCC_DeviceType>,
388    VersionedClause<ACCC_NoCreate>,
389    VersionedClause<ACCC_Present>,
390    VersionedClause<ACCC_Private>,
391    VersionedClause<ACCC_FirstPrivate>,
392    VersionedClause<ACCC_Reduction>,
393    VersionedClause<ACCC_Wait>
394  ];
395  let allowedOnceClauses = [
396    VersionedClause<ACCC_Async>,
397    VersionedClause<ACCC_Default>,
398    VersionedClause<ACCC_If>,
399    VersionedClause<ACCC_Self>
400  ];
401  let association = AS_Block;
402  let category = CA_Executable;
403}
404
405// 2.9
406def ACC_Loop : Directive<"loop"> {
407  let allowedClauses = [
408    VersionedClause<ACCC_DeviceType>,
409    VersionedClause<ACCC_Private>,
410    VersionedClause<ACCC_Reduction>,
411    VersionedClause<ACCC_Collapse>,
412    VersionedClause<ACCC_Gang>,
413    VersionedClause<ACCC_ShortLoop>,
414    VersionedClause<ACCC_Tile>,
415    VersionedClause<ACCC_Vector>,
416    VersionedClause<ACCC_Worker>
417  ];
418  let allowedExclusiveClauses = [
419    VersionedClause<ACCC_Auto>,
420    VersionedClause<ACCC_Independent>,
421    VersionedClause<ACCC_Seq>
422  ];
423  let association = AS_Loop;
424  let category = CA_Executable;
425}
426
427// 2.10
428def ACC_Cache : Directive<"cache"> {
429  let association = AS_None;
430  let category = CA_Executable;
431}
432
433// 2.14.1
434def ACC_Init : Directive<"init"> {
435  let allowedOnceClauses = [
436    VersionedClause<ACCC_DeviceNum>,
437    VersionedClause<ACCC_DeviceType>,
438    VersionedClause<ACCC_If>
439  ];
440  let association = AS_None;
441  let category = CA_Executable;
442}
443
444// 2.15.1
445def ACC_Routine : Directive<"routine"> {
446  let allowedClauses = [
447    VersionedClause<ACCC_Bind>,
448    VersionedClause<ACCC_DeviceType>,
449    VersionedClause<ACCC_Gang>,
450    VersionedClause<ACCC_Seq>,
451    VersionedClause<ACCC_Vector>,
452    VersionedClause<ACCC_Worker>
453  ];
454  let allowedOnceClauses = [
455    VersionedClause<ACCC_NoHost>
456  ];
457  let association = AS_Declaration;
458  let category = CA_Declarative;
459}
460
461// 2.14.3
462def ACC_Set : Directive<"set"> {
463  let allowedOnceClauses = [
464    VersionedClause<ACCC_DefaultAsync>,
465    VersionedClause<ACCC_DeviceNum>,
466    VersionedClause<ACCC_DeviceType>,
467    VersionedClause<ACCC_If>
468  ];
469  let requiredClauses = [
470    // The three following clauses are also in allowedOnceClauses list due to
471    // restriction 2255 - Two instances of the same clause may not appear on the
472    // same directive.
473    VersionedClause<ACCC_DefaultAsync>,
474    VersionedClause<ACCC_DeviceNum>,
475    VersionedClause<ACCC_DeviceType>
476  ];
477  let association = AS_None;
478  let category = CA_Executable;
479}
480
481// 2.14.2
482def ACC_Shutdown : Directive<"shutdown"> {
483  let allowedOnceClauses = [
484    VersionedClause<ACCC_DeviceNum>,
485    VersionedClause<ACCC_DeviceType>,
486    VersionedClause<ACCC_If>
487  ];
488  let association = AS_None;
489  let category = CA_Executable;
490}
491
492// 2.14.4
493def ACC_Update : Directive<"update"> {
494  let allowedClauses = [
495    VersionedClause<ACCC_DeviceType>,
496    VersionedClause<ACCC_Wait>
497  ];
498  let allowedOnceClauses = [
499    VersionedClause<ACCC_Async>,
500    VersionedClause<ACCC_If>,
501    VersionedClause<ACCC_IfPresent>
502  ];
503  let requiredClauses = [
504    VersionedClause<ACCC_Device>,
505    VersionedClause<ACCC_Host>,
506    VersionedClause<ACCC_Self>
507  ];
508  let association = AS_None;
509  let category = CA_Executable;
510}
511
512// 2.16.3
513def ACC_Wait : Directive<"wait"> {
514  let allowedOnceClauses = [
515    VersionedClause<ACCC_Async>,
516    VersionedClause<ACCC_If>
517  ];
518  let association = AS_None;
519  let category = CA_Executable;
520}
521
522// 2.14.6
523def ACC_EnterData : Directive<"enter data"> {
524  let allowedClauses = [
525    VersionedClause<ACCC_Wait>
526  ];
527  let allowedOnceClauses = [
528    VersionedClause<ACCC_Async>,
529    VersionedClause<ACCC_If>
530  ];
531  let requiredClauses = [
532    VersionedClause<ACCC_Attach>,
533    VersionedClause<ACCC_Create>,
534    VersionedClause<ACCC_Copyin>
535  ];
536  let association = AS_None;
537  let category = CA_Executable;
538}
539
540// 2.14.7
541def ACC_ExitData : Directive<"exit data"> {
542  let allowedClauses = [
543    VersionedClause<ACCC_Wait>
544  ];
545  let allowedOnceClauses = [
546    VersionedClause<ACCC_Async>,
547    VersionedClause<ACCC_If>,
548    VersionedClause<ACCC_Finalize>
549  ];
550  let requiredClauses = [
551    VersionedClause<ACCC_Copyout>,
552    VersionedClause<ACCC_Delete>,
553    VersionedClause<ACCC_Detach>
554  ];
555  let association = AS_None;
556  let category = CA_Executable;
557}
558
559// 2.8
560def ACC_HostData : Directive<"host_data"> {
561  let allowedOnceClauses = [
562    VersionedClause<ACCC_If>,
563    VersionedClause<ACCC_IfPresent>
564  ];
565  let requiredClauses = [
566    VersionedClause<ACCC_UseDevice>
567  ];
568  let association = AS_Block;
569  let category = CA_Executable;
570}
571
572// 2.11
573def ACC_KernelsLoop : Directive<"kernels loop"> {
574  let allowedClauses = [
575    VersionedClause<ACCC_Attach>,
576    VersionedClause<ACCC_Collapse>,
577    VersionedClause<ACCC_Copy>,
578    VersionedClause<ACCC_Copyin>,
579    VersionedClause<ACCC_Copyout>,
580    VersionedClause<ACCC_Create>,
581    VersionedClause<ACCC_DevicePtr>,
582    VersionedClause<ACCC_DeviceType>,
583    VersionedClause<ACCC_Gang>,
584    VersionedClause<ACCC_NoCreate>,
585    VersionedClause<ACCC_NumGangs>,
586    VersionedClause<ACCC_NumWorkers>,
587    VersionedClause<ACCC_Present>,
588    VersionedClause<ACCC_Private>,
589    VersionedClause<ACCC_Reduction>,
590    VersionedClause<ACCC_ShortLoop>,
591    VersionedClause<ACCC_Tile>,
592    VersionedClause<ACCC_Vector>,
593    VersionedClause<ACCC_VectorLength>,
594    VersionedClause<ACCC_Wait>,
595    VersionedClause<ACCC_Worker>
596  ];
597  let allowedOnceClauses = [
598    VersionedClause<ACCC_Async>,
599    VersionedClause<ACCC_Default>,
600    VersionedClause<ACCC_If>,
601    VersionedClause<ACCC_Self>
602  ];
603  let allowedExclusiveClauses = [
604    VersionedClause<ACCC_Auto>,
605    VersionedClause<ACCC_Independent>,
606    VersionedClause<ACCC_Seq>
607  ];
608  let leafConstructs = [ACC_Kernels, ACC_Loop];
609  let category = CA_Executable;
610}
611
612// 2.11
613def ACC_ParallelLoop : Directive<"parallel loop"> {
614  let allowedClauses = [
615    VersionedClause<ACCC_Attach>,
616    VersionedClause<ACCC_Collapse>,
617    VersionedClause<ACCC_Copy>,
618    VersionedClause<ACCC_Copyin>,
619    VersionedClause<ACCC_Copyout>,
620    VersionedClause<ACCC_Create>,
621    VersionedClause<ACCC_DevicePtr>,
622    VersionedClause<ACCC_DeviceType>,
623    VersionedClause<ACCC_FirstPrivate>,
624    VersionedClause<ACCC_Gang>,
625    VersionedClause<ACCC_NoCreate>,
626    VersionedClause<ACCC_NumGangs>,
627    VersionedClause<ACCC_NumWorkers>,
628    VersionedClause<ACCC_Present>,
629    VersionedClause<ACCC_Private>,
630    VersionedClause<ACCC_Reduction>,
631    VersionedClause<ACCC_ShortLoop>,
632    VersionedClause<ACCC_Tile>,
633    VersionedClause<ACCC_Vector>,
634    VersionedClause<ACCC_VectorLength>,
635    VersionedClause<ACCC_Wait>,
636    VersionedClause<ACCC_Worker>
637  ];
638  let allowedOnceClauses = [
639    VersionedClause<ACCC_Async>,
640    VersionedClause<ACCC_Default>,
641    VersionedClause<ACCC_If>,
642    VersionedClause<ACCC_Self>
643  ];
644  let allowedExclusiveClauses = [
645    VersionedClause<ACCC_Auto>,
646    VersionedClause<ACCC_Independent>,
647    VersionedClause<ACCC_Seq>
648  ];
649  let leafConstructs = [ACC_Parallel, ACC_Loop];
650  let category = CA_Executable;
651}
652
653// 2.11
654def ACC_SerialLoop : Directive<"serial loop"> {
655  let allowedClauses = [
656    VersionedClause<ACCC_Attach>,
657    VersionedClause<ACCC_Collapse>,
658    VersionedClause<ACCC_Copy>,
659    VersionedClause<ACCC_Copyin>,
660    VersionedClause<ACCC_Copyout>,
661    VersionedClause<ACCC_Create>,
662    VersionedClause<ACCC_DevicePtr>,
663    VersionedClause<ACCC_DeviceType>,
664    VersionedClause<ACCC_FirstPrivate>,
665    VersionedClause<ACCC_Gang>,
666    VersionedClause<ACCC_NoCreate>,
667    VersionedClause<ACCC_Present>,
668    VersionedClause<ACCC_Private>,
669    VersionedClause<ACCC_Reduction>,
670    VersionedClause<ACCC_ShortLoop>,
671    VersionedClause<ACCC_Tile>,
672    VersionedClause<ACCC_Vector>,
673    VersionedClause<ACCC_Wait>,
674    VersionedClause<ACCC_Worker>
675  ];
676  let allowedOnceClauses = [
677    VersionedClause<ACCC_Async>,
678    VersionedClause<ACCC_Default>,
679    VersionedClause<ACCC_If>,
680    VersionedClause<ACCC_Self>
681  ];
682  let allowedExclusiveClauses = [
683    VersionedClause<ACCC_Auto>,
684    VersionedClause<ACCC_Independent>,
685    VersionedClause<ACCC_Seq>
686  ];
687  let leafConstructs = [ACC_Serial, ACC_Loop];
688  let category = CA_Executable;
689}
690
691def ACC_Unknown : Directive<"unknown"> {
692  let isDefault = true;
693  let association = AS_None;
694  let category = CA_Utility;
695}
696