• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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// 2.9.4
233def ACCC_Vector : Clause<"vector"> {
234  let flangClass = "ScalarIntExpr";
235  let isValueOptional = true;
236  let prefix = "length";
237}
238
239// 2.5.12
240def ACCC_VectorLength : Clause<"vector_length"> {
241  let flangClass = "ScalarIntExpr";
242}
243
244// 2.16.2
245def ACCC_Wait : Clause<"wait"> {
246  let flangClass = "AccWaitArgument";
247  let isValueOptional = true;
248}
249
250// 2.9.3
251def ACCC_Worker: Clause<"worker"> {
252  let flangClass = "ScalarIntExpr";
253  let isValueOptional = true;
254  let prefix = "num";
255}
256
257// 2.12
258def ACCC_Write : Clause<"write"> {}
259
260def ACCC_Unknown : Clause<"unknown"> {
261  let isDefault = true;
262}
263
264//===----------------------------------------------------------------------===//
265// Definition of OpenACC directives
266//===----------------------------------------------------------------------===//
267
268// 2.12
269def ACC_Atomic : Directive<"atomic"> {
270  let association = AS_Block;
271}
272
273// 2.6.5
274def ACC_Data : Directive<"data"> {
275  let allowedOnceClauses = [
276    VersionedClause<ACCC_Async, 32>,
277    VersionedClause<ACCC_If>,
278    VersionedClause<ACCC_Default>
279  ];
280  let allowedClauses = [
281    VersionedClause<ACCC_DeviceType, 32>,
282    VersionedClause<ACCC_Wait, 32>
283  ];
284  let requiredClauses = [
285    VersionedClause<ACCC_Attach>,
286    VersionedClause<ACCC_Copy>,
287    VersionedClause<ACCC_Copyin>,
288    VersionedClause<ACCC_Copyout>,
289    VersionedClause<ACCC_Create>,
290    VersionedClause<ACCC_Default>,
291    VersionedClause<ACCC_DevicePtr>,
292    VersionedClause<ACCC_NoCreate>,
293    VersionedClause<ACCC_Present>
294  ];
295  let association = AS_Block;
296}
297
298// 2.13
299def ACC_Declare : Directive<"declare"> {
300  let allowedClauses = [
301    VersionedClause<ACCC_Copy>,
302    VersionedClause<ACCC_Copyin>,
303    VersionedClause<ACCC_Copyout>,
304    VersionedClause<ACCC_Create>,
305    VersionedClause<ACCC_Present>,
306    VersionedClause<ACCC_DevicePtr>,
307    VersionedClause<ACCC_DeviceResident>,
308    VersionedClause<ACCC_Link>
309  ];
310  let association = AS_None;
311}
312
313// 2.5.3
314def ACC_Kernels : Directive<"kernels"> {
315  let allowedClauses = [
316    VersionedClause<ACCC_Attach>,
317    VersionedClause<ACCC_Copy>,
318    VersionedClause<ACCC_Copyin>,
319    VersionedClause<ACCC_Copyout>,
320    VersionedClause<ACCC_Create>,
321    VersionedClause<ACCC_DeviceType>,
322    VersionedClause<ACCC_NoCreate>,
323    VersionedClause<ACCC_Present>,
324    VersionedClause<ACCC_DevicePtr>,
325    VersionedClause<ACCC_Wait>
326  ];
327  let allowedOnceClauses = [
328    VersionedClause<ACCC_Async>,
329    VersionedClause<ACCC_Default>,
330    VersionedClause<ACCC_If>,
331    VersionedClause<ACCC_NumGangs>,
332    VersionedClause<ACCC_NumWorkers>,
333    VersionedClause<ACCC_Self>,
334    VersionedClause<ACCC_VectorLength>
335  ];
336  let association = AS_Block;
337}
338
339// 2.5.1
340def ACC_Parallel : Directive<"parallel"> {
341  let allowedClauses = [
342    VersionedClause<ACCC_Attach>,
343    VersionedClause<ACCC_Async>,
344    VersionedClause<ACCC_Copy>,
345    VersionedClause<ACCC_Copyin>,
346    VersionedClause<ACCC_Copyout>,
347    VersionedClause<ACCC_Create>,
348    VersionedClause<ACCC_DevicePtr>,
349    VersionedClause<ACCC_DeviceType>,
350    VersionedClause<ACCC_NoCreate>,
351    VersionedClause<ACCC_NumGangs>,
352    VersionedClause<ACCC_NumWorkers>,
353    VersionedClause<ACCC_Present>,
354    VersionedClause<ACCC_Private>,
355    VersionedClause<ACCC_FirstPrivate>,
356    VersionedClause<ACCC_Reduction>,
357    VersionedClause<ACCC_Wait>,
358    VersionedClause<ACCC_VectorLength>
359  ];
360  let allowedOnceClauses = [
361    VersionedClause<ACCC_Default>,
362    VersionedClause<ACCC_If>,
363    VersionedClause<ACCC_Self>
364  ];
365  let association = AS_Block;
366}
367
368// 2.5.2
369def ACC_Serial : Directive<"serial"> {
370  // Spec line 950-951: clause is as for the parallel construct except that the
371  // num_gangs, num_workers, and vector_length clauses are not permitted.
372  let allowedClauses = [
373    VersionedClause<ACCC_Attach>,
374    VersionedClause<ACCC_Copy>,
375    VersionedClause<ACCC_Copyin>,
376    VersionedClause<ACCC_Copyout>,
377    VersionedClause<ACCC_Create>,
378    VersionedClause<ACCC_DevicePtr>,
379    VersionedClause<ACCC_DeviceType>,
380    VersionedClause<ACCC_NoCreate>,
381    VersionedClause<ACCC_Present>,
382    VersionedClause<ACCC_Private>,
383    VersionedClause<ACCC_FirstPrivate>,
384    VersionedClause<ACCC_Reduction>,
385    VersionedClause<ACCC_Wait>
386  ];
387  let allowedOnceClauses = [
388    VersionedClause<ACCC_Async>,
389    VersionedClause<ACCC_Default>,
390    VersionedClause<ACCC_If>,
391    VersionedClause<ACCC_Self>
392  ];
393  let association = AS_Block;
394}
395
396// 2.9
397def ACC_Loop : Directive<"loop"> {
398  let allowedClauses = [
399    VersionedClause<ACCC_DeviceType>,
400    VersionedClause<ACCC_Private>,
401    VersionedClause<ACCC_Reduction>,
402    VersionedClause<ACCC_Collapse>,
403    VersionedClause<ACCC_Gang>,
404    VersionedClause<ACCC_Tile>,
405    VersionedClause<ACCC_Vector>,
406    VersionedClause<ACCC_Worker>
407  ];
408  let allowedExclusiveClauses = [
409    VersionedClause<ACCC_Auto>,
410    VersionedClause<ACCC_Independent>,
411    VersionedClause<ACCC_Seq>
412  ];
413  let association = AS_Loop;
414}
415
416// 2.10
417def ACC_Cache : Directive<"cache"> {
418  let association = AS_None;
419}
420
421// 2.14.1
422def ACC_Init : Directive<"init"> {
423  let allowedOnceClauses = [
424    VersionedClause<ACCC_DeviceNum>,
425    VersionedClause<ACCC_DeviceType>,
426    VersionedClause<ACCC_If>
427  ];
428  let association = AS_None;
429}
430
431// 2.15.1
432def ACC_Routine : Directive<"routine"> {
433  let allowedClauses = [
434    VersionedClause<ACCC_Bind>,
435    VersionedClause<ACCC_DeviceType>,
436    VersionedClause<ACCC_Gang>,
437    VersionedClause<ACCC_Seq>,
438    VersionedClause<ACCC_Vector>,
439    VersionedClause<ACCC_Worker>
440  ];
441  let allowedOnceClauses = [
442    VersionedClause<ACCC_NoHost>
443  ];
444  let association = AS_Declaration;
445}
446
447// 2.14.3
448def ACC_Set : Directive<"set"> {
449  let allowedOnceClauses = [
450    VersionedClause<ACCC_DefaultAsync>,
451    VersionedClause<ACCC_DeviceNum>,
452    VersionedClause<ACCC_DeviceType>,
453    VersionedClause<ACCC_If>
454  ];
455  let requiredClauses = [
456    // The three following clauses are also in allowedOnceClauses list due to
457    // restriction 2255 - Two instances of the same clause may not appear on the
458    // same directive.
459    VersionedClause<ACCC_DefaultAsync>,
460    VersionedClause<ACCC_DeviceNum>,
461    VersionedClause<ACCC_DeviceType>
462  ];
463  let association = AS_None;
464}
465
466// 2.14.2
467def ACC_Shutdown : Directive<"shutdown"> {
468  let allowedOnceClauses = [
469    VersionedClause<ACCC_DeviceNum>,
470    VersionedClause<ACCC_DeviceType>,
471    VersionedClause<ACCC_If>
472  ];
473  let association = AS_None;
474}
475
476// 2.14.4
477def ACC_Update : Directive<"update"> {
478  let allowedClauses = [
479    VersionedClause<ACCC_DeviceType>,
480    VersionedClause<ACCC_Wait>
481  ];
482  let allowedOnceClauses = [
483    VersionedClause<ACCC_Async>,
484    VersionedClause<ACCC_If>,
485    VersionedClause<ACCC_IfPresent>
486  ];
487  let requiredClauses = [
488    VersionedClause<ACCC_Device>,
489    VersionedClause<ACCC_Host>,
490    VersionedClause<ACCC_Self>
491  ];
492  let association = AS_None;
493}
494
495// 2.16.3
496def ACC_Wait : Directive<"wait"> {
497  let allowedOnceClauses = [
498    VersionedClause<ACCC_Async>,
499    VersionedClause<ACCC_If>
500  ];
501  let association = AS_None;
502}
503
504// 2.14.6
505def ACC_EnterData : Directive<"enter data"> {
506  let allowedClauses = [
507    VersionedClause<ACCC_Wait>
508  ];
509  let allowedOnceClauses = [
510    VersionedClause<ACCC_Async>,
511    VersionedClause<ACCC_If>
512  ];
513  let requiredClauses = [
514    VersionedClause<ACCC_Attach>,
515    VersionedClause<ACCC_Create>,
516    VersionedClause<ACCC_Copyin>
517  ];
518  let association = AS_None;
519}
520
521// 2.14.7
522def ACC_ExitData : Directive<"exit data"> {
523  let allowedClauses = [
524    VersionedClause<ACCC_Wait>
525  ];
526  let allowedOnceClauses = [
527    VersionedClause<ACCC_Async>,
528    VersionedClause<ACCC_If>,
529    VersionedClause<ACCC_Finalize>
530  ];
531  let requiredClauses = [
532    VersionedClause<ACCC_Copyout>,
533    VersionedClause<ACCC_Delete>,
534    VersionedClause<ACCC_Detach>
535  ];
536  let association = AS_None;
537}
538
539// 2.8
540def ACC_HostData : Directive<"host_data"> {
541  let allowedOnceClauses = [
542    VersionedClause<ACCC_If>,
543    VersionedClause<ACCC_IfPresent>
544  ];
545  let requiredClauses = [
546    VersionedClause<ACCC_UseDevice>
547  ];
548  let association = AS_Block;
549}
550
551// 2.11
552def ACC_KernelsLoop : Directive<"kernels loop"> {
553  let allowedClauses = [
554    VersionedClause<ACCC_Attach>,
555    VersionedClause<ACCC_Collapse>,
556    VersionedClause<ACCC_Copy>,
557    VersionedClause<ACCC_Copyin>,
558    VersionedClause<ACCC_Copyout>,
559    VersionedClause<ACCC_Create>,
560    VersionedClause<ACCC_DevicePtr>,
561    VersionedClause<ACCC_DeviceType>,
562    VersionedClause<ACCC_Gang>,
563    VersionedClause<ACCC_NoCreate>,
564    VersionedClause<ACCC_NumGangs>,
565    VersionedClause<ACCC_NumWorkers>,
566    VersionedClause<ACCC_Present>,
567    VersionedClause<ACCC_Private>,
568    VersionedClause<ACCC_Reduction>,
569    VersionedClause<ACCC_Tile>,
570    VersionedClause<ACCC_Vector>,
571    VersionedClause<ACCC_VectorLength>,
572    VersionedClause<ACCC_Wait>,
573    VersionedClause<ACCC_Worker>
574  ];
575  let allowedOnceClauses = [
576    VersionedClause<ACCC_Async>,
577    VersionedClause<ACCC_Default>,
578    VersionedClause<ACCC_If>,
579    VersionedClause<ACCC_Self>
580  ];
581  let allowedExclusiveClauses = [
582    VersionedClause<ACCC_Auto>,
583    VersionedClause<ACCC_Independent>,
584    VersionedClause<ACCC_Seq>
585  ];
586  let leafConstructs = [ACC_Kernels, ACC_Loop];
587}
588
589// 2.11
590def ACC_ParallelLoop : Directive<"parallel loop"> {
591  let allowedClauses = [
592    VersionedClause<ACCC_Attach>,
593    VersionedClause<ACCC_Collapse>,
594    VersionedClause<ACCC_Copy>,
595    VersionedClause<ACCC_Copyin>,
596    VersionedClause<ACCC_Copyout>,
597    VersionedClause<ACCC_Create>,
598    VersionedClause<ACCC_DevicePtr>,
599    VersionedClause<ACCC_DeviceType>,
600    VersionedClause<ACCC_FirstPrivate>,
601    VersionedClause<ACCC_Gang>,
602    VersionedClause<ACCC_NoCreate>,
603    VersionedClause<ACCC_NumGangs>,
604    VersionedClause<ACCC_NumWorkers>,
605    VersionedClause<ACCC_Present>,
606    VersionedClause<ACCC_Private>,
607    VersionedClause<ACCC_Reduction>,
608    VersionedClause<ACCC_Tile>,
609    VersionedClause<ACCC_Vector>,
610    VersionedClause<ACCC_VectorLength>,
611    VersionedClause<ACCC_Wait>,
612    VersionedClause<ACCC_Worker>
613  ];
614  let allowedOnceClauses = [
615    VersionedClause<ACCC_Async>,
616    VersionedClause<ACCC_Default>,
617    VersionedClause<ACCC_If>,
618    VersionedClause<ACCC_Self>
619  ];
620  let allowedExclusiveClauses = [
621    VersionedClause<ACCC_Auto>,
622    VersionedClause<ACCC_Independent>,
623    VersionedClause<ACCC_Seq>
624  ];
625  let leafConstructs = [ACC_Parallel, ACC_Loop];
626}
627
628// 2.11
629def ACC_SerialLoop : Directive<"serial loop"> {
630  let allowedClauses = [
631    VersionedClause<ACCC_Attach>,
632    VersionedClause<ACCC_Collapse>,
633    VersionedClause<ACCC_Copy>,
634    VersionedClause<ACCC_Copyin>,
635    VersionedClause<ACCC_Copyout>,
636    VersionedClause<ACCC_Create>,
637    VersionedClause<ACCC_DevicePtr>,
638    VersionedClause<ACCC_DeviceType>,
639    VersionedClause<ACCC_FirstPrivate>,
640    VersionedClause<ACCC_Gang>,
641    VersionedClause<ACCC_NoCreate>,
642    VersionedClause<ACCC_Present>,
643    VersionedClause<ACCC_Private>,
644    VersionedClause<ACCC_Reduction>,
645    VersionedClause<ACCC_Tile>,
646    VersionedClause<ACCC_Vector>,
647    VersionedClause<ACCC_Wait>,
648    VersionedClause<ACCC_Worker>
649  ];
650  let allowedOnceClauses = [
651    VersionedClause<ACCC_Async>,
652    VersionedClause<ACCC_Default>,
653    VersionedClause<ACCC_If>,
654    VersionedClause<ACCC_Self>
655  ];
656  let allowedExclusiveClauses = [
657    VersionedClause<ACCC_Auto>,
658    VersionedClause<ACCC_Independent>,
659    VersionedClause<ACCC_Seq>
660  ];
661  let leafConstructs = [ACC_Serial, ACC_Loop];
662}
663
664def ACC_Unknown : Directive<"unknown"> {
665  let isDefault = true;
666  let association = AS_None;
667}
668