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