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