ACC.td 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  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.1 directives and clauses.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. include "llvm/Frontend/Directive/DirectiveBase.td"
  13. //===----------------------------------------------------------------------===//
  14. // Definition of general OpenACC information
  15. //===----------------------------------------------------------------------===//
  16. def OpenACC : DirectiveLanguage {
  17. let name = "OpenACC";
  18. let cppNamespace = "acc"; // final namespace will be llvm::acc
  19. let directivePrefix = "ACCD_";
  20. let clausePrefix = "ACCC_";
  21. let makeEnumAvailableInNamespace = true;
  22. let enableBitmaskEnumInNamespace = true;
  23. let clauseEnumSetClass = "AccClauseSet";
  24. let flangClauseBaseClass = "AccClause";
  25. }
  26. //===----------------------------------------------------------------------===//
  27. // Definition of OpenACC clauses
  28. //===----------------------------------------------------------------------===//
  29. // 2.16.1
  30. def ACCC_Async : Clause<"async"> {
  31. let flangClass = "ScalarIntExpr";
  32. let isValueOptional = true;
  33. }
  34. // 2.9.7
  35. def ACCC_Auto : Clause<"auto"> {}
  36. // 2.7.12
  37. def ACCC_Attach : Clause<"attach"> {
  38. let flangClass = "AccObjectList";
  39. }
  40. // 2.15.1
  41. def ACCC_Bind : Clause<"bind"> {
  42. let flangClass = "AccBindClause";
  43. }
  44. // 2.12
  45. def ACCC_Capture : Clause<"capture"> {
  46. }
  47. // 2.9.1
  48. def ACCC_Collapse : Clause<"collapse"> {
  49. let flangClass = "ScalarIntConstantExpr";
  50. }
  51. // 2.7.6
  52. def ACCC_Copy : Clause<"copy"> {
  53. let flangClass = "AccObjectList";
  54. }
  55. // 2.7.7
  56. def ACCC_Copyin : Clause<"copyin"> {
  57. let flangClass = "AccObjectListWithModifier";
  58. }
  59. // 2.7.8
  60. def ACCC_Copyout : Clause<"copyout"> {
  61. let flangClass = "AccObjectListWithModifier";
  62. }
  63. // 2.7.9
  64. def ACCC_Create : Clause<"create"> {
  65. let flangClass = "AccObjectListWithModifier";
  66. }
  67. // 2.5.15
  68. def ACC_Default_none : ClauseVal<"none", 1, 1> { let isDefault = 1; }
  69. def ACC_Default_present : ClauseVal<"present", 0, 1> {}
  70. def ACCC_Default : Clause<"default"> {
  71. let flangClass = "AccDefaultClause";
  72. let enumClauseValue = "DefaultValue";
  73. let allowedClauseValues = [
  74. ACC_Default_present,
  75. ACC_Default_none
  76. ];
  77. }
  78. // 2.14.3
  79. def ACCC_DefaultAsync : Clause<"default_async"> {
  80. let flangClass = "ScalarIntExpr";
  81. }
  82. // 2.7.11
  83. def ACCC_Delete : Clause<"delete"> {
  84. let flangClass = "AccObjectList";
  85. }
  86. // 2.7.13
  87. def ACCC_Detach : Clause<"detach"> {
  88. let flangClass = "AccObjectList";
  89. }
  90. // 2.14.4
  91. def ACCC_Device : Clause<"device"> {
  92. let flangClass = "AccObjectList";
  93. }
  94. // 2.14.1 - 2.14.2
  95. def ACCC_DeviceNum : Clause<"device_num"> {
  96. let flangClass = "ScalarIntExpr";
  97. }
  98. // 2.7.4
  99. def ACCC_DevicePtr : Clause<"deviceptr"> {
  100. let flangClass = "AccObjectList";
  101. }
  102. // 2.13.1
  103. def ACCC_DeviceResident : Clause<"device_resident"> {
  104. let flangClass = "AccObjectList";
  105. }
  106. // 2.4
  107. def ACCC_DeviceType : Clause<"device_type"> {
  108. let flangClass = "ScalarIntExpr";
  109. let defaultValue = "*";
  110. let isValueOptional = true;
  111. let isValueList = true;
  112. }
  113. // 2.6.6
  114. def ACCC_Finalize : Clause<"finalize"> {}
  115. // 2.5.13
  116. def ACCC_FirstPrivate : Clause<"firstprivate"> {
  117. let flangClass = "AccObjectList";
  118. }
  119. // 2.9.2
  120. def ACCC_Gang : Clause<"gang"> {
  121. let flangClass = "AccGangArgument";
  122. let isValueOptional = true;
  123. }
  124. // 2.14.4
  125. def ACCC_Host : Clause<"host"> {
  126. let flangClass = "AccObjectList";
  127. }
  128. // 2.5.5
  129. def ACCC_If : Clause <"if"> {
  130. let flangClass = "ScalarLogicalExpr";
  131. }
  132. // 2.14.4
  133. def ACCC_IfPresent : Clause<"if_present"> {}
  134. // 2.9.6
  135. def ACCC_Independent : Clause<"independent"> {}
  136. // 2.13.3
  137. def ACCC_Link : Clause<"link"> {
  138. let flangClass = "AccObjectList";
  139. }
  140. // 2.7.10
  141. def ACCC_NoCreate : Clause<"no_create"> {
  142. let flangClass = "AccObjectList";
  143. }
  144. // 2.15.1
  145. def ACCC_NoHost : Clause<"nohost"> {}
  146. // 2.5.9
  147. def ACCC_NumGangs : Clause<"num_gangs"> {
  148. let flangClass = "ScalarIntExpr";
  149. }
  150. // 2.5.10
  151. def ACCC_NumWorkers : Clause<"num_workers"> {
  152. let flangClass = "ScalarIntExpr";
  153. }
  154. // 2.7.5
  155. def ACCC_Present : Clause<"present"> {
  156. let flangClass = "AccObjectList";
  157. }
  158. // 2.5.12
  159. def ACCC_Private : Clause<"private"> {
  160. let flangClass = "AccObjectList";
  161. }
  162. // 2.9.8
  163. def ACCC_Tile : Clause <"tile"> {
  164. let flangClass = "AccTileExprList";
  165. }
  166. // 2.8.1
  167. def ACCC_UseDevice : Clause <"use_device"> {
  168. let flangClass = "AccObjectList";
  169. }
  170. // 2.12
  171. def ACCC_Read : Clause<"read"> {}
  172. // 2.5.14
  173. def ACCC_Reduction : Clause<"reduction"> {
  174. let flangClass = "AccObjectListWithReduction";
  175. }
  176. // 2.5.6
  177. def ACCC_Self : Clause<"self"> {
  178. let flangClass = "AccSelfClause";
  179. }
  180. // 2.9.5
  181. def ACCC_Seq : Clause<"seq"> {}
  182. // 2.9.4
  183. def ACCC_Vector : Clause<"vector"> {
  184. let flangClass = "ScalarIntExpr";
  185. let isValueOptional = true;
  186. }
  187. // 2.5.11
  188. def ACCC_VectorLength : Clause<"vector_length"> {
  189. let flangClass = "ScalarIntExpr";
  190. }
  191. // 2.16.2
  192. def ACCC_Wait : Clause<"wait"> {
  193. let flangClass = "AccWaitArgument";
  194. let isValueOptional = true;
  195. }
  196. // 2.9.3
  197. def ACCC_Worker: Clause<"worker"> {
  198. let flangClass = "ScalarIntExpr";
  199. let isValueOptional = true;
  200. }
  201. // 2.12
  202. def ACCC_Write : Clause<"write"> {}
  203. def ACCC_Unknown : Clause<"unknown"> {
  204. let isDefault = true;
  205. }
  206. //===----------------------------------------------------------------------===//
  207. // Definition of OpenACC directives
  208. //===----------------------------------------------------------------------===//
  209. // 2.12
  210. def ACC_Atomic : Directive<"atomic"> {}
  211. // 2.6.5
  212. def ACC_Data : Directive<"data"> {
  213. let allowedOnceClauses = [
  214. VersionedClause<ACCC_If>,
  215. VersionedClause<ACCC_Default>
  216. ];
  217. let requiredClauses = [
  218. VersionedClause<ACCC_Attach>,
  219. VersionedClause<ACCC_Copy>,
  220. VersionedClause<ACCC_Copyin>,
  221. VersionedClause<ACCC_Copyout>,
  222. VersionedClause<ACCC_Create>,
  223. VersionedClause<ACCC_Default>,
  224. VersionedClause<ACCC_DevicePtr>,
  225. VersionedClause<ACCC_NoCreate>,
  226. VersionedClause<ACCC_Present>
  227. ];
  228. }
  229. // 2.13
  230. def ACC_Declare : Directive<"declare"> {
  231. let allowedClauses = [
  232. VersionedClause<ACCC_Copy>,
  233. VersionedClause<ACCC_Copyin>,
  234. VersionedClause<ACCC_Copyout>,
  235. VersionedClause<ACCC_Create>,
  236. VersionedClause<ACCC_Present>,
  237. VersionedClause<ACCC_DevicePtr>,
  238. VersionedClause<ACCC_DeviceResident>,
  239. VersionedClause<ACCC_Link>
  240. ];
  241. }
  242. // 2.5.3
  243. def ACC_Kernels : Directive<"kernels"> {
  244. let allowedClauses = [
  245. VersionedClause<ACCC_Attach>,
  246. VersionedClause<ACCC_Copy>,
  247. VersionedClause<ACCC_Copyin>,
  248. VersionedClause<ACCC_Copyout>,
  249. VersionedClause<ACCC_Create>,
  250. VersionedClause<ACCC_DeviceType>,
  251. VersionedClause<ACCC_NoCreate>,
  252. VersionedClause<ACCC_Present>,
  253. VersionedClause<ACCC_DevicePtr>,
  254. VersionedClause<ACCC_Wait>
  255. ];
  256. let allowedOnceClauses = [
  257. VersionedClause<ACCC_Async>,
  258. VersionedClause<ACCC_Default>,
  259. VersionedClause<ACCC_If>,
  260. VersionedClause<ACCC_NumGangs>,
  261. VersionedClause<ACCC_NumWorkers>,
  262. VersionedClause<ACCC_Self>,
  263. VersionedClause<ACCC_VectorLength>
  264. ];
  265. }
  266. // 2.5.1
  267. def ACC_Parallel : Directive<"parallel"> {
  268. let allowedClauses = [
  269. VersionedClause<ACCC_Attach>,
  270. VersionedClause<ACCC_Copy>,
  271. VersionedClause<ACCC_Copyin>,
  272. VersionedClause<ACCC_Copyout>,
  273. VersionedClause<ACCC_Create>,
  274. VersionedClause<ACCC_DevicePtr>,
  275. VersionedClause<ACCC_DeviceType>,
  276. VersionedClause<ACCC_NoCreate>,
  277. VersionedClause<ACCC_Present>,
  278. VersionedClause<ACCC_Private>,
  279. VersionedClause<ACCC_FirstPrivate>,
  280. VersionedClause<ACCC_Wait>
  281. ];
  282. let allowedOnceClauses = [
  283. VersionedClause<ACCC_Async>,
  284. VersionedClause<ACCC_Default>,
  285. VersionedClause<ACCC_If>,
  286. VersionedClause<ACCC_NumGangs>,
  287. VersionedClause<ACCC_NumWorkers>,
  288. VersionedClause<ACCC_Reduction>,
  289. VersionedClause<ACCC_Self>,
  290. VersionedClause<ACCC_VectorLength>
  291. ];
  292. }
  293. // 2.5.2
  294. def ACC_Serial : Directive<"serial"> {
  295. // Spec line 950-951: clause is as for the parallel construct except that the
  296. // num_gangs, num_workers, and vector_length clauses are not permitted.
  297. let allowedClauses = [
  298. VersionedClause<ACCC_Attach>,
  299. VersionedClause<ACCC_Copy>,
  300. VersionedClause<ACCC_Copyin>,
  301. VersionedClause<ACCC_Copyout>,
  302. VersionedClause<ACCC_Create>,
  303. VersionedClause<ACCC_DevicePtr>,
  304. VersionedClause<ACCC_DeviceType>,
  305. VersionedClause<ACCC_NoCreate>,
  306. VersionedClause<ACCC_Present>,
  307. VersionedClause<ACCC_Private>,
  308. VersionedClause<ACCC_FirstPrivate>,
  309. VersionedClause<ACCC_Wait>
  310. ];
  311. let allowedOnceClauses = [
  312. VersionedClause<ACCC_Async>,
  313. VersionedClause<ACCC_Default>,
  314. VersionedClause<ACCC_If>,
  315. VersionedClause<ACCC_Reduction>,
  316. VersionedClause<ACCC_Self>
  317. ];
  318. }
  319. // 2.9
  320. def ACC_Loop : Directive<"loop"> {
  321. let allowedClauses = [
  322. VersionedClause<ACCC_DeviceType>,
  323. VersionedClause<ACCC_Private>
  324. ];
  325. let allowedOnceClauses = [
  326. VersionedClause<ACCC_Collapse>,
  327. VersionedClause<ACCC_Gang>,
  328. VersionedClause<ACCC_Reduction>,
  329. VersionedClause<ACCC_Tile>,
  330. VersionedClause<ACCC_Vector>,
  331. VersionedClause<ACCC_Worker>
  332. ];
  333. let allowedExclusiveClauses = [
  334. VersionedClause<ACCC_Auto>,
  335. VersionedClause<ACCC_Independent>,
  336. VersionedClause<ACCC_Seq>
  337. ];
  338. }
  339. // 2.10
  340. def ACC_Cache : Directive<"cache"> {}
  341. // 2.14.1
  342. def ACC_Init : Directive<"init"> {
  343. let allowedOnceClauses = [
  344. VersionedClause<ACCC_DeviceNum>,
  345. VersionedClause<ACCC_DeviceType>,
  346. VersionedClause<ACCC_If>
  347. ];
  348. }
  349. // 2.15.1
  350. def ACC_Routine : Directive<"routine"> {
  351. let allowedOnceClauses = [
  352. VersionedClause<ACCC_Bind>,
  353. VersionedClause<ACCC_DeviceType>,
  354. VersionedClause<ACCC_NoHost>
  355. ];
  356. let requiredClauses = [
  357. VersionedClause<ACCC_Gang>,
  358. VersionedClause<ACCC_Seq>,
  359. VersionedClause<ACCC_Vector>,
  360. VersionedClause<ACCC_Worker>
  361. ];
  362. }
  363. // 2.14.3
  364. def ACC_Set : Directive<"set"> {
  365. let allowedOnceClauses = [
  366. VersionedClause<ACCC_DefaultAsync>,
  367. VersionedClause<ACCC_DeviceNum>,
  368. VersionedClause<ACCC_DeviceType>,
  369. VersionedClause<ACCC_If>
  370. ];
  371. let requiredClauses = [
  372. // The three following clauses are also in allowedOnceClauses list due to
  373. // restriction 2255 - Two instances of the same clause may not appear on the
  374. // same directive.
  375. VersionedClause<ACCC_DefaultAsync>,
  376. VersionedClause<ACCC_DeviceNum>,
  377. VersionedClause<ACCC_DeviceType>
  378. ];
  379. }
  380. // 2.14.2
  381. def ACC_Shutdown : Directive<"shutdown"> {
  382. let allowedOnceClauses = [
  383. VersionedClause<ACCC_DeviceNum>,
  384. VersionedClause<ACCC_DeviceType>,
  385. VersionedClause<ACCC_If>
  386. ];
  387. }
  388. // 2.14.4
  389. def ACC_Update : Directive<"update"> {
  390. let allowedClauses = [
  391. VersionedClause<ACCC_DeviceType>,
  392. VersionedClause<ACCC_Wait>
  393. ];
  394. let allowedOnceClauses = [
  395. VersionedClause<ACCC_Async>,
  396. VersionedClause<ACCC_If>,
  397. VersionedClause<ACCC_IfPresent>
  398. ];
  399. let requiredClauses = [
  400. VersionedClause<ACCC_Device>,
  401. VersionedClause<ACCC_Host>,
  402. VersionedClause<ACCC_Self>
  403. ];
  404. }
  405. // 2.16.3
  406. def ACC_Wait : Directive<"wait"> {
  407. let allowedOnceClauses = [
  408. VersionedClause<ACCC_Async>,
  409. VersionedClause<ACCC_If>
  410. ];
  411. }
  412. // 2.14.6
  413. def ACC_EnterData : Directive<"enter data"> {
  414. let allowedClauses = [
  415. VersionedClause<ACCC_Wait>
  416. ];
  417. let allowedOnceClauses = [
  418. VersionedClause<ACCC_Async>,
  419. VersionedClause<ACCC_If>
  420. ];
  421. let requiredClauses = [
  422. VersionedClause<ACCC_Attach>,
  423. VersionedClause<ACCC_Create>,
  424. VersionedClause<ACCC_Copyin>
  425. ];
  426. }
  427. // 2.14.7
  428. def ACC_ExitData : Directive<"exit data"> {
  429. let allowedClauses = [
  430. VersionedClause<ACCC_Wait>
  431. ];
  432. let allowedOnceClauses = [
  433. VersionedClause<ACCC_Async>,
  434. VersionedClause<ACCC_If>,
  435. VersionedClause<ACCC_Finalize>
  436. ];
  437. let requiredClauses = [
  438. VersionedClause<ACCC_Copyout>,
  439. VersionedClause<ACCC_Delete>,
  440. VersionedClause<ACCC_Detach>
  441. ];
  442. }
  443. // 2.8
  444. def ACC_HostData : Directive<"host_data"> {
  445. let allowedOnceClauses = [
  446. VersionedClause<ACCC_If>,
  447. VersionedClause<ACCC_IfPresent>
  448. ];
  449. let requiredClauses = [
  450. VersionedClause<ACCC_UseDevice>
  451. ];
  452. }
  453. // 2.11
  454. def ACC_KernelsLoop : Directive<"kernels loop"> {
  455. let allowedClauses = [
  456. VersionedClause<ACCC_Copy>,
  457. VersionedClause<ACCC_Copyin>,
  458. VersionedClause<ACCC_Copyout>,
  459. VersionedClause<ACCC_Create>,
  460. VersionedClause<ACCC_DeviceType>,
  461. VersionedClause<ACCC_NoCreate>,
  462. VersionedClause<ACCC_Present>,
  463. VersionedClause<ACCC_Private>,
  464. VersionedClause<ACCC_DevicePtr>,
  465. VersionedClause<ACCC_Attach>,
  466. VersionedClause<ACCC_Wait>
  467. ];
  468. let allowedOnceClauses = [
  469. VersionedClause<ACCC_Async>,
  470. VersionedClause<ACCC_Collapse>,
  471. VersionedClause<ACCC_Default>,
  472. VersionedClause<ACCC_Gang>,
  473. VersionedClause<ACCC_If>,
  474. VersionedClause<ACCC_NumGangs>,
  475. VersionedClause<ACCC_NumWorkers>,
  476. VersionedClause<ACCC_Reduction>,
  477. VersionedClause<ACCC_Self>,
  478. VersionedClause<ACCC_Tile>,
  479. VersionedClause<ACCC_Vector>,
  480. VersionedClause<ACCC_VectorLength>,
  481. VersionedClause<ACCC_Worker>
  482. ];
  483. let allowedExclusiveClauses = [
  484. VersionedClause<ACCC_Auto>,
  485. VersionedClause<ACCC_Independent>,
  486. VersionedClause<ACCC_Seq>
  487. ];
  488. }
  489. // 2.11
  490. def ACC_ParallelLoop : Directive<"parallel loop"> {
  491. let allowedClauses = [
  492. VersionedClause<ACCC_Attach>,
  493. VersionedClause<ACCC_Copy>,
  494. VersionedClause<ACCC_Copyin>,
  495. VersionedClause<ACCC_Copyout>,
  496. VersionedClause<ACCC_Create>,
  497. VersionedClause<ACCC_DevicePtr>,
  498. VersionedClause<ACCC_DeviceType>,
  499. VersionedClause<ACCC_FirstPrivate>,
  500. VersionedClause<ACCC_NoCreate>,
  501. VersionedClause<ACCC_Present>,
  502. VersionedClause<ACCC_Private>,
  503. VersionedClause<ACCC_Tile>,
  504. VersionedClause<ACCC_Wait>
  505. ];
  506. let allowedOnceClauses = [
  507. VersionedClause<ACCC_Async>,
  508. VersionedClause<ACCC_Collapse>,
  509. VersionedClause<ACCC_Default>,
  510. VersionedClause<ACCC_Gang>,
  511. VersionedClause<ACCC_If>,
  512. VersionedClause<ACCC_NumGangs>,
  513. VersionedClause<ACCC_NumWorkers>,
  514. VersionedClause<ACCC_Reduction>,
  515. VersionedClause<ACCC_Self>,
  516. VersionedClause<ACCC_Vector>,
  517. VersionedClause<ACCC_VectorLength>,
  518. VersionedClause<ACCC_Worker>
  519. ];
  520. let allowedExclusiveClauses = [
  521. VersionedClause<ACCC_Auto>,
  522. VersionedClause<ACCC_Independent>,
  523. VersionedClause<ACCC_Seq>
  524. ];
  525. }
  526. // 2.11
  527. def ACC_SerialLoop : Directive<"serial loop"> {
  528. let allowedClauses = [
  529. VersionedClause<ACCC_Attach>,
  530. VersionedClause<ACCC_Copy>,
  531. VersionedClause<ACCC_Copyin>,
  532. VersionedClause<ACCC_Copyout>,
  533. VersionedClause<ACCC_Create>,
  534. VersionedClause<ACCC_DevicePtr>,
  535. VersionedClause<ACCC_DeviceType>,
  536. VersionedClause<ACCC_FirstPrivate>,
  537. VersionedClause<ACCC_NoCreate>,
  538. VersionedClause<ACCC_Present>,
  539. VersionedClause<ACCC_Private>,
  540. VersionedClause<ACCC_Wait>
  541. ];
  542. let allowedOnceClauses = [
  543. VersionedClause<ACCC_Async>,
  544. VersionedClause<ACCC_Collapse>,
  545. VersionedClause<ACCC_Default>,
  546. VersionedClause<ACCC_Gang>,
  547. VersionedClause<ACCC_If>,
  548. VersionedClause<ACCC_Reduction>,
  549. VersionedClause<ACCC_Self>,
  550. VersionedClause<ACCC_Tile>,
  551. VersionedClause<ACCC_Vector>,
  552. VersionedClause<ACCC_Worker>
  553. ];
  554. let allowedExclusiveClauses = [
  555. VersionedClause<ACCC_Auto>,
  556. VersionedClause<ACCC_Independent>,
  557. VersionedClause<ACCC_Seq>
  558. ];
  559. }
  560. def ACC_Unknown : Directive<"unknown"> {
  561. let isDefault = true;
  562. }