offtarget 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. offload/__init__.py +10 -0
  2. offload/__main__.py +5 -0
  3. offload/_bundle.py +74 -0
  4. offload/_root/catalog/acc/claims.yaml +197 -0
  5. offload/_root/catalog/acc/clauses.yaml +391 -0
  6. offload/_root/catalog/acc/no_oracle.yaml +89 -0
  7. offload/_root/catalog/acc/out_of_scope.yaml +17 -0
  8. offload/_root/catalog/acc/rules.yaml +433 -0
  9. offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
  10. offload/_root/catalog/acc/skeleton.yaml +1567 -0
  11. offload/_root/catalog/acc/spec_overrides.yaml +72 -0
  12. offload/_root/catalog/later_forms.yaml +76 -0
  13. offload/_root/catalog/machines.yaml +218 -0
  14. offload/_root/catalog/omp/claims.yaml +2047 -0
  15. offload/_root/catalog/omp/clauses.yaml +914 -0
  16. offload/_root/catalog/omp/derivations.yaml +177 -0
  17. offload/_root/catalog/omp/memory_modes.yaml +40 -0
  18. offload/_root/catalog/omp/no_oracle.yaml +373 -0
  19. offload/_root/catalog/omp/omp50_delta.yaml +377 -0
  20. offload/_root/catalog/omp/out_of_scope.yaml +64 -0
  21. offload/_root/catalog/omp/port_equivalence.yaml +352 -0
  22. offload/_root/catalog/omp/rules.yaml +3131 -0
  23. offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
  24. offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
  25. offload/_root/catalog/omp/skeleton.yaml +9181 -0
  26. offload/_root/catalog/omp/spec_overrides.yaml +932 -0
  27. offload/_root/catalog/toolchains.yaml +472 -0
  28. offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
  29. offload/_root/data/canuse/b.json +1 -0
  30. offload/_root/data/canuse/c.json +1 -0
  31. offload/_root/data/canuse/columns.json +1 -0
  32. offload/_root/data/canuse/d.json +1 -0
  33. offload/_root/data/canuse/f.json +1 -0
  34. offload/_root/data/canuse/index.json +1 -0
  35. offload/_root/data/canuse/p.json +1 -0
  36. offload/_root/data/compilers/afar.json +1 -0
  37. offload/_root/data/compilers/cce19.json +1 -0
  38. offload/_root/data/compilers/cce20.json +1 -0
  39. offload/_root/data/compilers/cce21.json +1 -0
  40. offload/_root/data/compilers/cce21_4.json +1 -0
  41. offload/_root/data/compilers/gcc.json +1 -0
  42. offload/_root/data/compilers/gcc_sm80.json +1 -0
  43. offload/_root/data/compilers/nvhpc.json +1 -0
  44. offload/_root/data/compilers/nvhpc269.json +1 -0
  45. offload/_root/data/findings/AUTHORING.md +107 -0
  46. offload/_root/data/findings/README.md +33 -0
  47. offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
  48. offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
  49. offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
  50. offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
  51. offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
  52. offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
  53. offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
  54. offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
  55. offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
  56. offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
  57. offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
  58. offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
  59. offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
  60. offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
  61. offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
  62. offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
  63. offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
  64. offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
  65. offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
  66. offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
  67. offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
  68. offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
  69. offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
  70. offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
  71. offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
  72. offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
  73. offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
  74. offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
  75. offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
  76. offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
  77. offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
  78. offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
  79. offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
  80. offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
  81. offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
  82. offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
  83. offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
  84. offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
  85. offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
  86. offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
  87. offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
  88. offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
  89. offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
  90. offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
  91. offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
  92. offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
  93. offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
  94. offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
  95. offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
  96. offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
  97. offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
  98. offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
  99. offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
  100. offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
  101. offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
  102. offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
  103. offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
  104. offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
  105. offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
  106. offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
  107. offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
  108. offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
  109. offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
  110. offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
  111. offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
  112. offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
  113. offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
  114. offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
  115. offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
  116. offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
  117. offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
  118. offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
  119. offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
  120. offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
  121. offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
  122. offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
  123. offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
  124. offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
  125. offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
  126. offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
  127. offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
  128. offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
  129. offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
  130. offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
  131. offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
  132. offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
  133. offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
  134. offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
  135. offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
  136. offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
  137. offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
  138. offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
  139. offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
  140. offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
  141. offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
  142. offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
  143. offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
  144. offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
  145. offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
  146. offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
  147. offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
  148. offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
  149. offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
  150. offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
  151. offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
  152. offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
  153. offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
  154. offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
  155. offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
  156. offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
  157. offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
  158. offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
  159. offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
  160. offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
  161. offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
  162. offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
  163. offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
  164. offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
  165. offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
  166. offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
  167. offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
  168. offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
  169. offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
  170. offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
  171. offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
  172. offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
  173. offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
  174. offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
  175. offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
  176. offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
  177. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
  178. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
  179. offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
  180. offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
  181. offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
  182. offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
  183. offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
  184. offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
  185. offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
  186. offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
  187. offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
  188. offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
  189. offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
  190. offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
  191. offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
  192. offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
  193. offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
  194. offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
  195. offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
  196. offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
  197. offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
  198. offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
  199. offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
  200. offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
  201. offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
  202. offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
  203. offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
  204. offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
  205. offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
  206. offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
  207. offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
  208. offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
  209. offload/_root/data/findings/fuzz/README.md +236 -0
  210. offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
  211. offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
  212. offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
  213. offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
  214. offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
  215. offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
  216. offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
  217. offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
  218. offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
  219. offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
  220. offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
  221. offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
  222. offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
  223. offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
  224. offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
  225. offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
  226. offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
  227. offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
  228. offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
  229. offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
  230. offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
  231. offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
  232. offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
  233. offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
  234. offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
  235. offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
  236. offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
  237. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
  238. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
  239. offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
  240. offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
  241. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
  242. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
  243. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
  244. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
  245. offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
  246. offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
  247. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
  248. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
  249. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
  250. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
  251. offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
  252. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
  253. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
  254. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
  255. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
  256. offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
  257. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
  258. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
  259. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
  260. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
  261. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
  262. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
  263. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
  264. offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
  265. offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
  266. offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
  267. offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
  268. offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
  269. offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
  270. offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
  271. offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
  272. offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
  273. offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
  274. offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
  275. offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
  276. offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
  277. offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
  278. offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
  279. offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
  280. offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
  281. offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
  282. offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
  283. offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
  284. offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
  285. offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
  286. offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
  287. offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
  288. offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
  289. offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
  290. offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
  291. offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
  292. offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
  293. offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
  294. offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
  295. offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
  296. offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
  297. offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
  298. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
  299. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
  300. offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
  301. offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
  302. offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
  303. offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
  304. offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
  305. offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
  306. offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
  307. offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
  308. offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
  309. offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
  310. offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
  311. offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
  312. offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
  313. offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
  314. offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
  315. offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
  316. offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
  317. offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
  318. offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
  319. offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
  320. offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
  321. offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
  322. offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
  323. offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
  324. offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
  325. offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
  326. offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
  327. offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
  328. offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
  329. offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
  330. offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
  331. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
  332. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
  333. offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
  334. offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
  335. offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
  336. offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
  337. offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
  338. offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
  339. offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
  340. offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
  341. offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
  342. offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
  343. offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
  344. offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
  345. offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
  346. offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
  347. offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
  348. offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
  349. offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
  350. offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
  351. offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
  352. offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
  353. offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
  354. offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
  355. offload/_root/data/findings/index.yaml +2453 -0
  356. offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
  357. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
  358. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
  359. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
  360. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
  361. offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
  362. offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
  363. offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
  364. offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
  365. offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
  366. offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
  367. offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
  368. offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
  369. offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
  370. offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
  371. offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
  372. offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
  373. offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
  374. offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
  375. offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
  376. offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
  377. offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
  378. offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
  379. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
  380. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
  381. offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
  382. offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
  383. offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
  384. offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
  385. offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
  386. offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
  387. offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
  388. offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
  389. offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
  390. offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
  391. offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
  392. offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
  393. offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
  394. offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
  395. offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
  396. offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
  397. offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
  398. offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
  399. offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
  400. offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
  401. offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
  402. offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
  403. offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
  404. offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
  405. offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
  406. offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
  407. offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
  408. offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
  409. offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
  410. offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
  411. offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
  412. offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
  413. offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
  414. offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
  415. offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
  416. offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
  417. offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
  418. offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
  419. offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
  420. offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
  421. offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
  422. offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
  423. offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
  424. offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
  425. offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
  426. offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
  427. offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
  428. offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
  429. offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
  430. offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
  431. offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
  432. offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
  433. offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
  434. offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
  435. offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
  436. offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
  437. offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
  438. offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
  439. offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
  440. offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
  441. offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
  442. offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
  443. offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
  444. offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
  445. offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
  446. offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
  447. offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
  448. offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
  449. offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
  450. offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
  451. offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
  452. offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
  453. offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
  454. offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
  455. offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
  456. offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
  457. offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
  458. offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
  459. offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
  460. offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
  461. offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
  462. offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
  463. offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
  464. offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
  465. offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
  466. offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
  467. offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
  468. offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
  469. offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
  470. offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
  471. offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
  472. offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
  473. offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
  474. offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
  475. offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
  476. offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
  477. offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
  478. offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
  479. offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
  480. offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
  481. offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
  482. offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
  483. offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
  484. offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
  485. offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
  486. offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
  487. offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
  488. offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
  489. offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
  490. offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
  491. offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
  492. offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
  493. offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
  494. offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
  495. offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
  496. offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
  497. offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
  498. offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
  499. offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
  500. offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
  501. offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
  502. offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
  503. offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
  504. offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
  505. offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
  506. offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
  507. offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
  508. offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
  509. offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
  510. offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
  511. offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
  512. offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
  513. offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
  514. offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
  515. offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
  516. offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
  517. offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
  518. offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
  519. offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
  520. offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
  521. offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
  522. offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
  523. offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
  524. offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
  525. offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
  526. offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
  527. offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
  528. offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
  529. offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
  530. offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
  531. offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
  532. offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
  533. offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
  534. offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
  535. offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
  536. offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
  537. offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
  538. offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
  539. offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
  540. offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
  541. offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
  542. offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
  543. offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
  544. offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
  545. offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
  546. offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
  547. offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
  548. offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
  549. offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
  550. offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
  551. offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
  552. offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
  553. offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
  554. offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
  555. offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
  556. offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
  557. offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
  558. offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
  559. offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
  560. offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
  561. offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
  562. offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
  563. offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
  564. offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
  565. offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
  566. offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
  567. offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
  568. offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
  569. offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
  570. offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
  571. offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
  572. offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
  573. offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
  574. offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
  575. offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
  576. offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
  577. offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
  578. offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
  579. offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
  580. offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
  581. offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
  582. offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
  583. offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
  584. offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
  585. offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
  586. offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
  587. offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
  588. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
  589. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
  590. offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
  591. offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
  592. offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
  593. offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
  594. offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
  595. offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
  596. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
  597. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
  598. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
  599. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
  600. offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
  601. offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
  602. offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
  603. offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
  604. offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
  605. offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
  606. offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
  607. offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
  608. offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
  609. offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
  610. offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
  611. offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
  612. offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
  613. offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
  614. offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
  615. offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
  616. offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
  617. offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
  618. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
  619. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
  620. offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
  621. offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
  622. offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
  623. offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
  624. offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
  625. offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
  626. offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
  627. offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
  628. offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
  629. offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
  630. offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
  631. offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
  632. offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
  633. offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
  634. offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
  635. offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
  636. offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
  637. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
  638. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
  639. offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
  640. offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
  641. offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
  642. offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
  643. offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
  644. offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
  645. offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
  646. offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
  647. offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
  648. offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
  649. offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
  650. offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
  651. offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
  652. offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
  653. offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
  654. offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
  655. offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
  656. offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
  657. offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
  658. offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
  659. offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
  660. offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
  661. offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
  662. offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
  663. offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
  664. offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
  665. offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
  666. offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
  667. offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
  668. offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
  669. offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
  670. offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
  671. offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
  672. offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
  673. offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
  674. offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
  675. offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
  676. offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
  677. offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
  678. offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
  679. offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
  680. offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
  681. offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
  682. offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
  683. offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
  684. offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
  685. offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
  686. offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
  687. offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
  688. offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
  689. offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
  690. offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
  691. offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
  692. offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
  693. offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
  694. offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
  695. offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
  696. offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
  697. offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
  698. offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
  699. offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
  700. offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
  701. offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
  702. offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
  703. offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
  704. offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
  705. offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
  706. offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
  707. offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
  708. offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
  709. offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
  710. offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
  711. offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
  712. offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
  713. offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
  714. offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
  715. offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
  716. offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
  717. offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
  718. offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
  719. offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
  720. offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
  721. offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
  722. offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
  723. offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
  724. offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
  725. offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
  726. offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
  727. offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
  728. offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
  729. offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
  730. offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
  731. offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
  732. offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
  733. offload/_root/data/issues.json +1 -0
  734. offload/_root/data/search.json +1 -0
  735. offload/_root/data/vendor/checks/build.py +288 -0
  736. offload/_version.py +24 -0
  737. offload/canuse.py +88 -0
  738. offload/cli.py +52 -0
  739. offload/data.py +85 -0
  740. offload/engine/__init__.py +0 -0
  741. offload/engine/acc_c_gen.py +415 -0
  742. offload/engine/acc_gen.py +1104 -0
  743. offload/engine/acc_rules.py +656 -0
  744. offload/engine/apps.py +804 -0
  745. offload/engine/baseline.py +324 -0
  746. offload/engine/c_gen.py +883 -0
  747. offload/engine/c_program.py +913 -0
  748. offload/engine/c_rules.py +503 -0
  749. offload/engine/campaign.py +1180 -0
  750. offload/engine/campaigns/__init__.py +2 -0
  751. offload/engine/campaigns/hecbench.py +153 -0
  752. offload/engine/campaigns/nested.py +76 -0
  753. offload/engine/campaigns/oop.py +61 -0
  754. offload/engine/canary.py +275 -0
  755. offload/engine/catalog.py +860 -0
  756. offload/engine/citations.py +532 -0
  757. offload/engine/clang_oracle.py +208 -0
  758. offload/engine/combos.py +234 -0
  759. offload/engine/confirm/__init__.py +2 -0
  760. offload/engine/confirm/backlog.py +159 -0
  761. offload/engine/confirm/claims.py +423 -0
  762. offload/engine/confirm/collectors.py +665 -0
  763. offload/engine/confirm/decisions.py +202 -0
  764. offload/engine/confirm/draft.py +195 -0
  765. offload/engine/confirm/engine.py +157 -0
  766. offload/engine/confirm/execute.py +382 -0
  767. offload/engine/confirm/facts.py +467 -0
  768. offload/engine/confirm/findings.py +617 -0
  769. offload/engine/confirm/forms.py +145 -0
  770. offload/engine/confirm/ingest.py +372 -0
  771. offload/engine/confirm/jobs.py +215 -0
  772. offload/engine/confirm/legality.py +323 -0
  773. offload/engine/confirm/machines.py +254 -0
  774. offload/engine/confirm/minimize.py +268 -0
  775. offload/engine/confirm/model.py +249 -0
  776. offload/engine/confirm/ports.py +107 -0
  777. offload/engine/confirm/programs.py +222 -0
  778. offload/engine/confirm/registry.py +151 -0
  779. offload/engine/confirm/regress.py +278 -0
  780. offload/engine/confirm/rules.py +565 -0
  781. offload/engine/confirm/store.py +63 -0
  782. offload/engine/confirm/triage.py +838 -0
  783. offload/engine/confirm/validate.py +607 -0
  784. offload/engine/confirm/witness.py +355 -0
  785. offload/engine/corpus_check.py +388 -0
  786. offload/engine/coverage.py +318 -0
  787. offload/engine/dataenv_gen.py +1318 -0
  788. offload/engine/dataenv_rules.py +278 -0
  789. offload/engine/devtemps.py +146 -0
  790. offload/engine/expected.py +2559 -0
  791. offload/engine/f2c.py +1783 -0
  792. offload/engine/finding_claims.py +330 -0
  793. offload/engine/finding_header.py +229 -0
  794. offload/engine/finding_rows.py +382 -0
  795. offload/engine/flang_oracle.py +299 -0
  796. offload/engine/fsource.py +620 -0
  797. offload/engine/fuzz.py +2455 -0
  798. offload/engine/fuzz_base.py +2016 -0
  799. offload/engine/fuzz_campaign.py +592 -0
  800. offload/engine/fuzz_exec.py +798 -0
  801. offload/engine/fuzz_min.py +1049 -0
  802. offload/engine/fuzz_profile.py +340 -0
  803. offload/engine/fuzz_report.py +1270 -0
  804. offload/engine/fuzz_steer.py +181 -0
  805. offload/engine/gate.py +1013 -0
  806. offload/engine/gate_report.py +711 -0
  807. offload/engine/gate_run.py +118 -0
  808. offload/engine/gate_stored.py +466 -0
  809. offload/engine/gen.py +1114 -0
  810. offload/engine/gen_templates.py +2583 -0
  811. offload/engine/grammar.py +695 -0
  812. offload/engine/harness.py +1472 -0
  813. offload/engine/harvest/__init__.py +3 -0
  814. offload/engine/harvest/c_runtime.py +465 -0
  815. offload/engine/harvest/checks.py +534 -0
  816. offload/engine/harvest/convert.py +784 -0
  817. offload/engine/harvest/f_runtime.py +668 -0
  818. offload/engine/harvest/filters.py +338 -0
  819. offload/engine/harvest/history.py +122 -0
  820. offload/engine/harvest/inventory.py +399 -0
  821. offload/engine/harvest2/__init__.py +5 -0
  822. offload/engine/harvest2/aomp.py +119 -0
  823. offload/engine/harvest2/examples.py +116 -0
  824. offload/engine/harvest2/gomp.py +679 -0
  825. offload/engine/harvest2/hand.py +150 -0
  826. offload/engine/harvest2/split.py +78 -0
  827. offload/engine/harvest_known/__init__.py +2 -0
  828. offload/engine/harvest_known/apps.py +65 -0
  829. offload/engine/harvest_known/cases.py +128 -0
  830. offload/engine/harvest_known/centres.py +184 -0
  831. offload/engine/harvest_known/forum.py +180 -0
  832. offload/engine/harvest_known/relnotes.py +42 -0
  833. offload/engine/harvest_known/textscan.py +107 -0
  834. offload/engine/hdrwrap.py +42 -0
  835. offload/engine/hecbench.py +568 -0
  836. offload/engine/hecbench_report.py +265 -0
  837. offload/engine/hecbench_run.py +483 -0
  838. offload/engine/idioms.py +1427 -0
  839. offload/engine/kbody_cites.py +81 -0
  840. offload/engine/kbody_emit.py +949 -0
  841. offload/engine/kbody_gen.py +795 -0
  842. offload/engine/legality_review.py +236 -0
  843. offload/engine/localcfg.py +58 -0
  844. offload/engine/malloc_dd.py +267 -0
  845. offload/engine/mutate.py +1933 -0
  846. offload/engine/nested_cites.py +196 -0
  847. offload/engine/nested_emit.py +789 -0
  848. offload/engine/nested_gen.py +1721 -0
  849. offload/engine/offload_scope.py +197 -0
  850. offload/engine/ompvv.py +624 -0
  851. offload/engine/oop_gen.py +2249 -0
  852. offload/engine/prerun.py +1435 -0
  853. offload/engine/program_source.py +739 -0
  854. offload/engine/provenance.py +103 -0
  855. offload/engine/reduce.py +2098 -0
  856. offload/engine/report.py +3374 -0
  857. offload/engine/root.py +33 -0
  858. offload/engine/rules.py +4256 -0
  859. offload/engine/run_matrix.py +325 -0
  860. offload/engine/site/__init__.py +1 -0
  861. offload/engine/site/columns.py +53 -0
  862. offload/engine/site/data.py +648 -0
  863. offload/engine/site/header.py +228 -0
  864. offload/engine/site/inputs.py +115 -0
  865. offload/engine/site/matrix.py +434 -0
  866. offload/engine/site/scrub.py +294 -0
  867. offload/engine/skeleton.py +121 -0
  868. offload/engine/spec_text.py +242 -0
  869. offload/engine/stress.py +4122 -0
  870. offload/engine/stress_c.py +1000 -0
  871. offload/engine/stress_exec.py +805 -0
  872. offload/engine/stress_min.py +248 -0
  873. offload/engine/stress_report.py +552 -0
  874. offload/engine/textclean.py +97 -0
  875. offload/engine/toolchains.py +1070 -0
  876. offload/engine/transforms.py +511 -0
  877. offload/engine/usage.py +1252 -0
  878. offload/engine/widen.py +673 -0
  879. offload/engine/widen_progs.py +2396 -0
  880. offload/issues.py +146 -0
  881. offtarget-0.1.0.dist-info/METADATA +86 -0
  882. offtarget-0.1.0.dist-info/RECORD +886 -0
  883. offtarget-0.1.0.dist-info/WHEEL +4 -0
  884. offtarget-0.1.0.dist-info/entry_points.txt +2 -0
  885. offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
  886. offtarget-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +20 -0
@@ -0,0 +1,2396 @@
1
+ """The specs of the widened catalog (offload.engine.widen).
2
+
3
+ Fortran specs (``F_SPECS``) are rendered for OpenMP 5.2 and, where the
4
+ feature applies, OpenACC 3.4 through the macros of ``offload.engine.widen.
5
+ expand``; C specs (``C_SPECS``) are OpenMP 5.2 C11 programs. Order: base
6
+ features (Fortran, then C), directives outside the slice, forms, pairs.
7
+
8
+ Every program is race free and its result does not depend on the number
9
+ of threads, teams or gangs, so sequential elision gives the value OpenMP /
10
+ OpenACC execution must give (offload.engine.widen: the expected value's second
11
+ source); the few that read a runtime value or depend on the device's
12
+ arithmetic say why (``elision``). Arrays are ``a(i) = i`` (input), ``b``
13
+ (output), ``ref`` (the host reference); the check is ``all(b == ref)``
14
+ unless the spec says otherwise.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ from offload.engine.widen import CSpec, FSpec
19
+
20
+ # --- spec text cited by the programs --------------------------------------------------
21
+
22
+ OMP_F08 = ("OpenMP 5.2 §1.7, pp.34-35: Fortran 2008 is a normative base "
23
+ "language (the Fortran 2018 features whose use is unspecified are "
24
+ "listed there; this is not one of them)")
25
+ ACC_F08 = ("OpenACC 3.4 §1.8, p.15: Fortran 2008 is a normative base "
26
+ "language (the features whose use is unspecified are listed "
27
+ "there; this is not one of them)")
28
+ OMP_IMPLICIT = ("OpenMP 5.2 §13.8, p.284: a procedure referenced in a "
29
+ "target construct is treated as if it appeared in an enter "
30
+ "clause on a declare target directive")
31
+ ACC_IMPLICIT = ("OpenACC 3.4 §2.15.1, p.91: a procedure called in a "
32
+ "compute region gets an implicit routine seq directive")
33
+ OMP_C11 = ("OpenMP 5.2 §1.7, p.34: C11 is a normative base language")
34
+ OMP_OPTIONAL = ("OpenMP 5.2 §3.2.1, p.61: a list item that is an absent "
35
+ "optional dummy is ignored, and the data-sharing and "
36
+ "data-mapping rules of an absent optional referenced in a "
37
+ "construct are ignored")
38
+ ACC_OPTIONAL = ("OpenACC 3.4 §2.17.1, p.101: Fortran optional arguments in "
39
+ "data clauses and compute regions")
40
+ OMP_STOP = ("OpenMP 5.2 §4.3, p.75: a structured block may contain STOP or "
41
+ "ERROR STOP statements")
42
+ OMP_BLOCK_PRIV = ("OpenMP 5.2 §5.1.1, p.96: variables declared within a "
43
+ "BLOCK construct inside a construct (without SAVE) are "
44
+ "private")
45
+ OMP_COMMON = ("OpenMP 5.2 §3.2.1, p.61 and §7.8.1: a common block name "
46
+ "between slashes is a declare target list item")
47
+ ACC_COMMON = ("OpenACC 3.4 §2.13 (declare directive): a var may be the "
48
+ "name of a Fortran common block between slashes")
49
+ OMP_DEFAULT_MAPPER = ("OpenMP 5.2 §5.8.3, p.150: the predefined default "
50
+ "mapper of a derived type maps its allocatable "
51
+ "components that are not explicit list items")
52
+ ACC_DEEP = ("OpenACC 3.4 §2.7.1, p.49 and §2.6.8, p.47: members of "
53
+ "derived type variables may appear in data clauses; the data of "
54
+ "an allocatable or pointer member is copied when the member "
55
+ "appears, and the device pointer is attached")
56
+ OMP_STATIC_IN_ROUTINE = ("OpenMP 5.2 §7.8, p.203: a variable with static "
57
+ "storage duration declared in a device routine is "
58
+ "treated as if it appeared in an enter clause on "
59
+ "a declare target directive")
60
+ OMP_FPTR = ("OpenMP 5.2 §13.8, p.286: a program may rely on a function "
61
+ "address in a target region for assignments, comparisons to "
62
+ "zero and indirect calls")
63
+ OMP_CRITICAL = ("OpenMP 5.2 §15.2, p.316 (critical construct); its binding "
64
+ "thread set is the contention group, so a target parallel "
65
+ "region (one team) is used")
66
+ OMP_SECTIONS = "OpenMP 5.2 §11.3, p.226 (sections construct)"
67
+ OMP_ATOMIC = "OpenMP 5.2 §15.8.4, p.325 (atomic construct)"
68
+ OMP_MAPPER = ("OpenMP 5.2 §5.8.8, p.164 (declare mapper directive): a "
69
+ "map clause on a list item of the mapper's type applies the "
70
+ "mapper")
71
+ OMP_DEFAULTMAP_TWO = ("OpenMP 5.2 §5.8.7, p.161: a given variable-category "
72
+ "may be specified in at most one defaultmap clause on "
73
+ "a construct (two categories, two clauses: legal)")
74
+
75
+
76
+ def ploop(body: str, clauses: str = "to(a) from(b) tofrom(host_flag)",
77
+ var: str = "i", flag: bool = True) -> str:
78
+ """A @PLOOP kernel over 1..n with the host flag set by iteration 1."""
79
+ inner = "\n".join(" " + ln if ln.strip() else ln
80
+ for ln in body.strip("\n").splitlines())
81
+ hf = f"\n if ({var} == 1) @HOSTFLAG" if flag else ""
82
+ return (f" @PLOOP {clauses}\n do {var} = 1, n\n{inner}{hf}\n"
83
+ " end do\n @END_PLOOP\n")
84
+
85
+
86
+ def region(body: str, clauses: str = "to(a) from(b) tofrom(host_flag)"
87
+ ) -> str:
88
+ inner = "\n".join(" " + ln if ln.strip() else ln
89
+ for ln in body.strip("\n").splitlines())
90
+ return f" @REGION {clauses}\n @HOSTFLAG\n{inner}\n @END_REGION\n"
91
+
92
+
93
+ def module(body: str, name: str = "wmod") -> str:
94
+ return f"module {name}\n implicit none\n{body.rstrip()}\nend module {name}\n"
95
+
96
+
97
+ W2 = ("b(i) = 2*a(i) + 1", "b(i) = 2*a(i)") # the usual mutant edit
98
+
99
+ # --- base-language features in device code: Fortran --------------------------------
100
+
101
+ _OPT_WORK = """\
102
+ subroutine work(x, y, hf, c)
103
+ integer, intent(in) :: x(n)
104
+ integer, intent(inout) :: y(n)
105
+ integer, intent(inout) :: hf
106
+ integer, intent(in), optional :: c(n)
107
+ integer :: k
108
+ @PLOOP to(x) tofrom(y, hf)
109
+ do k = 1, n
110
+ if (present(c)) then
111
+ y(k) = x(k) + c(k)
112
+ else
113
+ y(k) = 2*x(k) + 1
114
+ end if
115
+ if (k == 1) @HOSTFLAG[hf]
116
+ end do
117
+ @END_PLOOP
118
+ end subroutine work
119
+ """
120
+
121
+ _TYPES_ALLOC = module("""\
122
+ type rec_t
123
+ integer, allocatable :: v(:)
124
+ end type rec_t""", "wtypes")
125
+
126
+ _TYPES_PTR = module("""\
127
+ type prec_t
128
+ integer, pointer :: p(:) => null()
129
+ end type prec_t""", "wtypes")
130
+
131
+ _TYPES_PT = module("""\
132
+ type pt_t
133
+ integer :: x
134
+ integer :: y
135
+ end type pt_t
136
+ type par_t
137
+ integer :: k
138
+ integer :: m
139
+ end type par_t""", "wtypes")
140
+
141
+ _TYPES_NEST = module("""\
142
+ type in_t
143
+ integer :: k
144
+ end type in_t
145
+ type out_t
146
+ type(in_t) :: inner
147
+ integer :: w(4)
148
+ end type out_t""", "wtypes")
149
+
150
+ _ROUTINE_TW = module("""\
151
+ contains
152
+ integer function tw(x)
153
+ @ROUTINE
154
+ integer, intent(in) :: x
155
+ tw = 2*x + 1
156
+ end function tw""")
157
+
158
+ _PRIV_T = " integer :: t(4)\n"
159
+
160
+ F_BASE = [
161
+ FSpec("optional-absent", "base.device.optional_absent",
162
+ "an absent OPTIONAL dummy array referenced with PRESENT() in a "
163
+ "target region of the procedure", OMP_OPTIONAL,
164
+ " call work(a, b, host_flag)\n", contains=_OPT_WORK,
165
+ mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),),
166
+ spec_acc=ACC_OPTIONAL),
167
+ FSpec("optional-present", "base.device.optional_present",
168
+ "a present OPTIONAL dummy array referenced (PRESENT() true) in a "
169
+ "target region of the procedure", OMP_OPTIONAL,
170
+ " call work(a, b, host_flag, c)\n", ref="4*i",
171
+ decls=" integer :: c(n)\n", init=" c = 3*a\n",
172
+ contains=_OPT_WORK,
173
+ mutant=(("y(k) = x(k) + c(k)", "y(k) = x(k)"),),
174
+ spec_acc=ACC_OPTIONAL),
175
+ FSpec("optional-device-routine", "base.device.optional_routine",
176
+ "a device routine with an OPTIONAL scalar dummy, called with and "
177
+ "without it", OMP_IMPLICIT + "; " + OMP_OPTIONAL,
178
+ ploop("b(i) = addopt(a(i)) + addopt(a(i), 1)"),
179
+ modules=module("""\
180
+ contains
181
+ integer function addopt(x, y)
182
+ @ROUTINE
183
+ integer, intent(in) :: x
184
+ integer, intent(in), optional :: y
185
+ if (present(y)) then
186
+ addopt = x + y
187
+ else
188
+ addopt = x
189
+ end if
190
+ end function addopt"""), uses=" use wmod\n",
191
+ mutant=(("addopt = x + y", "addopt = x"),), spec_acc=ACC_OPTIONAL),
192
+ FSpec("block", "base.device.block",
193
+ "a BLOCK construct with a local variable inside a target loop",
194
+ OMP_BLOCK_PRIV, ploop("""\
195
+ block
196
+ integer :: t
197
+ t = 2*a(i)
198
+ b(i) = t + 1
199
+ end block"""), mutant=(("b(i) = t + 1", "b(i) = t"),), spec_acc=ACC_F08),
200
+ FSpec("stop-unreached", "base.device.stop",
201
+ "a STOP statement in device code that is not executed",
202
+ OMP_STOP, ploop("if (a(i) < 0) stop 1\nb(i) = 2*a(i) + 1"),
203
+ mutant=(W2,), spec_acc=ACC_F08),
204
+ FSpec("error-stop-unreached", "base.device.error_stop",
205
+ "an ERROR STOP statement in device code that is not executed",
206
+ OMP_STOP, ploop("if (a(i) < 0) error stop 2\nb(i) = 2*a(i) + 1"),
207
+ mutant=(W2,), spec_acc=ACC_F08),
208
+ FSpec("common-block", "base.device.common_block",
209
+ "a named COMMON block made device data (declare target / acc "
210
+ "declare create), updated from the host and read in a target loop",
211
+ OMP_COMMON,
212
+ " @UPD_TO(cb)\n" + ploop("b(i) = cb(i) + 1",
213
+ "from(b) tofrom(host_flag)"),
214
+ ref="3*i + 1",
215
+ decls=" integer :: cb(n)\n common /wblk/ cb\n @DECLVAR(/wblk/)\n",
216
+ init=" cb = 3*a\n",
217
+ mutant=(("b(i) = cb(i) + 1", "b(i) = 1"),), spec_acc=ACC_COMMON),
218
+ FSpec("alloc-component", "base.device.alloc_component",
219
+ "an allocatable component of a derived type mapped explicitly "
220
+ "and read on the device",
221
+ "OpenMP 5.2 §5.8.3, p.150: a structure element may be a map "
222
+ "list item; " + OMP_DEFAULT_MAPPER,
223
+ ploop("b(i) = r%v(i) + 1", "to(r%v) from(b) tofrom(host_flag)"),
224
+ ref="3*i + 1", modules=_TYPES_ALLOC, uses=" use wtypes\n",
225
+ decls=" type(rec_t) :: r\n",
226
+ init=" allocate(r%v(n))\n r%v = 3*a\n",
227
+ acc={"kernel": " @ENTER to(r)\n @ENTER to(r%v)\n" + ploop(
228
+ "b(i) = r%v(i) + 1", "present(r) from(b) tofrom(host_flag)")
229
+ + " @EXIT delete(r%v)\n @EXIT delete(r)\n"},
230
+ mutant=(("b(i) = r%v(i) + 1", "b(i) = 1"),), spec_acc=ACC_DEEP),
231
+ FSpec("alloc-component-whole", "base.device.alloc_component_whole",
232
+ "a derived type with an allocated allocatable component mapped "
233
+ "as a whole (the default mapper maps the component)",
234
+ OMP_DEFAULT_MAPPER,
235
+ ploop("b(i) = r%v(i) + 1", "to(r) from(b) tofrom(host_flag)"),
236
+ ref="3*i + 1", modules=_TYPES_ALLOC, uses=" use wtypes\n",
237
+ decls=" type(rec_t) :: r\n",
238
+ init=" allocate(r%v(n))\n r%v = 3*a\n", models=("omp",),
239
+ mutant=(("b(i) = r%v(i) + 1", "b(i) = 1"),)),
240
+ FSpec("pointer-component", "base.device.pointer_component",
241
+ "a POINTER component of a derived type mapped explicitly (its "
242
+ "target is mapped and attached) and read on the device",
243
+ "OpenMP 5.2 §5.8.3, p.151: an associated pointer list item "
244
+ "maps its pointer target",
245
+ ploop("b(i) = r%p(i) + 1", "to(r%p) from(b) tofrom(host_flag)"),
246
+ ref="3*i + 1", modules=_TYPES_PTR, uses=" use wtypes\n",
247
+ decls=" type(prec_t) :: r\n",
248
+ init=" allocate(r%p(n))\n r%p = 3*a\n",
249
+ acc={"kernel": " @ENTER to(r)\n @ENTER to(r%p)\n" + ploop(
250
+ "b(i) = r%p(i) + 1", "present(r) from(b) tofrom(host_flag)")
251
+ + " @EXIT delete(r%p)\n @EXIT delete(r)\n"},
252
+ mutant=(("b(i) = r%p(i) + 1", "b(i) = 1"),), spec_acc=ACC_DEEP),
253
+ FSpec("derived-type-array", "base.device.derived_array",
254
+ "an array of a derived type mapped and its components read on the "
255
+ "device", OMP_F08,
256
+ ploop("b(i) = ps(i)%x + 2*ps(i)%y", "to(ps) from(b) tofrom(host_flag)"),
257
+ ref="5*i", modules=_TYPES_PT, uses=" use wtypes\n",
258
+ decls=" type(pt_t) :: ps(n)\n",
259
+ init=" do i = 1, n\n ps(i)%x = i\n ps(i)%y = 2*i\n end do\n",
260
+ mutant=(("b(i) = ps(i)%x + 2*ps(i)%y", "b(i) = ps(i)%x"),),
261
+ spec_acc=ACC_F08),
262
+ FSpec("derived-scalar", "base.device.derived_scalar",
263
+ "a scalar of a derived type with integer components mapped and "
264
+ "read on the device", OMP_F08,
265
+ ploop("b(i) = s%k*a(i) + s%m", "to(s) from(b) tofrom(host_flag)"),
266
+ ref="3*i + 1", modules=_TYPES_PT, uses=" use wtypes\n",
267
+ decls=" type(par_t) :: s\n", init=" s%k = 3\n s%m = 1\n",
268
+ mutant=(("b(i) = s%k*a(i) + s%m", "b(i) = s%k*a(i)"),),
269
+ spec_acc=ACC_F08),
270
+ FSpec("nested-derived-type", "base.device.nested_type",
271
+ "a derived type with a derived-type component and an array "
272
+ "component, mapped and read on the device", OMP_F08,
273
+ ploop("b(i) = o%inner%k*a(i) + o%w(mod(i, 4) + 1)",
274
+ "to(o) from(b) tofrom(host_flag)"),
275
+ ref="3*i + mod(i, 4) + 1", modules=_TYPES_NEST,
276
+ uses=" use wtypes\n", decls=" type(out_t) :: o\n",
277
+ init=" o%inner%k = 3\n o%w = [1, 2, 3, 4]\n",
278
+ mutant=((" + o%w(mod(i, 4) + 1)", ""),), spec_acc=ACC_F08),
279
+ FSpec("derived-assignment", "base.device.derived_assign",
280
+ "intrinsic assignment of a whole derived-type value to a private "
281
+ "variable in device code", OMP_F08,
282
+ ploop("t = s\nt%m = t%m + a(i)\nb(i) = t%k*a(i) + t%m",
283
+ "to(s) from(b) tofrom(host_flag) private(t)"),
284
+ ref="4*i + 1", modules=_TYPES_PT, uses=" use wtypes\n",
285
+ decls=" type(par_t) :: s, t\n", init=" s%k = 3\n s%m = 1\n",
286
+ mutant=((" t = s\n", " t = par_t(0, 0)\n"),),
287
+ spec_acc=ACC_F08),
288
+ FSpec("assumed-shape-dummy", "base.device.assumed_shape_routine",
289
+ "a device routine with assumed-shape dummy arrays (SIZE of the "
290
+ "dummy on the device)", OMP_IMPLICIT,
291
+ region("call dbl(a, b)"), modules=module("""\
292
+ contains
293
+ subroutine dbl(x, y)
294
+ @ROUTINE
295
+ integer, intent(in) :: x(:)
296
+ integer, intent(out) :: y(:)
297
+ integer :: k
298
+ do k = 1, size(x)
299
+ y(k) = 2*x(k) + 1
300
+ end do
301
+ end subroutine dbl"""), uses=" use wmod\n",
302
+ mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),),
303
+ spec_acc=ACC_F08),
304
+ FSpec("assumed-size-dummy", "base.device.assumed_size_routine",
305
+ "a device routine with assumed-size dummy arrays", OMP_IMPLICIT,
306
+ region("call dbl(a, b, n)"), modules=module("""\
307
+ contains
308
+ subroutine dbl(x, y, m)
309
+ @ROUTINE
310
+ integer, intent(in) :: m
311
+ integer, intent(in) :: x(*)
312
+ integer, intent(inout) :: y(*)
313
+ integer :: k
314
+ do k = 1, m
315
+ y(k) = 2*x(k) + 1
316
+ end do
317
+ end subroutine dbl"""), uses=" use wmod\n",
318
+ mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),),
319
+ spec_acc=ACC_F08),
320
+ FSpec("assumed-shape-in-target", "base.device.assumed_shape_target",
321
+ "a target region in a procedure whose assumed-shape dummy arrays "
322
+ "are mapped", OMP_F08,
323
+ " call work(a, b, host_flag)\n", contains="""\
324
+ subroutine work(x, y, hf)
325
+ integer, intent(in) :: x(:)
326
+ integer, intent(inout) :: y(:)
327
+ integer, intent(inout) :: hf
328
+ integer :: k
329
+ @PLOOP to(x) tofrom(y, hf)
330
+ do k = 1, size(x)
331
+ y(k) = 2*x(k) + 1
332
+ if (k == 1) @HOSTFLAG[hf]
333
+ end do
334
+ @END_PLOOP
335
+ end subroutine work
336
+ """, mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),), spec_acc=ACC_F08),
337
+ FSpec("internal-procedure", "base.device.internal_procedure",
338
+ "an internal function of the program (no host-associated "
339
+ "variable) called in a target loop",
340
+ OMP_IMPLICIT + "; p.284: only references to host-associated "
341
+ "variables are unspecified", ploop("b(i) = tw(a(i))"),
342
+ contains="""\
343
+ integer function tw(x)
344
+ integer, intent(in) :: x
345
+ tw = 2*x + 1
346
+ end function tw
347
+ """, mutant=(("tw = 2*x + 1", "tw = 2*x"),), spec_acc=ACC_IMPLICIT),
348
+ FSpec("implicit-routine", "base.device.implicit_routine",
349
+ "a module function without a declare target / routine directive "
350
+ "called in a target loop (implicitly a device routine)",
351
+ OMP_IMPLICIT, ploop("b(i) = tw(a(i))"), modules=module("""\
352
+ contains
353
+ integer function tw(x)
354
+ integer, intent(in) :: x
355
+ tw = 2*x + 1
356
+ end function tw"""), uses=" use wmod\n",
357
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),), spec_acc=ACC_IMPLICIT),
358
+ FSpec("routine-call", "base.device.routine_call",
359
+ "a module function with declare target / routine seq called in a "
360
+ "target loop", OMP_IMPLICIT, ploop("b(i) = tw(a(i))"),
361
+ modules=_ROUTINE_TW, uses=" use wmod\n",
362
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),),
363
+ spec_acc="OpenACC 3.4 §2.15.1, p.91 (routine directive)"),
364
+ FSpec("module-variable-routine", "base.device.module_variable",
365
+ "a module array made device data, updated from the host and read "
366
+ "by a device routine", "OpenMP 5.2 \u00a77.8.1 (declare target): a "
367
+ "module variable may be a declare target list item",
368
+ " @UPD_TO(mtab)\n" + ploop("b(i) = getm(a(i)) + 1",
369
+ "from(b) tofrom(host_flag)"),
370
+ ref="3*i + 1", modules=module("""\
371
+ integer :: mtab(64)
372
+ @DECLVAR(mtab)
373
+ contains
374
+ integer function getm(k)
375
+ @ROUTINE
376
+ integer, intent(in) :: k
377
+ getm = mtab(k)
378
+ end function getm"""), uses=" use wmod\n", init=" mtab = 3*a\n",
379
+ mutant=(("getm = mtab(k)", "getm = 0"),),
380
+ spec_acc="OpenACC 3.4 §2.13 (declare create in a module)"),
381
+ FSpec("elemental-routine", "base.device.elemental",
382
+ "an ELEMENTAL device function applied to an array section in a "
383
+ "target region", OMP_IMPLICIT, region("b(1:n) = tw(a(1:n))"),
384
+ modules=module("""\
385
+ contains
386
+ elemental integer function tw(x)
387
+ @ROUTINE
388
+ integer, intent(in) :: x
389
+ tw = 2*x + 1
390
+ end function tw"""), uses=" use wmod\n",
391
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),), spec_acc=ACC_F08),
392
+ FSpec("pure-routine", "base.device.pure",
393
+ "a PURE device function called in a target loop", OMP_IMPLICIT,
394
+ ploop("b(i) = tw(a(i))"), modules=module("""\
395
+ contains
396
+ pure integer function tw(x)
397
+ @ROUTINE
398
+ integer, intent(in) :: x
399
+ tw = 2*x + 1
400
+ end function tw"""), uses=" use wmod\n",
401
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),), spec_acc=ACC_F08),
402
+ FSpec("recursive-routine", "base.device.recursion",
403
+ "a RECURSIVE device function", OMP_IMPLICIT,
404
+ ploop("b(i) = sumto(mod(a(i), 8))"), ref="mod(i, 8)*(mod(i, 8) + 1)/2",
405
+ modules=module("""\
406
+ contains
407
+ recursive function sumto(k) result(r)
408
+ @ROUTINE
409
+ integer, intent(in) :: k
410
+ integer :: r
411
+ if (k <= 0) then
412
+ r = 0
413
+ else
414
+ r = k + sumto(k - 1)
415
+ end if
416
+ end function sumto"""), uses=" use wmod\n",
417
+ mutant=(("r = k + sumto(k - 1)", "r = k"),), spec_acc=ACC_F08),
418
+ FSpec("generic-interface", "base.device.generic_interface",
419
+ "a generic interface with integer and real(8) specifics resolved "
420
+ "in device code", OMP_IMPLICIT,
421
+ ploop("b(i) = twice(a(i)) + int(twice(real(a(i), 8)))"),
422
+ ref="4*i + 1", modules=module("""\
423
+ interface twice
424
+ module procedure twice_i, twice_r
425
+ end interface twice
426
+ contains
427
+ integer function twice_i(x)
428
+ @ROUTINE
429
+ integer, intent(in) :: x
430
+ twice_i = 2*x + 1
431
+ end function twice_i
432
+ real(8) function twice_r(x)
433
+ @ROUTINE
434
+ real(8), intent(in) :: x
435
+ twice_r = 2.0d0*x
436
+ end function twice_r"""), uses=" use wmod\n",
437
+ mutant=(("twice_i = 2*x + 1", "twice_i = 2*x"),),
438
+ spec_acc=ACC_F08),
439
+ FSpec("type-bound-nopass", "base.device.type_bound_nopass",
440
+ "a NOPASS type-bound procedure called through a mapped object in "
441
+ "device code", OMP_F08,
442
+ ploop("b(i) = op%tw(a(i))", "to(a, op) from(b) tofrom(host_flag)"),
443
+ modules=module("""\
444
+ type op_t
445
+ integer :: k = 0
446
+ contains
447
+ procedure, nopass :: tw => tw_impl
448
+ end type op_t
449
+ contains
450
+ integer function tw_impl(x)
451
+ @ROUTINE
452
+ integer, intent(in) :: x
453
+ tw_impl = 2*x + 1
454
+ end function tw_impl"""), uses=" use wmod\n", decls=" type(op_t) :: op\n",
455
+ mutant=(("tw_impl = 2*x + 1", "tw_impl = 2*x"),),
456
+ spec_acc=ACC_F08),
457
+ FSpec("type-bound-pass", "base.device.type_bound_pass",
458
+ "a type-bound procedure with a CLASS passed-object dummy called "
459
+ "through a mapped object in device code", OMP_F08,
460
+ ploop("b(i) = op%scaled(a(i))", "to(a, op) from(b) tofrom(host_flag)"),
461
+ modules=module("""\
462
+ type op_t
463
+ integer :: k = 2
464
+ contains
465
+ procedure :: scaled => scaled_impl
466
+ end type op_t
467
+ contains
468
+ integer function scaled_impl(self, x)
469
+ @ROUTINE
470
+ class(op_t), intent(in) :: self
471
+ integer, intent(in) :: x
472
+ scaled_impl = self%k*x + 1
473
+ end function scaled_impl"""), uses=" use wmod\n", decls=" type(op_t) :: op\n",
474
+ mutant=(("scaled_impl = self%k*x + 1", "scaled_impl = self%k*x"),),
475
+ spec_acc=ACC_F08),
476
+ FSpec("intrinsic-sum", "base.device.intrinsic_sum",
477
+ "SUM of an array section in device code", OMP_F08,
478
+ ploop("b(i) = sum(a(1:i))"), ref="i*(i + 1)/2",
479
+ mutant=(("sum(a(1:i))", "a(i)"),), spec_acc=ACC_F08),
480
+ FSpec("intrinsic-maxval-minval", "base.device.intrinsic_maxval",
481
+ "MAXVAL and MINVAL of array sections in device code", OMP_F08,
482
+ ploop("b(i) = maxval(a(1:i)) + minval(a(i:n))"), ref="2*i",
483
+ mutant=((" + minval(a(i:n))", ""),), spec_acc=ACC_F08),
484
+ FSpec("intrinsic-maxloc-minloc", "base.device.intrinsic_maxloc",
485
+ "MAXLOC and MINLOC (DIM=1) of array sections in device code",
486
+ OMP_F08,
487
+ ploop("b(i) = maxloc(a(1:i), dim=1) + minloc(a(i:n), dim=1)"),
488
+ ref="i + 1",
489
+ mutant=((" + minloc(a(i:n), dim=1)", ""),), spec_acc=ACC_F08),
490
+ FSpec("intrinsic-count-any-all", "base.device.intrinsic_count",
491
+ "COUNT, ANY and ALL of masks in device code", OMP_F08,
492
+ ploop("b(i) = count(a(1:i) > i/2) + merge(1, 0, any(a(1:i) == i)) "
493
+ "+ merge(1, 0, all(a(1:i) <= i))"), ref="i - i/2 + 2",
494
+ mutant=(("count(a(1:i) > i/2)", "i"),), spec_acc=ACC_F08),
495
+ FSpec("intrinsic-dot-product", "base.device.intrinsic_dot_product",
496
+ "DOT_PRODUCT of array sections in device code", OMP_F08,
497
+ ploop("b(i) = dot_product(a(1:mod(i, 4) + 1), a(1:mod(i, 4) + 1))"),
498
+ ref="(mod(i, 4) + 1)*(mod(i, 4) + 2)*(2*mod(i, 4) + 3)/6",
499
+ mutant=(("dot_product(a(1:mod(i, 4) + 1), a(1:mod(i, 4) + 1))",
500
+ "sum(a(1:mod(i, 4) + 1))"),), spec_acc=ACC_F08),
501
+ FSpec("intrinsic-matmul", "base.device.intrinsic_matmul",
502
+ "MATMUL of two integer matrices in a target region", OMP_F08,
503
+ region("m3 = matmul(m1, m2)",
504
+ "to(m1, m2) from(m3) tofrom(host_flag)"),
505
+ check="all(m3 == r3)",
506
+ decls=" integer :: m1(4, 4), m2(4, 4), m3(4, 4), r3(4, 4)\n"
507
+ " integer :: j, k, l\n",
508
+ init="""\
509
+ do k = 1, 4
510
+ do j = 1, 4
511
+ m1(j, k) = j + k
512
+ m2(j, k) = j - k + 5
513
+ m3(j, k) = 0
514
+ end do
515
+ end do
516
+ do k = 1, 4
517
+ do j = 1, 4
518
+ r3(j, k) = 0
519
+ do l = 1, 4
520
+ r3(j, k) = r3(j, k) + m1(j, l)*m2(l, k)
521
+ end do
522
+ end do
523
+ end do
524
+ """, mutant=(("m3 = matmul(m1, m2)", "m3 = m1"),), spec_acc=ACC_F08),
525
+ FSpec("intrinsic-transpose-reshape", "base.device.intrinsic_reshape",
526
+ "TRANSPOSE of a RESHAPE of an array section in a target region",
527
+ OMP_F08,
528
+ region("m3 = transpose(reshape(a(1:16), [4, 4]))",
529
+ "to(a) from(m3) tofrom(host_flag)"),
530
+ check="all(m3 == r3)",
531
+ decls=" integer :: m3(4, 4), r3(4, 4)\n integer :: j, k\n",
532
+ init="""\
533
+ do k = 1, 4
534
+ do j = 1, 4
535
+ r3(j, k) = k + 4*(j - 1)
536
+ m3(j, k) = 0
537
+ end do
538
+ end do
539
+ """, mutant=(("m3 = transpose(reshape(a(1:16), [4, 4]))",
540
+ "m3 = reshape(a(1:16), [4, 4])"),), spec_acc=ACC_F08),
541
+ FSpec("intrinsic-transcendental", "base.device.intrinsic_math",
542
+ "EXP, LOG, SIN and COS of real(8) values in device code (checked "
543
+ "to 1e-9)", OMP_F08,
544
+ ploop("x(i) = exp(log(real(a(i), 8))) + sin(real(a(i), 8))**2 + "
545
+ "cos(real(a(i), 8))**2", "to(a) from(x) tofrom(host_flag)"),
546
+ check="all(abs(x - (real(a, 8) + 1.0d0)) < 1.0d-9)",
547
+ decls=" real(8) :: x(n)\n", init=" x = 0.0d0\n",
548
+ mutant=((" + cos(real(a(i), 8))**2", ""),), spec_acc=ACC_F08),
549
+ FSpec("intrinsic-modulo-int8", "base.device.intrinsic_modulo_int8",
550
+ "MODULO of INTEGER(8) values (negative and positive) in device "
551
+ "code", OMP_F08,
552
+ ploop("q8(i) = modulo(p8(i), 7_8)", "to(p8) from(q8) tofrom(host_flag)"),
553
+ check="all(q8 == r8)",
554
+ decls=" integer(8) :: p8(n), q8(n), r8(n)\n",
555
+ init="""\
556
+ do i = 1, n
557
+ p8(i) = int(i, 8)*1000000007_8 - 30000000000_8
558
+ q8(i) = 0_8
559
+ r8(i) = mod(p8(i), 7_8)
560
+ if (r8(i) < 0_8) r8(i) = r8(i) + 7_8
561
+ end do
562
+ """, mutant=(("modulo(p8(i), 7_8)", "mod(p8(i), 7_8)"),), spec_acc=ACC_F08),
563
+ FSpec("intrinsic-bits", "base.device.intrinsic_bits",
564
+ "POPCNT, IAND and ISHFT in device code", OMP_F08,
565
+ ploop("b(i) = popcnt(a(i)) + iand(a(i), 3) + ishft(a(i), 1)"),
566
+ ref="popcnt(i) + iand(i, 3) + ishft(i, 1)",
567
+ mutant=((" + iand(a(i), 3)", ""),), spec_acc=ACC_F08),
568
+ FSpec("intrinsic-conversions", "base.device.intrinsic_conversion",
569
+ "NINT, FLOOR and CEILING of real(8) and real(4) quotients in "
570
+ "device code", OMP_F08,
571
+ ploop("b(i) = nint(real(a(i), 8)/4.0d0) + floor(real(a(i), 8)/3.0d0)"
572
+ " + ceiling(real(a(i))/5.0)"),
573
+ ref="nint(real(i, 8)/4.0d0) + floor(real(i, 8)/3.0d0) + "
574
+ "ceiling(real(i)/5.0)",
575
+ mutant=(("b(i) = nint(", "b(i) = int("),), spec_acc=ACC_F08),
576
+ FSpec("array-syntax", "base.device.array_syntax",
577
+ "whole-array and section assignment in a target region", OMP_F08,
578
+ region("b(:) = 2*a(:) + 1\nb(1:4) = b(4:1:-1) - b(4:1:-1) + b(1:4)"),
579
+ mutant=(("b(:) = 2*a(:) + 1", "b(:) = 2*a(:)"),), spec_acc=ACC_F08),
580
+ FSpec("where", "base.device.where",
581
+ "a WHERE construct with ELSEWHERE in a target region", OMP_F08,
582
+ region("where (a > n/2)\n b = 2*a + 1\nelsewhere\n b = a\nend where"),
583
+ ref="merge(2*i + 1, i, i > n/2)",
584
+ mutant=((" b = a\n", " b = 0\n"),), spec_acc=ACC_F08),
585
+ FSpec("do-concurrent-in-region", "base.device.do_concurrent",
586
+ "a DO CONCURRENT loop (no loop directive) in a target region",
587
+ OMP_F08, region("do concurrent (j = 1:n)\n b(j) = 2*a(j) + 1\nend do"),
588
+ decls=" integer :: j\n",
589
+ mutant=(("b(j) = 2*a(j) + 1", "b(j) = 2*a(j)"),), spec_acc=ACC_F08),
590
+ FSpec("select-case", "base.device.select_case",
591
+ "a SELECT CASE construct in device code", OMP_F08, ploop("""\
592
+ select case (mod(a(i), 3))
593
+ case (0)
594
+ b(i) = a(i)
595
+ case (1)
596
+ b(i) = 2*a(i)
597
+ case default
598
+ b(i) = 3*a(i)
599
+ end select"""), ref="(mod(i, 3) + 1)*i",
600
+ mutant=((" b(i) = 3*a(i)\n", " b(i) = a(i)\n"),),
601
+ spec_acc=ACC_F08),
602
+ FSpec("character-local", "base.device.character",
603
+ "a private CHARACTER(len=8) variable built by concatenation and "
604
+ "searched with INDEX and LEN_TRIM in device code", OMP_F08,
605
+ ploop("s = 'abcd' // 'efgh'\nb(i) = index(s, s(mod(i, 8) + 1:mod(i, 8) "
606
+ "+ 1)) + len_trim(s)", "to(a) from(b) tofrom(host_flag) private(s)"),
607
+ ref="mod(i, 8) + 9", decls=" character(len=8) :: s\n",
608
+ mutant=((" + len_trim(s)", ""),), spec_acc=ACC_F08),
609
+ FSpec("character-mapped", "base.device.character_array",
610
+ "a mapped CHARACTER(len=4) array read with ICHAR and LEN in "
611
+ "device code", OMP_F08,
612
+ ploop("b(i) = ichar(nm(i)(1:1)) - 64 + len(nm(i))",
613
+ "to(nm) from(b) tofrom(host_flag)"),
614
+ ref="mod(i, 26) + 5", decls=" character(len=4) :: nm(n)\n",
615
+ init=" do i = 1, n\n nm(i) = achar(65 + mod(i, 26)) // 'xyz'\n"
616
+ " end do\n",
617
+ mutant=(("ichar(nm(i)(1:1)) - 64", "0"),), spec_acc=ACC_F08),
618
+ FSpec("print-in-device", "base.device.print",
619
+ "a PRINT statement executed once in device code", OMP_F08,
620
+ ploop("if (i == n) print '(a)', 'device print'\nb(i) = 2*a(i) + 1"),
621
+ mutant=(W2,), spec_acc=ACC_F08),
622
+ FSpec("allocate-in-device", "base.device.allocate",
623
+ "ALLOCATE and DEALLOCATE of a local allocatable array in a target "
624
+ "region", OMP_F08, region("""\
625
+ block
626
+ integer, allocatable :: w(:)
627
+ allocate(w(n))
628
+ w = 2*a + 1
629
+ b = w
630
+ deallocate(w)
631
+ end block"""), mutant=(("w = 2*a + 1", "w = 2*a"),), spec_acc=ACC_F08),
632
+ FSpec("allocate-derived-default-init", "base.device.allocate_derived",
633
+ "ALLOCATE of a scalar of a derived type with default "
634
+ "initialization in a target region", OMP_F08, region("""\
635
+ block
636
+ type(cfg_t), allocatable :: c
637
+ allocate(c)
638
+ b = c%k*a + c%m
639
+ deallocate(c)
640
+ end block"""), modules=module("""\
641
+ type cfg_t
642
+ integer :: k = 2
643
+ integer :: m = 1
644
+ end type cfg_t""", "wtypes"), uses=" use wtypes\n",
645
+ mutant=(("b = c%k*a + c%m", "b = c%k*a"),), spec_acc=ACC_F08),
646
+ FSpec("private-array", "base.device.private_array",
647
+ "a private local array written at constant indices in a target "
648
+ "loop", "OpenMP 5.2 §5.4.3, p.112 (private clause; an array is a "
649
+ "list item)",
650
+ ploop("t(1) = a(i)\nt(2) = 1\nt(3) = a(i)\nt(4) = 0\nb(i) = sum(t)",
651
+ "to(a) from(b) tofrom(host_flag) private(t)"),
652
+ decls=_PRIV_T, mutant=(("t(2) = 1", "t(2) = 0"),),
653
+ spec_acc="OpenACC 3.4 §2.5.14 (private clause)"),
654
+ FSpec("private-array-dynamic-index", "base.device.private_array_dynamic",
655
+ "a private 1-based local array written at a run-time index in a "
656
+ "target loop",
657
+ "OpenMP 5.2 §5.4.3, p.112 (private clause; an array is a list "
658
+ "item)",
659
+ ploop("t = 0\nt(mod(a(i), 4) + 1) = a(i)\nb(i) = sum(t) + "
660
+ "t(mod(a(i), 4) + 1)",
661
+ "to(a) from(b) tofrom(host_flag) private(t)"),
662
+ ref="2*i", decls=_PRIV_T,
663
+ mutant=(("t(mod(a(i), 4) + 1) = a(i)", "t(1) = 0"),),
664
+ spec_acc="OpenACC 3.4 §2.5.14 (private clause)"),
665
+ FSpec("private-array-dynamic-write", "base.device.private_array_dynamic_write",
666
+ "a private local array written at a run-time index that is the "
667
+ "same for every iteration (a host value) and read back at a "
668
+ "constant index in a target loop",
669
+ "OpenMP 5.2 \u00a75.4.3, p.112 (private clause; an array is a list "
670
+ "item)",
671
+ ploop("t(1) = 0\nt(2) = 0\nt(3) = 0\nt(4) = 0\nt(nd) = 5*a(i)\n"
672
+ "b(i) = t(1)", "to(a) from(b) tofrom(host_flag) private(t) "
673
+ "firstprivate(nd)"),
674
+ ref="5*i", decls=_PRIV_T + " integer :: nd\n",
675
+ init=" nd = command_argument_count() + 1\n",
676
+ mutant=(("t(nd) = 5*a(i)", "t(2) = 5*a(i)"),),
677
+ spec_acc="OpenACC 3.4 \u00a72.5.14 (private clause)"),
678
+ FSpec("save-local-routine", "base.device.save_local",
679
+ "a SAVE local variable of a device routine, updated by sequential "
680
+ "calls in one target region", OMP_STATIC_IN_ROUTINE,
681
+ region("b(1) = bump()\nb(2) = bump()\nb(3) = bump()",
682
+ "tofrom(b, host_flag)"),
683
+ check="all(b(1:3) == [1, 2, 3])", modules=module("""\
684
+ contains
685
+ integer function bump()
686
+ @ROUTINE
687
+ integer, save :: cnt = 0
688
+ cnt = cnt + 1
689
+ bump = cnt
690
+ end function bump"""), uses=" use wmod\n", models=("omp",),
691
+ mutant=(("cnt = cnt + 1", "cnt = 1"),)),
692
+ FSpec("complex-arith", "base.device.complex",
693
+ "COMPLEX(8) arithmetic in device code", OMP_F08,
694
+ ploop("z(i) = cmplx(a(i), 1, 8)*(0.0d0, 1.0d0)",
695
+ "to(a) from(z) tofrom(host_flag)"),
696
+ check="all(real(z) == -1.0d0 .and. aimag(z) == real(a, 8))",
697
+ decls=" complex(8) :: z(n)\n", init=" z = (0.0d0, 0.0d0)\n",
698
+ mutant=(("*(0.0d0, 1.0d0)", ""),), spec_acc=ACC_F08),
699
+ FSpec("exit-cycle", "base.device.exit_cycle",
700
+ "EXIT and CYCLE in a sequential loop in device code", OMP_F08,
701
+ ploop("s = 0\ndo k = 1, n\n if (k > a(i)) exit\n if (mod(k, 2) == 0) "
702
+ "cycle\n s = s + k\nend do\nb(i) = s",
703
+ "to(a) from(b) tofrom(host_flag) private(s, k)"),
704
+ ref="((i + 1)/2)**2", decls=" integer :: s, k\n",
705
+ mutant=((" if (mod(k, 2) == 0) cycle\n", ""),), spec_acc=ACC_F08),
706
+ FSpec("associate", "base.device.associate",
707
+ "an ASSOCIATE construct in device code", OMP_F08,
708
+ ploop("associate (x => a(i), y => b(i))\n y = 2*x + 1\nend associate"),
709
+ mutant=(("y = 2*x + 1", "y = 2*x"),), spec_acc=ACC_F08),
710
+ FSpec("int8-loop", "base.device.int8_index",
711
+ "an INTEGER(8) loop variable of the target loop", OMP_F08,
712
+ " @PLOOP to(a) from(b) tofrom(host_flag)\n do j8 = 1_8, int(n, 8)\n"
713
+ " b(j8) = 2*a(j8) + 1\n if (j8 == 1_8) @HOSTFLAG\n end do\n"
714
+ " @END_PLOOP\n", decls=" integer(8) :: j8\n",
715
+ mutant=(("b(j8) = 2*a(j8) + 1", "b(j8) = 2*a(j8)"),),
716
+ spec_acc=ACC_F08),
717
+ FSpec("sequence-association", "base.device.sequence_association",
718
+ "an array element passed as the actual argument of an "
719
+ "explicit-shape dummy array of a device routine (sequence "
720
+ "association)", OMP_IMPLICIT,
721
+ ploop("call rowsum(a2(1, i), 4, b(i))",
722
+ "to(a2) from(b) tofrom(host_flag)"),
723
+ ref="10*i", decls=" integer :: a2(4, n)\n integer :: k\n",
724
+ init=" do i = 1, n\n do k = 1, 4\n a2(k, i) = k*i\n end do\n"
725
+ " end do\n", modules=module("""\
726
+ contains
727
+ subroutine rowsum(x, m, s)
728
+ @ROUTINE
729
+ integer, intent(in) :: m
730
+ integer, intent(in) :: x(m)
731
+ integer, intent(out) :: s
732
+ integer :: k
733
+ s = 0
734
+ do k = 1, m
735
+ s = s + x(k)
736
+ end do
737
+ end subroutine rowsum"""), uses=" use wmod\n",
738
+ mutant=(("s = s + x(k)", "s = x(k)"),), spec_acc=ACC_F08),
739
+ FSpec("parallel-in-seq-loop", "base.device.parallel_in_seq_loop",
740
+ "a parallel do nested in a sequential DO loop of a target region",
741
+ "OpenMP 5.2 §13.8 (target) and §10.1 (parallel): a "
742
+ "parallel construct may be nested in a target region",
743
+ """\
744
+ !$omp target map(to: a) map(tofrom: b, host_flag)
745
+ @HOSTFLAG
746
+ do k = 1, 3
747
+ !$omp parallel do
748
+ do i = 1, n
749
+ b(i) = b(i) + a(i)
750
+ end do
751
+ !$omp end parallel do
752
+ end do
753
+ !$omp end target
754
+ """, ref="3*i", decls=" integer :: k\n", models=("omp",),
755
+ mutant=(("b(i) = b(i) + a(i)", "b(i) = a(i)"),)),
756
+ FSpec("host-data-generic", "base.device.host_data_generic",
757
+ "a generic interface (integer and real(8) specifics) resolved in "
758
+ "a call inside a host_data use_device region (the device address "
759
+ "is passed; the specific only takes the size)",
760
+ "OpenACC 3.4 \u00a72.8 (host_data construct: the device address of "
761
+ "a var in use_device is used within the region)", """\
762
+ !$acc data copyin(a) copyout(b) copy(host_flag)
763
+ !$acc host_data use_device(a)
764
+ m = nelem(a)
765
+ !$acc end host_data
766
+ !$acc parallel loop present(a, b, host_flag)
767
+ do i = 1, n
768
+ b(i) = 2*a(i) + m - n + 1
769
+ if (i == 1) @HOSTFLAG
770
+ end do
771
+ !$acc end data
772
+ """, decls=" integer :: m\n", modules=module("""\
773
+ interface nelem
774
+ module procedure nelem_i, nelem_r
775
+ end interface nelem
776
+ contains
777
+ integer function nelem_i(x)
778
+ integer, intent(in) :: x(:)
779
+ nelem_i = size(x)
780
+ end function nelem_i
781
+ integer function nelem_r(x)
782
+ real(8), intent(in) :: x(:)
783
+ nelem_r = size(x)
784
+ end function nelem_r"""), uses=" use wmod\n", models=("acc",),
785
+ mutant=((" m = nelem(a)\n", " m = 0\n"),)),
786
+ FSpec("loop-in-routine", "base.device.loop_in_routine",
787
+ "a loop seq construct inside a routine seq procedure called in a "
788
+ "parallel loop",
789
+ "OpenACC 3.4 §2.9 (loop construct) and §2.15.1 (routine "
790
+ "seq: a loop construct in it must be seq)",
791
+ ploop("call rowsum(a2(:, i), b(i))",
792
+ "to(a2) from(b) tofrom(host_flag)"),
793
+ ref="10*i", decls=" integer :: a2(4, n)\n integer :: k\n",
794
+ init=" do i = 1, n\n do k = 1, 4\n a2(k, i) = k*i\n end do\n"
795
+ " end do\n", modules=module("""\
796
+ contains
797
+ subroutine rowsum(x, s)
798
+ !$acc routine seq
799
+ integer, intent(in) :: x(:)
800
+ integer, intent(out) :: s
801
+ integer :: k
802
+ s = 0
803
+ !$acc loop seq
804
+ do k = 1, size(x)
805
+ s = s + x(k)
806
+ end do
807
+ end subroutine rowsum"""), uses=" use wmod\n", models=("acc",),
808
+ mutant=(("s = s + x(k)", "s = x(k)"),)),
809
+ ]
810
+
811
+ # --- directives outside the slice, in device code (OpenMP, Fortran) ----------------
812
+
813
+ _CRIT = """\
814
+ s = 0
815
+ !$omp target parallel do map(to: a) map(tofrom: s, host_flag) private(t)
816
+ do i = 1, n
817
+ !$omp critical{name}{hint}
818
+ t = s
819
+ s = t + a(i)
820
+ !$omp end critical{name}
821
+ if (i == 1) @HOSTFLAG
822
+ end do
823
+ !$omp end target parallel do
824
+ """
825
+ _SUM_CHECK = "s == n*(n + 1)/2"
826
+
827
+
828
+ def _crit(name="", hint=""):
829
+ return _CRIT.format(name=name, hint=hint)
830
+
831
+
832
+ F_DIRECTIVES = [
833
+ FSpec("critical", "omp.directive.critical",
834
+ "an unnamed critical construct in a target parallel loop",
835
+ OMP_CRITICAL, _crit(), check=_SUM_CHECK,
836
+ decls=" integer :: s, t\n", models=("omp",),
837
+ mutant_device="a race: without the construct the updates race",
838
+ mutant=((" !$omp critical\n", ""),
839
+ (" !$omp end critical\n", ""))),
840
+ FSpec("critical-named", "form.omp.critical_named",
841
+ "a named critical construct in a target parallel loop",
842
+ OMP_CRITICAL, _crit(" (wsum)"), check=_SUM_CHECK,
843
+ decls=" integer :: s, t\n", models=("omp",),
844
+ mutant_device="a race: without the construct the updates race",
845
+ mutant=((" !$omp critical (wsum)\n", ""),
846
+ (" !$omp end critical (wsum)\n", ""))),
847
+ FSpec("critical-hint", "omp.clause.hint",
848
+ "a named critical construct with a hint clause in a target "
849
+ "parallel loop", OMP_CRITICAL + "; §15.1 (hint clause)",
850
+ _crit(" (wsum)", " hint(omp_sync_hint_contended)"),
851
+ check=_SUM_CHECK, decls=" integer :: s, t\n",
852
+ uses=" use omp_lib, only: omp_sync_hint_contended\n",
853
+ models=("omp",),
854
+ mutant_device="a race: without the construct the updates race",
855
+ mutant=((" !$omp critical (wsum) hint(omp_sync_hint_contended)\n",
856
+ ""), (" !$omp end critical (wsum)\n", ""))),
857
+ FSpec("sections", "omp.directive.sections",
858
+ "a sections construct with two sections in a target parallel "
859
+ "region", OMP_SECTIONS, """\
860
+ !$omp target parallel map(to: a) map(tofrom: b, host_flag)
861
+ !$omp sections
862
+ !$omp section
863
+ do i = 1, n/2
864
+ b(i) = 2*a(i) + 1
865
+ end do
866
+ @HOSTFLAG
867
+ !$omp section
868
+ do i = n/2 + 1, n
869
+ b(i) = a(i) + a(i) + 1
870
+ end do
871
+ !$omp end sections
872
+ !$omp end target parallel
873
+ """, models=("omp",),
874
+ mutant=(("b(i) = a(i) + a(i) + 1", "b(i) = 0"),)),
875
+ FSpec("parallel-sections", "omp.directive.parallel_sections",
876
+ "a parallel sections construct nested in a target region",
877
+ OMP_SECTIONS, """\
878
+ !$omp target map(to: a) map(tofrom: b, host_flag)
879
+ @HOSTFLAG
880
+ !$omp parallel sections
881
+ !$omp section
882
+ do i = 1, n/2
883
+ b(i) = 2*a(i) + 1
884
+ end do
885
+ !$omp section
886
+ do i = n/2 + 1, n
887
+ b(i) = a(i) + a(i) + 1
888
+ end do
889
+ !$omp end parallel sections
890
+ !$omp end target
891
+ """, models=("omp",),
892
+ mutant=(("b(i) = a(i) + a(i) + 1", "b(i) = 0"),)),
893
+ FSpec("single", "omp.directive.single",
894
+ "a single construct in a target parallel region",
895
+ "OpenMP 5.2 §11.1, p.221 (single construct)", """\
896
+ s = 0
897
+ !$omp target parallel map(tofrom: s, host_flag)
898
+ !$omp single
899
+ s = s + 1
900
+ @HOSTFLAG
901
+ !$omp end single
902
+ !$omp end target parallel
903
+ """, check="s == 1", decls=" integer :: s\n", models=("omp",),
904
+ mutant=((" !$omp single\n", ""), (" !$omp end single\n", ""),
905
+ (" s = s + 1\n", " s = s + 2\n"))),
906
+ FSpec("masked", "omp.directive.masked",
907
+ "a masked construct in a target parallel region",
908
+ "OpenMP 5.2 §10.5, p.214 (masked construct)", """\
909
+ s = 0
910
+ !$omp target parallel map(tofrom: s, host_flag)
911
+ !$omp masked
912
+ s = s + 1
913
+ @HOSTFLAG
914
+ !$omp end masked
915
+ !$omp end target parallel
916
+ """, check="s == 1", decls=" integer :: s\n", models=("omp",),
917
+ mutant=((" s = s + 1\n", " s = s + 2\n"),)),
918
+ FSpec("barrier", "omp.directive.barrier",
919
+ "a barrier between a write by every thread and a read by the "
920
+ "primary thread in a target parallel region",
921
+ "OpenMP 5.2 §15.3.1, p.317 (barrier construct)", """\
922
+ okf = 0
923
+ c = 0
924
+ !$omp target parallel num_threads(4) map(tofrom: c, okf, host_flag) private(tid, nt, k)
925
+ tid = omp_get_thread_num()
926
+ nt = omp_get_num_threads()
927
+ c(tid + 1) = tid + 1
928
+ !$omp barrier
929
+ if (tid == 0) then
930
+ okf = 1
931
+ do k = 1, nt
932
+ if (c(k) /= k) okf = 0
933
+ end do
934
+ @HOSTFLAG
935
+ end if
936
+ !$omp end target parallel
937
+ """, check="okf == 1",
938
+ decls=" integer :: c(4), okf, tid, nt, k\n",
939
+ uses=" use omp_lib, only: omp_get_thread_num, omp_get_num_threads\n",
940
+ models=("omp",),
941
+ mutant=((" if (c(k) /= k) okf = 0\n", " okf = 0\n"),)),
942
+ FSpec("atomic", "omp.directive.atomic",
943
+ "an atomic construct (update form, no clause) in a target loop",
944
+ OMP_ATOMIC,
945
+ ploop("!$omp atomic\ns = s + a(i)", "to(a) tofrom(s, host_flag)"),
946
+ check=_SUM_CHECK, decls=" integer :: s\n", init=" s = 0\n",
947
+ models=("omp",), mutant=(("s = s + a(i)", "s = s + 1"),)),
948
+ FSpec("atomic-update", "omp.clause.update",
949
+ "an atomic update construct in a target loop", OMP_ATOMIC,
950
+ ploop("!$omp atomic update\ns = s + a(i)", "to(a) tofrom(s, host_flag)"),
951
+ check=_SUM_CHECK, decls=" integer :: s\n", init=" s = 0\n",
952
+ models=("omp",), mutant=(("s = s + a(i)", "s = s + 1"),)),
953
+ FSpec("atomic-capture", "omp.clause.capture",
954
+ "an atomic capture construct (each iteration takes a ticket) in a "
955
+ "target loop", OMP_ATOMIC,
956
+ ploop("!$omp atomic capture\nt = s\ns = s + 1\n!$omp end atomic\n"
957
+ "b(i) = t", "tofrom(s, b, host_flag) private(t)"),
958
+ check="s == n .and. sum(b) == n*(n - 1)/2",
959
+ decls=" integer :: s, t\n", init=" s = 0\n", models=("omp",),
960
+ mutant=((" t = s\n s = s + 1\n", " s = s + 1\n t = s\n"),)),
961
+ FSpec("atomic-write", "omp.clause.write",
962
+ "an atomic write construct in a target loop", OMP_ATOMIC,
963
+ ploop("b(i) = 2*a(i) + 1\nif (i == n) then\n !$omp atomic write\n"
964
+ " w = 7\nend if", "to(a) from(b) tofrom(w, host_flag)"),
965
+ check="all(b == ref) .and. w == 7", decls=" integer :: w\n",
966
+ init=" w = 0\n", models=("omp",),
967
+ mutant=((" w = 7\n", " w = 6\n"),)),
968
+ FSpec("atomic-read", "omp.clause.read",
969
+ "an atomic read construct in a target loop", OMP_ATOMIC,
970
+ ploop("!$omp atomic read\nt = w\nb(i) = a(i) + t",
971
+ "to(a, w) from(b) tofrom(host_flag) private(t)"),
972
+ ref="i + 7", decls=" integer :: w, t\n", init=" w = 7\n",
973
+ models=("omp",), mutant=(("b(i) = a(i) + t", "b(i) = a(i)"),)),
974
+ FSpec("ordered", "omp.directive.ordered",
975
+ "an ordered region in a target parallel do with the ordered clause",
976
+ "OpenMP 5.2 §15.10.1, p.338 (ordered construct)", """\
977
+ cnt = 0
978
+ !$omp target parallel do ordered map(to: a) map(tofrom: b, cnt, host_flag)
979
+ do i = 1, n
980
+ !$omp ordered
981
+ cnt = cnt + 1
982
+ b(cnt) = a(i)
983
+ !$omp end ordered
984
+ if (i == 1) @HOSTFLAG
985
+ end do
986
+ !$omp end target parallel do
987
+ """, ref="i", check="all(b == ref) .and. cnt == n",
988
+ decls=" integer :: cnt\n", models=("omp",),
989
+ mutant=((" b(cnt) = a(i)\n", " b(cnt) = a(n + 1 - i)\n"),)),
990
+ FSpec("task", "omp.directive.task",
991
+ "a task and a taskwait in a target region",
992
+ "OpenMP 5.2 §12.5, p.247 (task construct)", """\
993
+ s = 0
994
+ !$omp target map(tofrom: s, host_flag)
995
+ @HOSTFLAG
996
+ !$omp task shared(s)
997
+ s = s + 1
998
+ !$omp end task
999
+ !$omp taskwait
1000
+ !$omp end target
1001
+ """, check="s == 1", decls=" integer :: s\n", models=("omp",),
1002
+ mutant=((" s = s + 1\n", " s = s + 2\n"),)),
1003
+ FSpec("declare-mapper", "omp.directive.declare_mapper",
1004
+ "a default declare mapper of a derived type with a POINTER "
1005
+ "component, applied by map(to: r) in a target loop (the default "
1006
+ "mapper leaves the pointer's association undefined, the declared "
1007
+ "one maps its target)", OMP_MAPPER,
1008
+ ploop("b(i) = r%p(i) + 1", "to(r) from(b) tofrom(host_flag)"),
1009
+ ref="3*i + 1", modules=module("""\
1010
+ type prec_t
1011
+ integer :: k = 0
1012
+ integer, pointer :: p(:) => null()
1013
+ end type prec_t
1014
+ !$omp declare mapper(prec_t :: x) map(x, x%p)""", "wtypes"),
1015
+ uses=" use wtypes\n", decls=" type(prec_t) :: r\n",
1016
+ init=" allocate(r%p(n))\n r%p = 3*a\n", models=("omp",),
1017
+ mutant_device="copy semantics: without the mapper the pointer component's association on the device is undefined (OpenMP 5.2 \u00a75.8.3, p.150); under unified memory the host pointer still works",
1018
+ mutant=((" !$omp declare mapper(prec_t :: x) map(x, x%p)\n", ""),)),
1019
+ FSpec("declare-mapper-extended-type",
1020
+ "form.omp.declare_mapper_extended_type",
1021
+ "a default declare mapper of an extended derived type (an "
1022
+ "inherited component and an own POINTER component)", OMP_MAPPER,
1023
+ ploop("b(i) = e%k*e%w(i) + 1", "to(e) from(b) tofrom(host_flag)"),
1024
+ ref="3*i + 1", modules=module("""\
1025
+ type base_t
1026
+ integer :: k = 1
1027
+ end type base_t
1028
+ type, extends(base_t) :: ext_t
1029
+ integer, pointer :: w(:) => null()
1030
+ end type ext_t
1031
+ !$omp declare mapper(ext_t :: x) map(x, x%w)""", "wtypes"),
1032
+ uses=" use wtypes\n", decls=" type(ext_t) :: e\n",
1033
+ init=" allocate(e%w(n))\n e%w = 3*a\n", models=("omp",),
1034
+ mutant_device="copy semantics: without the mapper the pointer component's association on the device is undefined (OpenMP 5.2 \u00a75.8.3, p.150); under unified memory the host pointer still works",
1035
+ mutant=((" !$omp declare mapper(ext_t :: x) map(x, x%w)\n", ""),)),
1036
+ ]
1037
+
1038
+ # --- pairs (Fortran) ------------------------------------------------------------------
1039
+ #
1040
+ # A pair's parts each have a program of their own (tests/cluster/test_widen.py);
1041
+ # omp / acc parts are the model's own construct atoms.
1042
+
1043
+ _A2 = (" integer :: a2(4, n), c2(4, n)\n integer :: j\n",
1044
+ " do i = 1, n\n do j = 1, 4\n a2(j, i) = i*j\n c2(j, i) = 0\n"
1045
+ " end do\n end do\n")
1046
+ OMP_PART = {"collapse": "omp.clause.collapse",
1047
+ "reduction": "omp.clause.reduction",
1048
+ "update": "omp.directive.target_update",
1049
+ "atomic": "omp.directive.atomic",
1050
+ "private": "omp.clause.private",
1051
+ "firstprivate": "omp.clause.firstprivate",
1052
+ "data": "omp.directive.target_data",
1053
+ "enter": "omp.directive.target_enter_data"}
1054
+ ACC_PART = {"collapse": "acc.clause.collapse",
1055
+ "reduction": "acc.clause.reduction",
1056
+ "update": "acc.directive.update",
1057
+ "atomic": "acc.directive.atomic",
1058
+ "private": "acc.clause.private",
1059
+ "firstprivate": "acc.clause.firstprivate",
1060
+ "data": "acc.directive.data",
1061
+ "enter": "acc.directive.enter_data"}
1062
+
1063
+
1064
+ def pair_atom(a: str, b: str) -> str:
1065
+ return f"pair.{a}+{b}"
1066
+
1067
+
1068
+ def pair(slug, construct, base, feature, kernel, models=("omp", "acc"),
1069
+ **kw):
1070
+ """One FSpec per model: parts (the model's `construct` atom, `base`)."""
1071
+ out = []
1072
+ for m in models:
1073
+ tab = OMP_PART if m == "omp" else ACC_PART
1074
+ parts = (tab.get(construct, construct), tab.get(base, base))
1075
+ extra = dict(kw)
1076
+ acc = extra.pop("acc", {})
1077
+ out.append(FSpec(slug, pair_atom(*parts), feature,
1078
+ extra.pop("spec", "the parts' own programs"),
1079
+ kernel, models=(m,), parts=parts,
1080
+ acc=acc if m == "acc" else {}, **extra))
1081
+ return out
1082
+
1083
+
1084
+ def _c2loop(body, clauses, hf="if (i == 1 .and. j == 1) @HOSTFLAG"):
1085
+ inner = "\n".join(" " + ln for ln in body.strip("\n").splitlines())
1086
+ return (f" @PLOOP {clauses} collapse(2)\n do j = 1, 4\n do i = 1, n\n"
1087
+ f"{inner}\n {hf}\n end do\n end do\n @END_PLOOP\n")
1088
+
1089
+
1090
+ _REC_ALLOC = dict(modules=_TYPES_ALLOC, uses=" use wtypes\n",
1091
+ decls=" type(rec_t) :: r\n",
1092
+ init=" allocate(r%v(n))\n r%v = 3*a\n")
1093
+
1094
+ F_PAIRS = [
1095
+ *pair("collapse-private-array", "collapse", "base.device.private_array",
1096
+ "a private array in a collapse(2) target loop",
1097
+ _c2loop("t(1) = a2(j, i)\nt(2) = 1\nt(3) = a2(j, i)\nt(4) = 0\n"
1098
+ "c2(j, i) = sum(t)", "to(a2) from(c2) tofrom(host_flag) "
1099
+ "private(t)"),
1100
+ check="all(c2 == 2*a2 + 1)", decls=_A2[0] + _PRIV_T, init=_A2[1],
1101
+ mutant=(("t(2) = 1", "t(2) = 0"),)),
1102
+ *pair("collapse-reduction", "collapse", "reduction",
1103
+ "a sum reduction over a collapse(2) target loop",
1104
+ _c2loop("s = s + a2(j, i)", "to(a2) tofrom(host_flag) "
1105
+ "reduction(+:s)"),
1106
+ check="s == 10*n*(n + 1)/2", decls=_A2[0] + " integer :: s\n",
1107
+ init=_A2[1] + " s = 0\n",
1108
+ mutant=(("s = s + a2(j, i)", "s = s + 1"),)),
1109
+ *pair("collapse-routine-call", "collapse", "base.device.routine_call",
1110
+ "a device routine called in a collapse(2) target loop",
1111
+ _c2loop("c2(j, i) = tw(a2(j, i))", "to(a2) from(c2) tofrom(host_flag)"),
1112
+ check="all(c2 == 2*a2 + 1)", decls=_A2[0], init=_A2[1],
1113
+ modules=_ROUTINE_TW, uses=" use wmod\n",
1114
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),)),
1115
+ *pair("reduction-routine-call", "reduction", "base.device.routine_call",
1116
+ "a device routine called in a sum reduction loop",
1117
+ ploop("s = s + tw(a(i))", "to(a) tofrom(host_flag) reduction(+:s)"),
1118
+ check="s == n*(n + 1) + n", decls=" integer :: s\n",
1119
+ init=" s = 0\n", modules=_ROUTINE_TW, uses=" use wmod\n",
1120
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),)),
1121
+ *pair("update-alloc-component", "update", "base.device.alloc_component",
1122
+ "an allocatable component kept on the device by enter data, "
1123
+ "updated from the host between two target loops",
1124
+ " @ENTER to(r%v)\n"
1125
+ + ploop("b(i) = r%v(i) + 1", "to(r%v) from(b) tofrom(host_flag)")
1126
+ + " r%v = 5*a\n @UPD_TO(r%v)\n"
1127
+ + ploop("b(i) = b(i) + r%v(i)", "to(r%v) tofrom(b)", flag=False)
1128
+ + " @EXIT delete(r%v)\n",
1129
+ ref="8*i + 1", **_REC_ALLOC,
1130
+ acc={"kernel": " @ENTER to(r)\n @ENTER to(r%v)\n"
1131
+ + ploop("b(i) = r%v(i) + 1", "present(r) from(b) tofrom(host_flag)")
1132
+ + " r%v = 5*a\n @UPD_TO(r%v)\n"
1133
+ + ploop("b(i) = b(i) + r%v(i)", "present(r) tofrom(b)",
1134
+ flag=False)
1135
+ + " @EXIT delete(r%v)\n @EXIT delete(r)\n",
1136
+ "mutant": ((" !$acc update device(r%v)\n", ""),)},
1137
+ mutant_device="copy semantics: without the update the device keeps the old values (separate memory only)",
1138
+ mutant=((" !$omp target update to(r%v)\n", ""),)),
1139
+ *pair("collapse-alloc-component", "collapse", "base.device.alloc_component",
1140
+ "an allocatable component read in a collapse(2) target loop",
1141
+ _c2loop("c2(j, i) = r%v(i)*j + 1", "to(r%v) from(c2) tofrom(host_flag)"),
1142
+ check="all(c2 == 3*a2 + 1)",
1143
+ modules=_TYPES_ALLOC, uses=" use wtypes\n",
1144
+ decls=" type(rec_t) :: r\n" + _A2[0],
1145
+ init=" allocate(r%v(n))\n r%v = 3*a\n" + _A2[1],
1146
+ acc={"kernel": " @ENTER to(r)\n @ENTER to(r%v)\n" + _c2loop(
1147
+ "c2(j, i) = r%v(i)*j + 1", "present(r) from(c2) tofrom(host_flag)")
1148
+ + " @EXIT delete(r%v)\n @EXIT delete(r)\n"},
1149
+ mutant=(("c2(j, i) = r%v(i)*j + 1", "c2(j, i) = 1"),)),
1150
+ *pair("atomic-reduction", "atomic", "reduction",
1151
+ "an atomic update of one variable and a sum reduction of another "
1152
+ "in one target loop",
1153
+ ploop("s = s + a(i)\n@ATOMIC\nw = w + 1",
1154
+ "to(a) tofrom(w, host_flag) reduction(+:s)"),
1155
+ check="s == n*(n + 1)/2 .and. w == n", decls=" integer :: s, w\n",
1156
+ init=" s = 0\n w = 0\n",
1157
+ mutant=(("w = w + 1", "w = w + 2"),)),
1158
+ *pair("atomic-derived-component", "atomic", "base.device.derived_scalar",
1159
+ "an atomic update of an integer component of a mapped derived-type "
1160
+ "scalar in a target loop",
1161
+ ploop("@ATOMIC\nst%k = st%k + a(i)", "to(a) tofrom(st, host_flag)"),
1162
+ check="st%k == n*(n + 1)/2 .and. st%m == 1",
1163
+ modules=_TYPES_PT, uses=" use wtypes\n",
1164
+ decls=" type(par_t) :: st\n", init=" st%k = 0\n st%m = 1\n",
1165
+ mutant=(("st%k = st%k + a(i)", "st%k = st%k + 1"),)),
1166
+ *pair("private-array-routine-arg", "base.device.private_array",
1167
+ "base.device.assumed_shape_routine",
1168
+ "a private array passed to a device routine with an assumed-shape "
1169
+ "dummy",
1170
+ ploop("call fill(t, a(i))\nb(i) = sum(t)",
1171
+ "to(a) from(b) tofrom(host_flag) private(t)"),
1172
+ decls=_PRIV_T, modules=module("""\
1173
+ contains
1174
+ subroutine fill(x, v)
1175
+ @ROUTINE
1176
+ integer, intent(out) :: x(:)
1177
+ integer, intent(in) :: v
1178
+ x = 0
1179
+ x(1) = v
1180
+ x(2) = v + 1
1181
+ end subroutine fill"""), uses=" use wmod\n",
1182
+ mutant=(("x(2) = v + 1", "x(2) = v"),)),
1183
+ *pair("collapse-select-case", "collapse", "base.device.select_case",
1184
+ "a SELECT CASE in a collapse(2) target loop",
1185
+ _c2loop("select case (mod(a2(j, i), 3))\ncase (0)\n c2(j, i) = 1\n"
1186
+ "case default\n c2(j, i) = 2\nend select",
1187
+ "to(a2) from(c2) tofrom(host_flag)"),
1188
+ check="all(c2 == merge(1, 2, mod(a2, 3) == 0))",
1189
+ decls=_A2[0], init=_A2[1],
1190
+ mutant=((" c2(j, i) = 2\n", " c2(j, i) = 1\n"),)),
1191
+ *pair("collapse-stop", "collapse", "base.device.stop",
1192
+ "an unreached STOP in a collapse(2) target loop",
1193
+ _c2loop("if (a2(j, i) < 0) stop 1\nc2(j, i) = 2*a2(j, i) + 1",
1194
+ "to(a2) from(c2) tofrom(host_flag)"),
1195
+ check="all(c2 == 2*a2 + 1)", decls=_A2[0], init=_A2[1],
1196
+ mutant=(("c2(j, i) = 2*a2(j, i) + 1", "c2(j, i) = 2*a2(j, i)"),)),
1197
+ *pair("data-optional-absent", "data", "base.device.optional_absent",
1198
+ "an absent OPTIONAL dummy in the map clause of a data region "
1199
+ "around a target loop that tests PRESENT()",
1200
+ " call work(a, b, host_flag)\n", contains="""\
1201
+ subroutine work(x, y, hf, c)
1202
+ integer, intent(in) :: x(n)
1203
+ integer, intent(inout) :: y(n)
1204
+ integer, intent(inout) :: hf
1205
+ integer, intent(in), optional :: c(n)
1206
+ integer :: k
1207
+ @DATA to(c)
1208
+ @PLOOP to(x) tofrom(y, hf)
1209
+ do k = 1, n
1210
+ if (present(c)) then
1211
+ y(k) = x(k) + c(k)
1212
+ else
1213
+ y(k) = 2*x(k) + 1
1214
+ end if
1215
+ if (k == 1) @HOSTFLAG[hf]
1216
+ end do
1217
+ @END_PLOOP
1218
+ @END_DATA
1219
+ end subroutine work
1220
+ """, mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),)),
1221
+ *pair("enter-assumed-shape", "enter", "base.device.assumed_shape_target",
1222
+ "assumed-shape dummy arrays put on the device with enter data, "
1223
+ "used by a target loop and brought back with exit data",
1224
+ " call work(a, b, host_flag)\n", contains="""\
1225
+ subroutine work(x, y, hf)
1226
+ integer, intent(in) :: x(:)
1227
+ integer, intent(inout) :: y(:)
1228
+ integer, intent(inout) :: hf
1229
+ integer :: k
1230
+ @ENTER to(x) alloc(y)
1231
+ @PLOOP present(x, y) tofrom(hf)
1232
+ do k = 1, size(x)
1233
+ y(k) = 2*x(k) + 1
1234
+ if (k == 1) @HOSTFLAG[hf]
1235
+ end do
1236
+ @END_PLOOP
1237
+ @EXIT from(y) delete(x)
1238
+ end subroutine work
1239
+ """, mutant=(("y(k) = 2*x(k) + 1", "y(k) = 2*x(k)"),)),
1240
+ *pair("reduction-derived-array", "reduction", "base.device.derived_array",
1241
+ "a sum reduction over the components of a mapped array of a "
1242
+ "derived type",
1243
+ ploop("s = s + ps(i)%x + ps(i)%y", "to(ps) tofrom(host_flag) "
1244
+ "reduction(+:s)"),
1245
+ check="s == 3*n*(n + 1)/2", modules=_TYPES_PT, uses=" use wtypes\n",
1246
+ decls=" type(pt_t) :: ps(n)\n integer :: s\n",
1247
+ init=" do i = 1, n\n ps(i)%x = i\n ps(i)%y = 2*i\n end do\n"
1248
+ " s = 0\n",
1249
+ mutant=(("s = s + ps(i)%x + ps(i)%y", "s = s + ps(i)%x"),)),
1250
+ *pair("elemental-array-syntax", "base.device.elemental",
1251
+ "base.device.array_syntax",
1252
+ "an ELEMENTAL device function applied to strided array sections",
1253
+ region("b(1:n:2) = tw(a(1:n:2))\nb(2:n:2) = tw(a(2:n:2))"),
1254
+ modules=module("""\
1255
+ contains
1256
+ elemental integer function tw(x)
1257
+ @ROUTINE
1258
+ integer, intent(in) :: x
1259
+ tw = 2*x + 1
1260
+ end function tw"""), uses=" use wmod\n",
1261
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),)),
1262
+ *pair("reduction-math", "reduction", "base.device.intrinsic_math",
1263
+ "a real(8) sum reduction of SIN**2 + COS**2 (checked to 1e-9)",
1264
+ ploop("x = real(a(i), 8)\ns = s + sin(x)**2 + cos(x)**2",
1265
+ "to(a) tofrom(host_flag) private(x) reduction(+:s)"),
1266
+ check="abs(s - real(n, 8)) < 1.0d-9",
1267
+ decls=" real(8) :: s, x\n", init=" s = 0.0d0\n",
1268
+ mutant=((" + cos(x)**2", ""),)),
1269
+ *pair("reduction-complex", "reduction", "base.device.complex",
1270
+ "a COMPLEX(8) sum reduction", ploop(
1271
+ "z = z + cmplx(a(i), -a(i), 8)",
1272
+ "to(a) tofrom(host_flag) reduction(+:z)"),
1273
+ check="real(z) == real(n*(n + 1)/2, 8) .and. aimag(z) == "
1274
+ "-real(n*(n + 1)/2, 8)",
1275
+ decls=" complex(8) :: z\n", init=" z = (0.0d0, 0.0d0)\n",
1276
+ mutant=(("cmplx(a(i), -a(i), 8)", "cmplx(a(i), a(i), 8)"),)),
1277
+ *pair("private-derived-scalar", "private", "base.device.derived_scalar",
1278
+ "a private scalar of a derived type in a target loop",
1279
+ ploop("t%k = a(i)\nt%m = 1\nb(i) = 2*t%k + t%m",
1280
+ "to(a) from(b) tofrom(host_flag) private(t)"),
1281
+ modules=_TYPES_PT, uses=" use wtypes\n",
1282
+ decls=" type(par_t) :: t\n",
1283
+ mutant=(("b(i) = 2*t%k + t%m", "b(i) = 2*t%k"),)),
1284
+ *pair("firstprivate-derived-scalar", "firstprivate",
1285
+ "base.device.derived_scalar",
1286
+ "a firstprivate scalar of a derived type in a target loop",
1287
+ ploop("b(i) = s%k*a(i) + s%m",
1288
+ "to(a) from(b) tofrom(host_flag) firstprivate(s)"),
1289
+ ref="3*i + 1", modules=_TYPES_PT, uses=" use wtypes\n",
1290
+ decls=" type(par_t) :: s\n", init=" s%k = 3\n s%m = 1\n",
1291
+ mutant=(("b(i) = s%k*a(i) + s%m", "b(i) = s%k*a(i)"),)),
1292
+ *pair("atomic-collapse", "atomic", "collapse",
1293
+ "an atomic update of a histogram bin in a collapse(2) target loop",
1294
+ _c2loop("@ATOMIC\nh(mod(a2(j, i), 4) + 1) = h(mod(a2(j, i), 4) + 1) + 1",
1295
+ "to(a2) tofrom(h, host_flag)"),
1296
+ check="all(h == hr)", decls=_A2[0] + " integer :: h(4), hr(4)\n",
1297
+ init=_A2[1] + " h = 0\n hr = 0\n do i = 1, n\n do j = 1, 4\n"
1298
+ " hr(mod(i*j, 4) + 1) = hr(mod(i*j, 4) + 1) + 1\n end do\n"
1299
+ " end do\n",
1300
+ mutant=(("= h(mod(a2(j, i), 4) + 1) + 1", "= h(mod(a2(j, i), 4) + 1) + 2"),)),
1301
+ *pair("update-derived-array", "update", "base.device.derived_array",
1302
+ "an array of a derived type kept on the device by enter data and "
1303
+ "updated from the host between two target loops",
1304
+ " @ENTER to(ps)\n"
1305
+ + ploop("b(i) = ps(i)%x + ps(i)%y", "present(ps) from(b) tofrom(host_flag)")
1306
+ + " do i = 1, n\n ps(i)%y = 5*i\n end do\n @UPD_TO(ps)\n"
1307
+ + ploop("b(i) = b(i) + ps(i)%y", "present(ps) tofrom(b)", flag=False)
1308
+ + " @EXIT delete(ps)\n",
1309
+ ref="8*i", modules=_TYPES_PT, uses=" use wtypes\n",
1310
+ decls=" type(pt_t) :: ps(n)\n",
1311
+ init=" do i = 1, n\n ps(i)%x = i\n ps(i)%y = 2*i\n end do\n",
1312
+ mutant_device="copy semantics: without the update the device keeps the old values (separate memory only)",
1313
+ mutant=((" !$omp target update to(ps)\n", ""),),
1314
+ acc={"mutant": ((" !$acc update device(ps)\n", ""),)}),
1315
+ *pair("collapse-derived-array", "collapse", "base.device.derived_array",
1316
+ "an array of a derived type read in a collapse(2) target loop",
1317
+ _c2loop("c2(j, i) = ps(i)%x*j + ps(i)%y",
1318
+ "to(ps) from(c2) tofrom(host_flag)"),
1319
+ check="all(c2 == a2 + spread(2*a, 1, 4))", modules=_TYPES_PT,
1320
+ uses=" use wtypes\n", decls=" type(pt_t) :: ps(n)\n" + _A2[0],
1321
+ init=" do i = 1, n\n ps(i)%x = i\n ps(i)%y = 2*i\n end do\n"
1322
+ + _A2[1],
1323
+ mutant=(("c2(j, i) = ps(i)%x*j + ps(i)%y", "c2(j, i) = ps(i)%x*j"),)),
1324
+ *pair("reduction-private-array", "reduction", "base.device.private_array",
1325
+ "a private array and a sum reduction in one target loop",
1326
+ ploop("t(1) = a(i)\nt(2) = 1\nt(3) = a(i)\nt(4) = 0\ns = s + sum(t)",
1327
+ "to(a) tofrom(host_flag) private(t) reduction(+:s)"),
1328
+ check="s == n*(n + 1) + n", decls=_PRIV_T + " integer :: s\n",
1329
+ init=" s = 0\n", mutant=(("t(2) = 1", "t(2) = 0"),)),
1330
+ *pair("data-alloc-component", "data", "base.device.alloc_component",
1331
+ "an allocatable component mapped by a data region around a "
1332
+ "target loop",
1333
+ " @DATA to(r%v)\n" + ploop("b(i) = r%v(i) + 1",
1334
+ "to(r%v) from(b) tofrom(host_flag)")
1335
+ + " @END_DATA\n", ref="3*i + 1", **_REC_ALLOC,
1336
+ acc={"kernel": " @DATA to(r)\n @DATA to(r%v)\n" + ploop(
1337
+ "b(i) = r%v(i) + 1", "present(r) from(b) tofrom(host_flag)")
1338
+ + " @END_DATA\n @END_DATA\n"},
1339
+ mutant=(("b(i) = r%v(i) + 1", "b(i) = 1"),)),
1340
+ *pair("routine-stop", "base.device.routine_call", "base.device.stop",
1341
+ "an unreached STOP in a device routine",
1342
+ ploop("b(i) = tw(a(i))"), modules=module("""\
1343
+ contains
1344
+ integer function tw(x)
1345
+ @ROUTINE
1346
+ integer, intent(in) :: x
1347
+ if (x < 0) stop 3
1348
+ tw = 2*x + 1
1349
+ end function tw"""), uses=" use wmod\n",
1350
+ mutant=(("tw = 2*x + 1", "tw = 2*x"),)),
1351
+ *pair("routine-character", "base.device.routine_call",
1352
+ "base.device.character",
1353
+ "a device routine with a CHARACTER(len=*) dummy",
1354
+ ploop("s = 'abcdefgh'\nb(i) = code(s(1:mod(i, 8) + 1))",
1355
+ "to(a) from(b) tofrom(host_flag) private(s)"),
1356
+ ref="97 + mod(i, 8) + 1", decls=" character(len=8) :: s\n",
1357
+ modules=module("""\
1358
+ contains
1359
+ integer function code(c)
1360
+ @ROUTINE
1361
+ character(len=*), intent(in) :: c
1362
+ code = ichar(c(1:1)) + len(c)
1363
+ end function code"""), uses=" use wmod\n",
1364
+ mutant=(("code = ichar(c(1:1)) + len(c)", "code = ichar(c(1:1))"),)),
1365
+ # OpenMP only
1366
+ *pair("critical-reduction", "omp.directive.critical", "omp.clause.reduction",
1367
+ "a critical update of one variable and a sum reduction of another "
1368
+ "in one target parallel loop", """\
1369
+ s = 0
1370
+ w = 0
1371
+ !$omp target parallel do map(to: a) map(tofrom: w, host_flag) reduction(+: s)
1372
+ do i = 1, n
1373
+ s = s + a(i)
1374
+ !$omp critical
1375
+ w = w + 1
1376
+ !$omp end critical
1377
+ if (i == 1) @HOSTFLAG
1378
+ end do
1379
+ !$omp end target parallel do
1380
+ """, models=("omp",), check="s == n*(n + 1)/2 .and. w == n",
1381
+ decls=" integer :: s, w\n", mutant=(("w = w + 1", "w = w + 2"),)),
1382
+ *pair("lastprivate-parallel-in-seq-loop", "omp.clause.lastprivate",
1383
+ "base.device.parallel_in_seq_loop",
1384
+ "lastprivate on a parallel do nested in a sequential loop of a "
1385
+ "target region", """\
1386
+ !$omp target map(to: a) map(tofrom: b, host_flag)
1387
+ @HOSTFLAG
1388
+ do k = 1, 3
1389
+ !$omp parallel do lastprivate(last)
1390
+ do i = 1, n
1391
+ last = a(i) + k
1392
+ end do
1393
+ !$omp end parallel do
1394
+ b(k) = last
1395
+ end do
1396
+ !$omp end target
1397
+ """, models=("omp",), check="all(b(1:3) == [n + 1, n + 2, n + 3])",
1398
+ decls=" integer :: k, last\n",
1399
+ mutant=(("last = a(i) + k", "last = a(i)"),)),
1400
+ *pair("reduction-parallel-in-seq-loop", "omp.clause.reduction",
1401
+ "base.device.parallel_in_seq_loop",
1402
+ "a reduction on a parallel do nested in a sequential loop of a "
1403
+ "target region", """\
1404
+ s = 0
1405
+ !$omp target map(to: a) map(tofrom: s, host_flag)
1406
+ @HOSTFLAG
1407
+ do k = 1, 3
1408
+ !$omp parallel do reduction(+: s)
1409
+ do i = 1, n
1410
+ s = s + a(i)
1411
+ end do
1412
+ !$omp end parallel do
1413
+ end do
1414
+ !$omp end target
1415
+ """, models=("omp",), check="s == 3*n*(n + 1)/2",
1416
+ decls=" integer :: k, s\n", mutant=(("s = s + a(i)", "s = s + 1"),)),
1417
+ *pair("defaultmap-present-private-array", "omp.clause.defaultmap.present",
1418
+ "base.device.private_array",
1419
+ "defaultmap(present: aggregate) with a private array on the same "
1420
+ "target loop (the arrays the loop maps are present by enter data)",
1421
+ """\
1422
+ !$omp target enter data map(to: a) map(alloc: b)
1423
+ !$omp target teams distribute parallel do defaultmap(present: aggregate) &
1424
+ !$omp& private(t) map(tofrom: host_flag)
1425
+ do i = 1, n
1426
+ t(1) = a(i)
1427
+ t(2) = 1
1428
+ t(3) = a(i)
1429
+ t(4) = 0
1430
+ b(i) = sum(t)
1431
+ if (i == 1) @HOSTFLAG
1432
+ end do
1433
+ !$omp end target teams distribute parallel do
1434
+ !$omp target exit data map(from: b) map(release: a)
1435
+ """, models=("omp",), decls=_PRIV_T, mutant=(("t(2) = 1", "t(2) = 0"),),
1436
+ spec="OpenMP 5.2 §5.8.7, p.161 (defaultmap applies to variables "
1437
+ "without an explicitly determined attribute: the private "
1438
+ "array is not one)"),
1439
+ *pair("allocate-const-firstprivate", "omp.clause.allocate",
1440
+ "omp.clause.firstprivate",
1441
+ "a firstprivate scalar allocated with omp_const_mem_alloc "
1442
+ "(uses_allocators) on a target loop", """\
1443
+ x = 5
1444
+ !$omp target teams distribute parallel do map(to: a) map(from: b) &
1445
+ !$omp& map(tofrom: host_flag) firstprivate(x) allocate(omp_const_mem_alloc: x) &
1446
+ !$omp& uses_allocators(omp_const_mem_alloc)
1447
+ do i = 1, n
1448
+ b(i) = a(i) + x
1449
+ if (i == 1) @HOSTFLAG
1450
+ end do
1451
+ !$omp end target teams distribute parallel do
1452
+ """, models=("omp",), ref="i + 5", decls=" integer :: x\n",
1453
+ uses=" use omp_lib, only: omp_const_mem_alloc\n",
1454
+ mutant=(("b(i) = a(i) + x", "b(i) = a(i)"),),
1455
+ spec="OpenMP 5.2 §6.6 (allocate clause) and §13.8, p.285: "
1456
+ "an allocator in a uses_allocators clause may be used in an "
1457
+ "allocate clause on the target construct"),
1458
+ *pair("mapper-reduction", "omp.directive.declare_mapper",
1459
+ "omp.clause.reduction",
1460
+ "a sum reduction over the POINTER component of a structure "
1461
+ "mapped through its declared default mapper",
1462
+ ploop("s = s + r%p(i)", "to(r) tofrom(host_flag) reduction(+:s)"),
1463
+ models=("omp",), check="s == 3*n*(n + 1)/2",
1464
+ modules=module("""\
1465
+ type prec_t
1466
+ integer :: k = 0
1467
+ integer, pointer :: p(:) => null()
1468
+ end type prec_t
1469
+ !$omp declare mapper(prec_t :: x) map(x, x%p)""", "wtypes"),
1470
+ uses=" use wtypes\n", decls=" type(prec_t) :: r\n integer :: s\n",
1471
+ init=" allocate(r%p(n))\n r%p = 3*a\n s = 0\n",
1472
+ mutant_device="copy semantics: without the mapper the pointer component's association on the device is undefined (OpenMP 5.2 \u00a75.8.3, p.150); under unified memory the host pointer still works",
1473
+ mutant=((" !$omp declare mapper(prec_t :: x) map(x, x%p)\n", ""),)),
1474
+ *pair("mapper-iterator", "omp.directive.declare_mapper",
1475
+ "omp.clause.map.iterator",
1476
+ "a default declare mapper whose map clause has an iterator over "
1477
+ "the POINTER components of an array component",
1478
+ ploop("b(i) = r%s(1)%p(i) + r%s(2)%p(i)",
1479
+ "to(r) from(b) tofrom(host_flag)"),
1480
+ models=("omp",), ref="5*i", modules=module("""\
1481
+ type seg_t
1482
+ integer, pointer :: p(:) => null()
1483
+ end type seg_t
1484
+ type rec2_t
1485
+ type(seg_t) :: s(2)
1486
+ end type rec2_t
1487
+ !$omp declare mapper(rec2_t :: x) map(x) map(iterator(k = 1:2), to: x%s(k)%p)""", "wtypes"),
1488
+ uses=" use wtypes\n", decls=" type(rec2_t) :: r\n",
1489
+ init=" allocate(r%s(1)%p(n), r%s(2)%p(n))\n r%s(1)%p = 2*a\n"
1490
+ " r%s(2)%p = 3*a\n",
1491
+ spec="OpenMP 5.2 \u00a75.8.8 (declare mapper) and \u00a73.2.6 (iterator modifier)",
1492
+ mutant_device="copy semantics: without the mapper the pointer component's association on the device is undefined (OpenMP 5.2 \u00a75.8.3, p.150); under unified memory the host pointer still works",
1493
+ mutant=((" !$omp declare mapper(rec2_t :: x) map(x) map(iterator(k = 1:2), to: x%s(k)%p)\n", ""),)),
1494
+ *pair("enter-alloc-component-whole", "omp.directive.target_enter_data",
1495
+ "base.device.alloc_component_whole",
1496
+ "a derived type with an allocatable component put on the device "
1497
+ "whole by enter data (the default mapper maps the component) and "
1498
+ "used by a target loop",
1499
+ " !$omp target enter data map(to: r)\n"
1500
+ + ploop("b(i) = r%v(i) + 1", "from(b) tofrom(host_flag)")
1501
+ + " !$omp target exit data map(delete: r)\n",
1502
+ models=("omp",), ref="3*i + 1", **_REC_ALLOC,
1503
+ mutant=(("b(i) = r%v(i) + 1", "b(i) = 1"),)),
1504
+ # OpenACC only
1505
+ *pair("loop-in-routine-sequence-association",
1506
+ "base.device.loop_in_routine", "base.device.sequence_association",
1507
+ "an array element passed to an explicit-shape dummy of a routine "
1508
+ "seq procedure that has a loop seq construct",
1509
+ ploop("call rowsum(a2(1, i), 4, b(i))",
1510
+ "to(a2) from(b) tofrom(host_flag)"),
1511
+ models=("acc",), ref="10*i",
1512
+ decls=" integer :: a2(4, n)\n integer :: k\n",
1513
+ init=" do i = 1, n\n do k = 1, 4\n a2(k, i) = k*i\n end do\n"
1514
+ " end do\n", modules=module("""\
1515
+ contains
1516
+ subroutine rowsum(x, m, s)
1517
+ !$acc routine seq
1518
+ integer, intent(in) :: m
1519
+ integer, intent(in) :: x(m)
1520
+ integer, intent(out) :: s
1521
+ integer :: k
1522
+ s = 0
1523
+ !$acc loop seq
1524
+ do k = 1, m
1525
+ s = s + x(k)
1526
+ end do
1527
+ end subroutine rowsum"""), uses=" use wmod\n",
1528
+ mutant=(("s = s + x(k)", "s = x(k)"),)),
1529
+ *pair("kernels-derived-array", "acc.directive.kernels",
1530
+ "base.device.derived_array",
1531
+ "an array of a derived type read in a kernels construct", """\
1532
+ !$acc kernels copyin(ps) copyout(b) copy(host_flag)
1533
+ do i = 1, n
1534
+ b(i) = ps(i)%x + 2*ps(i)%y
1535
+ end do
1536
+ @HOSTFLAG
1537
+ !$acc end kernels
1538
+ """, models=("acc",), ref="5*i", modules=_TYPES_PT, uses=" use wtypes\n",
1539
+ decls=" type(pt_t) :: ps(n)\n",
1540
+ init=" do i = 1, n\n ps(i)%x = i\n ps(i)%y = 2*i\n end do\n",
1541
+ mutant=(("b(i) = ps(i)%x + 2*ps(i)%y", "b(i) = ps(i)%x"),)),
1542
+ ]
1543
+
1544
+
1545
+
1546
+ # --- From the application corpus (data/bench/apps) ----------------------------------
1547
+ # A failing kernel of a real code whose construct, pair or form the catalog
1548
+ # did not have; each reduced to a program of its own (parts: their own
1549
+ # programs). Sources: miniWeather (target update with depend, AFAR
1550
+ # rejects), PRK transpose (a team-private array shared by a nested parallel
1551
+ # loop, AFAR and CCE wrong), PRK stencil (OpenACC tile over a loop body with
1552
+ # inner loops, CCE rejects).
1553
+ OMP_UPDATE_DEPEND = ("OpenMP 5.2 §13.9, p.292 (target update construct: "
1554
+ "depend and nowait clauses); §15.9.5 (depend clause)")
1555
+ OMP_TEAMS_PRIVATE = ("OpenMP 5.2 §10.2, p.214 (teams: private list items are "
1556
+ "private to each team) and §10.1 (a parallel region in a "
1557
+ "teams region: its threads share the team's variables); "
1558
+ "§5.4.3 (private clause)")
1559
+ ACC_TILE = ("OpenACC 3.4 §2.9.8, p.68 (tile clause: the loops of the tile "
1560
+ "are the tightly nested loops the clause names; the body of the "
1561
+ "innermost may hold other loops)")
1562
+
1563
+ F_APPS = [
1564
+ FSpec("update-depend", "pair.omp.directive.target_update+omp.clause.depend",
1565
+ "a target update with a depend clause between two device loops "
1566
+ "(then taskwait)", OMP_UPDATE_DEPEND, """ !$omp target enter data map(to: a) map(alloc: b)
1567
+ !$omp target teams distribute parallel do map(tofrom: host_flag)
1568
+ do i = 1, n
1569
+ b(i) = 2*a(i) + 1
1570
+ if (i == 1) @HOSTFLAG
1571
+ end do
1572
+ !$omp end target teams distribute parallel do
1573
+ !$omp target update from(b) depend(inout: b)
1574
+ !$omp taskwait
1575
+ !$omp target exit data map(delete: a, b)
1576
+ """, models=("omp",),
1577
+ parts=("omp.directive.target_update", "omp.clause.depend"),
1578
+ mutant=((" !$omp target update from(b) depend(inout: b)\n", ""),),
1579
+ mutant_device="copy semantics: without the update the host keeps "
1580
+ "b = 0 (separate memory only)"),
1581
+ FSpec("update-depend-nowait",
1582
+ "form.omp.target_update_depend_nowait",
1583
+ "a deferred target update (depend, nowait) completed by taskwait",
1584
+ OMP_UPDATE_DEPEND, """ !$omp target enter data map(to: a) map(alloc: b)
1585
+ !$omp target teams distribute parallel do map(tofrom: host_flag) depend(out: b) nowait
1586
+ do i = 1, n
1587
+ b(i) = 2*a(i) + 1
1588
+ if (i == 1) @HOSTFLAG
1589
+ end do
1590
+ !$omp end target teams distribute parallel do
1591
+ !$omp target update from(b) depend(inout: b) nowait
1592
+ !$omp taskwait
1593
+ !$omp target exit data map(delete: a, b)
1594
+ """, models=("omp",),
1595
+ mutant=((" !$omp target update from(b) depend(inout: b) nowait\n",
1596
+ ""),),
1597
+ mutant_device="copy semantics: without the update the host keeps "
1598
+ "b = 0 (separate memory only)"),
1599
+ FSpec("teams-private-array-parallel",
1600
+ "form.omp.teams_private_array_nested_parallel",
1601
+ "an array private to each team (teams distribute private) written "
1602
+ "and read by the threads of nested parallel loops",
1603
+ OMP_TEAMS_PRIVATE, """ !$omp target teams distribute private(t, j) map(to: a) map(from: b) map(tofrom: host_flag)
1604
+ do jt = 1, n, 4
1605
+ !$omp parallel do
1606
+ do j = 0, 3
1607
+ t(j) = a(jt + j)
1608
+ end do
1609
+ !$omp end parallel do
1610
+ !$omp parallel do
1611
+ do j = 0, 3
1612
+ b(jt + j) = 2*t(3 - j) + 1
1613
+ end do
1614
+ !$omp end parallel do
1615
+ if (jt == 1) @HOSTFLAG
1616
+ end do
1617
+ !$omp end target teams distribute
1618
+ """, models=("omp",), ref="2*(2*(4*((i-1)/4)+1)+3-i)+1",
1619
+ decls=" integer :: t(0:3), j, jt\n",
1620
+ mutant=(("b(jt + j) = 2*t(3 - j) + 1", "b(jt + j) = 2*t(j) + 1"),)),
1621
+ FSpec("declared-alloc-component", "base.device.declared_alloc_component",
1622
+ "a module variable of a derived type with an allocatable "
1623
+ "component made device data (declare target / declare create), "
1624
+ "its component entered by enter data and read in a device loop",
1625
+ "OpenMP 5.2 \u00a77.8.1 (declare target: a module variable may be "
1626
+ "a declare target list item) and \u00a75.8.3 (map: a structure "
1627
+ "component with the allocatable attribute is attached to its "
1628
+ "containing structure)",
1629
+ " allocate(gq%v(n))\n gq%v = 3*a\n @ENTER to(gq%v)\n"
1630
+ + ploop("b(i) = gq%v(i) + 1", "from(b) tofrom(host_flag)")
1631
+ + " @EXIT delete(gq%v)\n",
1632
+ ref="3*i + 1", modules=module("""\
1633
+ type rec_t
1634
+ integer, allocatable :: v(:)
1635
+ end type rec_t
1636
+ type(rec_t) :: gq
1637
+ @DECLVAR(gq)""", "wtypes"), uses=" use wtypes\n",
1638
+ mutant=(("b(i) = gq%v(i) + 1", "b(i) = gq%v(i)"),),
1639
+ spec_acc="OpenACC 3.4 \u00a72.13 (declare create in a module) and "
1640
+ "\u00a72.7.1 (attach of a member of a declared aggregate)"),
1641
+ FSpec("tile-inner-loops", "form.acc.tile_inner_loops",
1642
+ "a tile(*,*) loop whose innermost tiled loop body holds other loops",
1643
+ ACC_TILE, """ !$acc parallel loop tile(*,*) copyin(a) copy(c2) copy(host_flag)
1644
+ do j = 1, 4
1645
+ do i = 1, n
1646
+ do k = 1, 2
1647
+ c2(j, i) = c2(j, i) + a(i)
1648
+ end do
1649
+ do k = 1, j
1650
+ c2(j, i) = c2(j, i) + 1
1651
+ end do
1652
+ if (i == 1 .and. j == 1) @HOSTFLAG
1653
+ end do
1654
+ end do
1655
+ """, models=("acc",), decls=" integer :: c2(4, n), j, k\n",
1656
+ init=" c2 = 0\n", check="all([((c2(j, i) == 2*a(i) + j, j = 1, 4), i = 1, n)])",
1657
+ mutant=((" c2(j, i) = c2(j, i) + 1\n", ""),)),
1658
+ ]
1659
+
1660
+ F_SPECS = F_BASE + F_DIRECTIVES + F_PAIRS + F_APPS
1661
+
1662
+ # --- C ------------------------------------------------------------------------------------
1663
+
1664
+ C_HEAD = "#include <stdio.h>\n#include <stdbool.h>\n#include <omp.h>\n"
1665
+ CPL = "map(to: a) map(from: b) map(tofrom: host_flag)"
1666
+ CHF = "host_flag = omp_is_initial_device();"
1667
+
1668
+
1669
+ def _pragma(text: str, indent: str = " ") -> str:
1670
+ """A #pragma line continued with backslashes past 88 columns."""
1671
+ words = text.split(" ")
1672
+ lines, cur = [], indent + words[0]
1673
+ for w in words[1:]:
1674
+ if len(cur) + 1 + len(w) > 88:
1675
+ lines.append(cur + " \\")
1676
+ cur = indent + " " + w
1677
+ else:
1678
+ cur += " " + w
1679
+ lines.append(cur)
1680
+ return "\n".join(lines)
1681
+
1682
+
1683
+ def _ind(body: str, n: int) -> str:
1684
+ return "\n".join((" " * n + ln) if ln.strip() else ln
1685
+ for ln in body.strip("\n").splitlines())
1686
+
1687
+
1688
+ def cploop(body: str, clauses: str = CPL, flag: bool = True) -> str:
1689
+ hf = f"\n if (i == 0) {CHF}" if flag else ""
1690
+ return (_pragma("#pragma omp target teams distribute parallel for "
1691
+ + clauses) + "\n for (int i = 0; i < n; i++) {\n"
1692
+ + _ind(body, 4) + hf + "\n }\n")
1693
+
1694
+
1695
+ def cregion(body: str, clauses: str = CPL) -> str:
1696
+ return (_pragma("#pragma omp target " + clauses) + "\n {\n " + CHF
1697
+ + "\n" + _ind(body, 4) + "\n }\n")
1698
+
1699
+
1700
+ def cprog(kernel: str, ref: str | None = None, helpers: str = "",
1701
+ decls: str = "", init: str = "", check: str = "",
1702
+ includes: str = "") -> str:
1703
+ if ref is None: # a program checked by `check` alone leaves b at 0
1704
+ ref = "0" if check else "2 * (i + 1) + 1"
1705
+ chk = (" bool ok = true;\n for (int i = 0; i < n; i++)\n"
1706
+ " ok = ok && (b[i] == ref[i]);\n")
1707
+ if check:
1708
+ chk += f" ok = ok && ({check});\n"
1709
+ return (C_HEAD + includes + "\nenum { n = 64 };\n\n"
1710
+ + (helpers.strip("\n") + "\n\n" if helpers.strip() else "")
1711
+ + "int main(void) {\n int a[n], b[n], ref[n];\n"
1712
+ " int host_flag = 1;\n" + decls
1713
+ + " for (int i = 0; i < n; i++) {\n a[i] = i + 1;\n"
1714
+ f" b[i] = 0;\n ref[i] = {ref};\n }}\n" + init + kernel + chk
1715
+ + ' printf("RESULT ran_on_host=%d check=%s\\n", host_flag, '
1716
+ 'ok ? "pass" : "fail");\n return 0;\n}\n')
1717
+
1718
+
1719
+ CW2 = ("b[i] = 2 * a[i] + 1;", "b[i] = 2 * a[i];")
1720
+ _C_TW = """\
1721
+ #pragma omp declare target
1722
+ int tw(int x) { return 2 * x + 1; }
1723
+ #pragma omp end declare target"""
1724
+ _C_PRIV = " int t[4];\n"
1725
+
1726
+
1727
+ def C(slug, atom, feature, spec, body, **kw):
1728
+ return CSpec(slug, atom, feature, spec, body, **kw)
1729
+
1730
+
1731
+ C_BASE = [
1732
+ C("pointer-component", "base.device.pointer_component",
1733
+ "a struct with a pointer member mapped with its pointee (map(r, "
1734
+ "r.p[0:n]): the device pointer is attached) and read on the device",
1735
+ "OpenMP 5.2 §5.8.3, p.151: a list item with a base pointer is "
1736
+ "attached to the corresponding pointer",
1737
+ cprog(cploop("b[i] = r.p[i] + 1;", "map(to: r, r.p[0:n]) map(from: b) "
1738
+ "map(tofrom: host_flag)"),
1739
+ ref="3 * (i + 1) + 1", helpers="struct rec { int m; int *p; };",
1740
+ decls=" int store[n];\n struct rec r;\n",
1741
+ init=" for (int i = 0; i < n; i++) store[i] = 3 * (i + 1);\n"
1742
+ " r.m = n;\n r.p = store;\n"),
1743
+ mutant=(("b[i] = r.p[i] + 1;", "b[i] = 1;"),)),
1744
+ C("derived-type-array", "base.device.derived_array",
1745
+ "an array of structs mapped and its members read on the device",
1746
+ OMP_C11, cprog(cploop("b[i] = ps[i].x + 2 * ps[i].y;",
1747
+ "map(to: ps) map(from: b) map(tofrom: host_flag)"),
1748
+ ref="5 * (i + 1)", helpers="struct pt { int x; int y; };",
1749
+ decls=" struct pt ps[n];\n",
1750
+ init=" for (int i = 0; i < n; i++) {\n ps[i].x = i + 1;\n"
1751
+ " ps[i].y = 2 * (i + 1);\n }\n"),
1752
+ mutant=(("b[i] = ps[i].x + 2 * ps[i].y;", "b[i] = ps[i].x;"),)),
1753
+ C("derived-scalar", "base.device.derived_scalar",
1754
+ "a struct scalar mapped and its members read on the device", OMP_C11,
1755
+ cprog(cploop("b[i] = s.k * a[i] + s.m;",
1756
+ "map(to: a, s) map(from: b) map(tofrom: host_flag)"),
1757
+ ref="3 * (i + 1) + 1", helpers="struct par { int k; int m; };",
1758
+ decls=" struct par s = {3, 1};\n"),
1759
+ mutant=(("b[i] = s.k * a[i] + s.m;", "b[i] = s.k * a[i];"),)),
1760
+ C("nested-derived-type", "base.device.nested_type",
1761
+ "a struct with a struct member and an array member, mapped and read "
1762
+ "on the device", OMP_C11,
1763
+ cprog(cploop("b[i] = o.inner.k * a[i] + o.w[(i + 1) % 4];",
1764
+ "map(to: a, o) map(from: b) map(tofrom: host_flag)"),
1765
+ ref="3 * (i + 1) + (i + 1) % 4 + 1",
1766
+ helpers="struct in_s { int k; };\n"
1767
+ "struct out_s { struct in_s inner; int w[4]; };",
1768
+ decls=" struct out_s o = {{3}, {1, 2, 3, 4}};\n"),
1769
+ mutant=((" + o.w[(i + 1) % 4];", ";"),)),
1770
+ C("derived-assignment", "base.device.derived_assign",
1771
+ "struct assignment to a local struct in device code", OMP_C11,
1772
+ cprog(cploop("struct par t = s;\nt.m = t.m + a[i];\nb[i] = t.k * a[i] + t.m;",
1773
+ "map(to: a, s) map(from: b) map(tofrom: host_flag)"),
1774
+ ref="4 * (i + 1) + 1", helpers="struct par { int k; int m; };",
1775
+ decls=" struct par s = {3, 1};\n"),
1776
+ mutant=(("struct par t = s;", "struct par t = {0, 0};"),)),
1777
+ C("union", "base.device.union",
1778
+ "a mapped array of unions written through one member and read "
1779
+ "through another (little-endian byte order on host and devices)",
1780
+ OMP_C11 + "; C11 §6.5.2.3 (reading another union member "
1781
+ "reinterprets the bytes)",
1782
+ cprog(cploop("us[i].i = 2 * a[i] + 1;\nb[i] = us[i].c[0];",
1783
+ "map(to: a) map(tofrom: us) map(from: b) "
1784
+ "map(tofrom: host_flag)"),
1785
+ helpers="union u { int i; unsigned char c[4]; };",
1786
+ decls=" union u us[n];\n",
1787
+ init=" for (int i = 0; i < n; i++) us[i].i = 0;\n"),
1788
+ mutant=(("us[i].i = 2 * a[i] + 1;", "us[i].i = 2 * a[i];"),)),
1789
+ C("save-local-routine", "base.device.save_local",
1790
+ "a static local variable of a declare target function, updated by "
1791
+ "sequential calls in one target region", OMP_STATIC_IN_ROUTINE,
1792
+ cprog(cregion("b[0] = bump();\nb[1] = bump();\nb[2] = bump();",
1793
+ "map(tofrom: b, host_flag)"),
1794
+ ref="i < 3 ? i + 1 : 0", helpers="""\
1795
+ #pragma omp declare target
1796
+ int bump(void) {
1797
+ static int cnt = 0;
1798
+ cnt = cnt + 1;
1799
+ return cnt;
1800
+ }
1801
+ #pragma omp end declare target"""),
1802
+ mutant=(("cnt = cnt + 1;", "cnt = 1;"),)),
1803
+ C("vla-local", "base.device.vla",
1804
+ "a variable-length array declared in a target region", OMP_C11,
1805
+ cprog(cregion("int t[m];\nfor (int k = 0; k < m; k++) t[k] = 2 * a[k] + 1;\n"
1806
+ "for (int k = 0; k < m; k++) b[k] = t[k];",
1807
+ "map(to: a, m) map(from: b) map(tofrom: host_flag)"),
1808
+ decls=" int m = n;\n"),
1809
+ mutant=(("t[k] = 2 * a[k] + 1;", "t[k] = 2 * a[k];"),)),
1810
+ C("vla-mapped", "base.device.vla_mapped",
1811
+ "a host variable-length array mapped and written in a target loop",
1812
+ OMP_C11,
1813
+ cprog(cploop("v[i] = 2 * a[i] + 1;",
1814
+ "map(to: a) map(from: v) map(tofrom: host_flag)")
1815
+ + " for (int i = 0; i < n; i++) b[i] = v[i];\n",
1816
+ decls=" int m = n;\n int v[m];\n"),
1817
+ mutant=(("v[i] = 2 * a[i] + 1;", "v[i] = 2 * a[i];"),)),
1818
+ C("print-in-device", "base.device.print",
1819
+ "printf executed once in device code (the device C library is "
1820
+ "implementation defined: a rejection is no conformance failure)",
1821
+ OMP_C11,
1822
+ cprog(cploop('if (i == n - 1) printf("device print\\n");\n'
1823
+ "b[i] = 2 * a[i] + 1;")),
1824
+ mutant=(CW2,)),
1825
+ C("complex-arith", "base.device.complex",
1826
+ "double _Complex arithmetic in device code", OMP_C11,
1827
+ cprog(cploop("z[i] = ((double)a[i] + 1.0 * I) * I;",
1828
+ "map(to: a) map(from: z) map(tofrom: host_flag)"),
1829
+ includes="#include <complex.h>\n",
1830
+ decls=" double _Complex z[n];\n",
1831
+ init=" for (int i = 0; i < n; i++) z[i] = 0;\n",
1832
+ check="cz(z)",
1833
+ helpers="#include <complex.h>\nstatic bool cz(double _Complex *z) {\n"
1834
+ " for (int i = 0; i < n; i++)\n"
1835
+ " if (creal(z[i]) != -1.0 || cimag(z[i]) != i + 1.0) "
1836
+ "return false;\n return true;\n}"),
1837
+ mutant=(("z[i] = ((double)a[i] + 1.0 * I) * I;",
1838
+ "z[i] = ((double)a[i] + 1.0 * I);"),)),
1839
+ C("long-double", "base.device.long_double",
1840
+ "long double arithmetic on a mapped long double array (the "
1841
+ "representation of long double is implementation defined; a device "
1842
+ "that has no wider type than double may reject it)", OMP_C11,
1843
+ cprog(cploop("ld[i] = (long double)a[i] * 2.0L + 1.0L;",
1844
+ "map(to: a) map(from: ld) map(tofrom: host_flag)")
1845
+ + " for (int i = 0; i < n; i++) b[i] = (int)ld[i];\n",
1846
+ decls=" long double ld[n];\n",
1847
+ init=" for (int i = 0; i < n; i++) ld[i] = 0.0L;\n"),
1848
+ mutant=(("ld[i] = (long double)a[i] * 2.0L + 1.0L;",
1849
+ "ld[i] = (long double)a[i] * 2.0L;"),)),
1850
+ C("function-pointer", "base.device.function_pointer",
1851
+ "a pointer to a declare target function taken and called in device "
1852
+ "code", OMP_FPTR,
1853
+ cprog(cploop("int (*f)(int) = (i % 2) ? tw : th;\nb[i] = f(a[i]);"),
1854
+ ref="(i % 2) ? 2 * (i + 1) + 1 : 3 * (i + 1)", helpers="""\
1855
+ #pragma omp declare target
1856
+ int tw(int x) { return 2 * x + 1; }
1857
+ int th(int x) { return 3 * x; }
1858
+ #pragma omp end declare target"""),
1859
+ mutant=(("int th(int x) { return 3 * x; }",
1860
+ "int th(int x) { return 2 * x + 1; }"),)),
1861
+ C("private-array", "base.device.private_array",
1862
+ "a private local array written at constant indices in a target loop",
1863
+ "OpenMP 5.2 §5.4.3, p.112 (private clause; an array is a list item)",
1864
+ cprog(cploop("t[0] = a[i];\nt[1] = 1;\nt[2] = a[i];\nt[3] = 0;\n"
1865
+ "b[i] = t[0] + t[1] + t[2] + t[3];", CPL + " private(t)"),
1866
+ decls=_C_PRIV),
1867
+ mutant=(("t[1] = 1;", "t[1] = 0;"),)),
1868
+ C("private-array-dynamic-index", "base.device.private_array_dynamic",
1869
+ "a private local array written at a run-time index in a target loop",
1870
+ "OpenMP 5.2 §5.4.3, p.112 (private clause; an array is a list item)",
1871
+ cprog(cploop("for (int k = 0; k < 4; k++) t[k] = 0;\nt[a[i] % 4] = a[i];\n"
1872
+ "b[i] = t[0] + t[1] + t[2] + t[3] + t[a[i] % 4];",
1873
+ CPL + " private(t)"), ref="2 * (i + 1)", decls=_C_PRIV),
1874
+ mutant=(("t[a[i] % 4] = a[i];", "t[0] = 0;"),)),
1875
+ C("intrinsic-transcendental", "base.device.intrinsic_math",
1876
+ "exp, log, sin and cos of doubles in device code (checked to 1e-9)",
1877
+ OMP_C11,
1878
+ cprog(cploop("double v = (double)a[i];\nx[i] = exp(log(v)) + sin(v) * sin(v)"
1879
+ " + cos(v) * cos(v);",
1880
+ "map(to: a) map(from: x) map(tofrom: host_flag)")
1881
+ + " for (int i = 0; i < n; i++)\n"
1882
+ " b[i] = fabs(x[i] - (a[i] + 1.0)) < 1e-9 ? ref[i] : -1;\n",
1883
+ includes="#include <math.h>\n", decls=" double x[n];\n"),
1884
+ mutant=((" + cos(v) * cos(v);", ";"),)),
1885
+ C("select-case", "base.device.select_case",
1886
+ "a switch statement in device code", OMP_C11,
1887
+ cprog(cploop("switch (a[i] % 3) {\ncase 0:\n b[i] = a[i];\n break;\n"
1888
+ "case 1:\n b[i] = 2 * a[i];\n break;\ndefault:\n"
1889
+ " b[i] = 3 * a[i];\n}"),
1890
+ ref="((i + 1) % 3 + 1) * (i + 1)"),
1891
+ mutant=((" b[i] = 3 * a[i];", " b[i] = a[i];"),)),
1892
+ C("recursive-routine", "base.device.recursion",
1893
+ "a recursive declare target function", OMP_C11,
1894
+ cprog(cploop("b[i] = sumto(a[i] % 8);"),
1895
+ ref="((i + 1) % 8) * ((i + 1) % 8 + 1) / 2", helpers="""\
1896
+ #pragma omp declare target
1897
+ int sumto(int k) { return k <= 0 ? 0 : k + sumto(k - 1); }
1898
+ #pragma omp end declare target"""),
1899
+ mutant=(("k + sumto(k - 1)", "k"),)),
1900
+ C("implicit-routine", "base.device.implicit_routine",
1901
+ "a function without a declare target directive called in a target "
1902
+ "loop (implicitly a device function)", OMP_IMPLICIT,
1903
+ cprog(cploop("b[i] = tw(a[i]);"),
1904
+ helpers="int tw(int x) { return 2 * x + 1; }"),
1905
+ mutant=(("return 2 * x + 1;", "return 2 * x;"),)),
1906
+ C("routine-call", "base.device.routine_call",
1907
+ "a declare target function called in a target loop", OMP_IMPLICIT,
1908
+ cprog(cploop("b[i] = tw(a[i]);"), helpers=_C_TW),
1909
+ mutant=(("return 2 * x + 1;", "return 2 * x;"),)),
1910
+ C("allocate-in-device", "base.device.allocate",
1911
+ "malloc and free in a target region (the device C library is "
1912
+ "implementation defined: a rejection is no conformance failure)",
1913
+ OMP_C11,
1914
+ cprog(cregion("int *w = (int *)malloc(n * sizeof(int));\n"
1915
+ "for (int k = 0; k < n; k++) w[k] = 2 * a[k] + 1;\n"
1916
+ "for (int k = 0; k < n; k++) b[k] = w[k];\nfree(w);"),
1917
+ includes="#include <stdlib.h>\n"),
1918
+ mutant=(("w[k] = 2 * a[k] + 1;", "w[k] = 2 * a[k];"),)),
1919
+ C("stop-unreached", "base.device.stop",
1920
+ "a call to abort() in device code that is not executed",
1921
+ "OpenMP 5.2 §4.3, p.75: a structured block may contain calls to "
1922
+ "exit(), _Exit(), quick_exit() or abort()",
1923
+ cprog(cploop("if (a[i] < 0) abort();\nb[i] = 2 * a[i] + 1;"),
1924
+ includes="#include <stdlib.h>\n"),
1925
+ mutant=(CW2,)),
1926
+ C("bitfield", "base.device.bitfield",
1927
+ "a mapped array of structs with bit-field members read on the device",
1928
+ OMP_C11,
1929
+ cprog(cploop("b[i] = bf[i].lo + 16 * bf[i].hi;",
1930
+ "map(to: bf) map(from: b) map(tofrom: host_flag)"),
1931
+ ref="(i + 1) % 256",
1932
+ helpers="struct bits { unsigned lo : 4; unsigned hi : 4; };",
1933
+ decls=" struct bits bf[n];\n",
1934
+ init=" for (int i = 0; i < n; i++) {\n bf[i].lo = (i + 1) % 16;\n"
1935
+ " bf[i].hi = ((i + 1) / 16) % 16;\n }\n"),
1936
+ mutant=((" + 16 * bf[i].hi;", ";"),)),
1937
+ C("struct-by-value", "base.device.struct_by_value",
1938
+ "a struct passed by value to and returned from a declare target "
1939
+ "function", OMP_C11,
1940
+ cprog(cploop("struct par p = {a[i], 1};\nb[i] = sc(p).k;"),
1941
+ helpers="""\
1942
+ struct par { int k; int m; };
1943
+ #pragma omp declare target
1944
+ struct par sc(struct par p) {
1945
+ struct par q = {2 * p.k + p.m, 0};
1946
+ return q;
1947
+ }
1948
+ #pragma omp end declare target"""),
1949
+ mutant=(("{2 * p.k + p.m, 0}", "{2 * p.k, 0}"),)),
1950
+ C("character-local", "base.device.character",
1951
+ "a local char array filled and searched in device code", OMP_C11,
1952
+ cprog(cploop("char s[9] = \"abcdefgh\";\nint pos = 0;\n"
1953
+ "for (int k = 0; k < 8; k++)\n if (s[k] == s[i % 8] && pos == 0) "
1954
+ "pos = k + 1;\nb[i] = pos + 8;"),
1955
+ ref="i % 8 + 9"),
1956
+ mutant=(("b[i] = pos + 8;", "b[i] = pos;"),)),
1957
+ C("int8-loop", "base.device.int8_index",
1958
+ "a long long loop variable of the target loop", OMP_C11,
1959
+ cprog(_pragma("#pragma omp target teams distribute parallel for " + CPL)
1960
+ + "\n for (long long j = 0; j < n; j++) {\n"
1961
+ " b[j] = 2 * a[j] + 1;\n if (j == 0) " + CHF + "\n }\n"),
1962
+ mutant=(("b[j] = 2 * a[j] + 1;", "b[j] = 2 * a[j];"),)),
1963
+ C("parallel-in-seq-loop", "base.device.parallel_in_seq_loop",
1964
+ "a parallel for nested in a sequential loop of a target region",
1965
+ "OpenMP 5.2 §13.8 (target) and §10.1 (parallel)",
1966
+ cprog(_pragma("#pragma omp target map(to: a) map(tofrom: b, host_flag)")
1967
+ + "\n {\n " + CHF + "\n for (int k = 0; k < 3; k++) {\n"
1968
+ " #pragma omp parallel for\n for (int i = 0; i < n; i++)\n"
1969
+ " b[i] = b[i] + a[i];\n }\n }\n", ref="3 * (i + 1)"),
1970
+ mutant=(("b[i] = b[i] + a[i];", "b[i] = a[i];"),)),
1971
+ ]
1972
+
1973
+ _C_SUM = "s == n * (n + 1) / 2"
1974
+
1975
+
1976
+ def _c_crit(name="", hint=""):
1977
+ return (_pragma("#pragma omp target parallel for map(to: a) "
1978
+ "map(tofrom: s, host_flag)") + "\n"
1979
+ " for (int i = 0; i < n; i++) {\n"
1980
+ f" #pragma omp critical{name}{hint}\n"
1981
+ " {\n int t = s;\n s = t + a[i];\n }\n"
1982
+ f" if (i == 0) {CHF}\n }}\n")
1983
+
1984
+
1985
+ C_DIRECTIVES = [
1986
+ C("critical", "omp.directive.critical",
1987
+ "an unnamed critical construct in a target parallel loop",
1988
+ OMP_CRITICAL, cprog(_c_crit(), decls=" int s = 0;\n", check=_C_SUM),
1989
+ mutant_device="a race: without the construct the updates race",
1990
+ mutant=((" #pragma omp critical\n", ""),)),
1991
+ C("critical-named", "form.omp.critical_named",
1992
+ "a named critical construct in a target parallel loop", OMP_CRITICAL,
1993
+ cprog(_c_crit("(wsum)"), decls=" int s = 0;\n", check=_C_SUM),
1994
+ mutant_device="a race: without the construct the updates race",
1995
+ mutant=((" #pragma omp critical(wsum)\n", ""),)),
1996
+ C("critical-hint", "omp.clause.hint",
1997
+ "a named critical construct with a hint clause in a target parallel "
1998
+ "loop", OMP_CRITICAL + "; §15.1 (hint clause)",
1999
+ cprog(_c_crit("(wsum)", " hint(omp_sync_hint_contended)"),
2000
+ decls=" int s = 0;\n", check=_C_SUM),
2001
+ mutant_device="a race: without the construct the updates race",
2002
+ mutant=((" #pragma omp critical(wsum) hint(omp_sync_hint_contended)\n",
2003
+ ""),)),
2004
+ C("sections", "omp.directive.sections",
2005
+ "a sections construct with two sections in a target parallel region",
2006
+ OMP_SECTIONS,
2007
+ cprog(_pragma("#pragma omp target parallel map(to: a) "
2008
+ "map(tofrom: b, host_flag)") + """
2009
+ {
2010
+ #pragma omp sections
2011
+ {
2012
+ #pragma omp section
2013
+ {
2014
+ for (int i = 0; i < n / 2; i++) b[i] = 2 * a[i] + 1;
2015
+ host_flag = omp_is_initial_device();
2016
+ }
2017
+ #pragma omp section
2018
+ {
2019
+ for (int i = n / 2; i < n; i++) b[i] = a[i] + a[i] + 1;
2020
+ }
2021
+ }
2022
+ }
2023
+ """), mutant=(("b[i] = a[i] + a[i] + 1;", "b[i] = 0;"),)),
2024
+ C("parallel-sections", "omp.directive.parallel_sections",
2025
+ "a parallel sections construct nested in a target region",
2026
+ OMP_SECTIONS,
2027
+ cprog(_pragma("#pragma omp target map(to: a) map(tofrom: b, host_flag)")
2028
+ + """
2029
+ {
2030
+ host_flag = omp_is_initial_device();
2031
+ #pragma omp parallel sections
2032
+ {
2033
+ #pragma omp section
2034
+ {
2035
+ for (int i = 0; i < n / 2; i++) b[i] = 2 * a[i] + 1;
2036
+ }
2037
+ #pragma omp section
2038
+ {
2039
+ for (int i = n / 2; i < n; i++) b[i] = a[i] + a[i] + 1;
2040
+ }
2041
+ }
2042
+ }
2043
+ """), mutant=(("b[i] = a[i] + a[i] + 1;", "b[i] = 0;"),)),
2044
+ C("single", "omp.directive.single",
2045
+ "a single construct in a target parallel region",
2046
+ "OpenMP 5.2 §11.1, p.221 (single construct)",
2047
+ cprog(" #pragma omp target parallel map(tofrom: s, host_flag)\n {\n"
2048
+ " #pragma omp single\n {\n s = s + 1;\n " + CHF
2049
+ + "\n }\n }\n", decls=" int s = 0;\n", check="s == 1"),
2050
+ mutant=(("s = s + 1;", "s = s + 2;"),)),
2051
+ C("masked", "omp.directive.masked",
2052
+ "a masked construct in a target parallel region",
2053
+ "OpenMP 5.2 §10.5, p.214 (masked construct)",
2054
+ cprog(" #pragma omp target parallel map(tofrom: s, host_flag)\n {\n"
2055
+ " #pragma omp masked\n {\n s = s + 1;\n " + CHF
2056
+ + "\n }\n }\n", decls=" int s = 0;\n", check="s == 1"),
2057
+ mutant=(("s = s + 1;", "s = s + 2;"),)),
2058
+ C("barrier", "omp.directive.barrier",
2059
+ "a barrier between a write by every thread and a read by the primary "
2060
+ "thread in a target parallel region",
2061
+ "OpenMP 5.2 §15.3.1, p.317 (barrier construct)",
2062
+ cprog(_pragma("#pragma omp target parallel num_threads(4) "
2063
+ "map(tofrom: c, okf, host_flag)") + """
2064
+ {
2065
+ int tid = omp_get_thread_num();
2066
+ int nt = omp_get_num_threads();
2067
+ c[tid] = tid + 1;
2068
+ #pragma omp barrier
2069
+ if (tid == 0) {
2070
+ okf = 1;
2071
+ for (int k = 0; k < nt; k++)
2072
+ if (c[k] != k + 1) okf = 0;
2073
+ host_flag = omp_is_initial_device();
2074
+ }
2075
+ }
2076
+ """, decls=" int c[4] = {0, 0, 0, 0};\n int okf = 0;\n", check="okf == 1"),
2077
+ mutant=((" if (c[k] != k + 1) okf = 0;", " okf = 0;"),)),
2078
+ C("atomic", "omp.directive.atomic",
2079
+ "an atomic construct (update form, no clause) in a target loop",
2080
+ OMP_ATOMIC,
2081
+ cprog(cploop("#pragma omp atomic\ns = s + a[i];",
2082
+ "map(to: a) map(tofrom: s, host_flag)"),
2083
+ decls=" int s = 0;\n", check=_C_SUM),
2084
+ mutant=(("s = s + a[i];", "s = s + 1;"),)),
2085
+ C("atomic-update", "omp.clause.update",
2086
+ "an atomic update construct in a target loop", OMP_ATOMIC,
2087
+ cprog(cploop("#pragma omp atomic update\ns = s + a[i];",
2088
+ "map(to: a) map(tofrom: s, host_flag)"),
2089
+ decls=" int s = 0;\n", check=_C_SUM),
2090
+ mutant=(("s = s + a[i];", "s = s + 1;"),)),
2091
+ C("atomic-capture", "omp.clause.capture",
2092
+ "an atomic capture construct (each iteration takes a ticket) in a "
2093
+ "target loop", OMP_ATOMIC,
2094
+ cprog(cploop("int t;\n#pragma omp atomic capture\nt = s++;\nb[i] = t;",
2095
+ "map(tofrom: s, b, host_flag)"),
2096
+ ref="0", decls=" int s = 0;\n",
2097
+ check="s == n && sumv(b) == n * (n - 1) / 2",
2098
+ helpers="static int sumv(int *v) {\n int r = 0;\n"
2099
+ " for (int i = 0; i < n; i++) r += v[i];\n return r;\n}")
2100
+ .replace(" ok = ok && (b[i] == ref[i]);\n", " ok = ok && true;\n"),
2101
+ mutant=(("t = s++;", "t = s += 2;"),)),
2102
+ C("atomic-write", "omp.clause.write",
2103
+ "an atomic write construct in a target loop", OMP_ATOMIC,
2104
+ cprog(cploop("b[i] = 2 * a[i] + 1;\nif (i == n - 1) {\n"
2105
+ " #pragma omp atomic write\n w = 7;\n}",
2106
+ "map(to: a) map(from: b) map(tofrom: w, host_flag)"),
2107
+ ref="2 * (i + 1) + 1", decls=" int w = 0;\n", check="w == 7"),
2108
+ mutant=((" w = 7;", " w = 6;"),)),
2109
+ C("atomic-read", "omp.clause.read",
2110
+ "an atomic read construct in a target loop", OMP_ATOMIC,
2111
+ cprog(cploop("int t;\n#pragma omp atomic read\nt = w;\nb[i] = a[i] + t;",
2112
+ "map(to: a, w) map(from: b) map(tofrom: host_flag)"),
2113
+ ref="i + 1 + 7", decls=" int w = 7;\n"),
2114
+ mutant=(("b[i] = a[i] + t;", "b[i] = a[i];"),)),
2115
+ C("ordered", "omp.directive.ordered",
2116
+ "an ordered region in a target parallel for with the ordered clause",
2117
+ "OpenMP 5.2 §15.10.1, p.338 (ordered construct)",
2118
+ cprog(_pragma("#pragma omp target parallel for ordered map(to: a) "
2119
+ "map(tofrom: b, cnt, host_flag)") + """
2120
+ for (int i = 0; i < n; i++) {
2121
+ #pragma omp ordered
2122
+ {
2123
+ b[cnt] = a[i];
2124
+ cnt = cnt + 1;
2125
+ }
2126
+ if (i == 0) host_flag = omp_is_initial_device();
2127
+ }
2128
+ """, ref="i + 1", decls=" int cnt = 0;\n", check="cnt == n"),
2129
+ mutant=(("b[cnt] = a[i];", "b[cnt] = a[n - 1 - i];"),)),
2130
+ C("task", "omp.directive.task",
2131
+ "a task and a taskwait in a target region",
2132
+ "OpenMP 5.2 §12.5, p.247 (task construct)",
2133
+ cprog(" #pragma omp target map(tofrom: s, host_flag)\n {\n " + CHF
2134
+ + "\n #pragma omp task shared(s)\n s = s + 1;\n"
2135
+ " #pragma omp taskwait\n }\n", decls=" int s = 0;\n",
2136
+ check="s == 1"),
2137
+ mutant=(("s = s + 1;", "s = s + 2;"),)),
2138
+ C("declare-mapper", "omp.directive.declare_mapper",
2139
+ "a default declare mapper of a struct with a pointer member, applied "
2140
+ "by map(to: r) in a target loop", OMP_MAPPER,
2141
+ cprog(cploop("b[i] = r.p[i] + 1;", "map(to: r) map(from: b) "
2142
+ "map(tofrom: host_flag)"),
2143
+ ref="3 * (i + 1) + 1", helpers="struct rec { int m; int *p; };\n"
2144
+ "#pragma omp declare mapper(struct rec x) map(x, x.p[0:x.m])",
2145
+ decls=" int store[n];\n struct rec r;\n",
2146
+ init=" for (int i = 0; i < n; i++) store[i] = 3 * (i + 1);\n"
2147
+ " r.m = n;\n r.p = store;\n"),
2148
+ mutant_device="copy semantics: without the mapper the pointee is not "
2149
+ "mapped (map(to: r) copies the host address); under "
2150
+ "unified memory the host address still works",
2151
+ mutant=(("#pragma omp declare mapper(struct rec x) map(x, x.p[0:x.m])\n",
2152
+ ""),)),
2153
+ ]
2154
+
2155
+ _C_A2 = (" int a2[n][4], c2[n][4];\n",
2156
+ " for (int i = 0; i < n; i++)\n for (int j = 0; j < 4; j++) {\n"
2157
+ " a2[i][j] = (i + 1) * (j + 1);\n c2[i][j] = 0;\n }\n")
2158
+
2159
+
2160
+ def c2loop(body: str, clauses: str) -> str:
2161
+ return (_pragma("#pragma omp target teams distribute parallel for "
2162
+ "collapse(2) " + clauses) + "\n"
2163
+ " for (int i = 0; i < n; i++)\n for (int j = 0; j < 4; j++) {\n"
2164
+ + _ind(body, 6) + f"\n if (i == 0 && j == 0) {CHF}\n }}\n")
2165
+
2166
+
2167
+ _C2_CHECK = ("c2ok(a2, c2)", "static bool c2ok(int a2[n][4], int c2[n][4]) {\n"
2168
+ " for (int i = 0; i < n; i++)\n for (int j = 0; j < 4; j++)\n"
2169
+ " if (c2[i][j] != 2 * a2[i][j] + 1) return false;\n"
2170
+ " return true;\n}")
2171
+
2172
+
2173
+ def CP(slug, a, b, feature, body, **kw):
2174
+ return CSpec(slug, f"pair.{a}+{b}", feature, kw.pop(
2175
+ "spec", "the parts' own programs"), body, parts=(a, b), **kw)
2176
+
2177
+
2178
+ C_PAIRS = [
2179
+ CP("collapse-private-array", "omp.clause.collapse",
2180
+ "base.device.private_array", "a private array in a collapse(2) target "
2181
+ "loop",
2182
+ cprog(c2loop("t[0] = a2[i][j];\nt[1] = 1;\nt[2] = a2[i][j];\nt[3] = 0;\n"
2183
+ "c2[i][j] = t[0] + t[1] + t[2] + t[3];",
2184
+ "map(to: a2) map(from: c2) map(tofrom: host_flag) private(t)"),
2185
+ decls=_C_A2[0] + _C_PRIV, init=_C_A2[1], check=_C2_CHECK[0],
2186
+ helpers=_C2_CHECK[1]),
2187
+ mutant=(("t[1] = 1;", "t[1] = 0;"),)),
2188
+ CP("collapse-reduction", "omp.clause.collapse", "omp.clause.reduction",
2189
+ "a sum reduction over a collapse(2) target loop",
2190
+ cprog(c2loop("s += a2[i][j];", "map(to: a2) map(tofrom: host_flag) "
2191
+ "reduction(+: s)"),
2192
+ decls=_C_A2[0] + " int s = 0;\n", init=_C_A2[1],
2193
+ check="s == 10 * n * (n + 1) / 2"),
2194
+ mutant=(("s += a2[i][j];", "s += 1;"),)),
2195
+ CP("collapse-routine-call", "omp.clause.collapse",
2196
+ "base.device.routine_call", "a declare target function called in a "
2197
+ "collapse(2) target loop",
2198
+ cprog(c2loop("c2[i][j] = tw(a2[i][j]);",
2199
+ "map(to: a2) map(from: c2) map(tofrom: host_flag)"),
2200
+ decls=_C_A2[0], init=_C_A2[1], check=_C2_CHECK[0],
2201
+ helpers=_C_TW + "\n" + _C2_CHECK[1]),
2202
+ mutant=(("return 2 * x + 1;", "return 2 * x;"),)),
2203
+ CP("reduction-routine-call", "omp.clause.reduction",
2204
+ "base.device.routine_call", "a declare target function called in a "
2205
+ "sum reduction loop",
2206
+ cprog(cploop("s += tw(a[i]);", "map(to: a) map(tofrom: host_flag) "
2207
+ "reduction(+: s)"), decls=" int s = 0;\n",
2208
+ check="s == n * (n + 1) + n", helpers=_C_TW),
2209
+ mutant=(("return 2 * x + 1;", "return 2 * x;"),)),
2210
+ CP("update-pointer-component", "omp.directive.target_update",
2211
+ "base.device.pointer_component",
2212
+ "a struct and its pointee kept on the device by enter data, the "
2213
+ "pointee updated from the host between two target loops",
2214
+ cprog(" #pragma omp target enter data map(to: r, r.p[0:n])\n"
2215
+ + cploop("b[i] = r.p[i] + 1;", "map(from: b) map(tofrom: host_flag)")
2216
+ + " for (int i = 0; i < n; i++) store[i] = 5 * (i + 1);\n"
2217
+ " #pragma omp target update to(r.p[0:n])\n"
2218
+ + cploop("b[i] = b[i] + r.p[i];", "map(tofrom: b)", flag=False)
2219
+ + " #pragma omp target exit data map(delete: r.p[0:n], r)\n",
2220
+ ref="8 * (i + 1) + 1", helpers="struct rec { int m; int *p; };",
2221
+ decls=" int store[n];\n struct rec r;\n",
2222
+ init=" for (int i = 0; i < n; i++) store[i] = 3 * (i + 1);\n"
2223
+ " r.m = n;\n r.p = store;\n"),
2224
+ mutant_device="copy semantics: without the update the device keeps the old values (separate memory only)",
2225
+ mutant=((" #pragma omp target update to(r.p[0:n])\n", ""),)),
2226
+ CP("atomic-reduction", "omp.directive.atomic", "omp.clause.reduction",
2227
+ "an atomic update of one variable and a sum reduction of another in "
2228
+ "one target loop",
2229
+ cprog(cploop("s += a[i];\n#pragma omp atomic\nw = w + 1;",
2230
+ "map(to: a) map(tofrom: w, host_flag) reduction(+: s)"),
2231
+ decls=" int s = 0, w = 0;\n", check=_C_SUM + " && w == n"),
2232
+ mutant=(("w = w + 1;", "w = w + 2;"),)),
2233
+ CP("critical-reduction", "omp.directive.critical", "omp.clause.reduction",
2234
+ "a critical update of one variable and a sum reduction of another in "
2235
+ "one target parallel loop",
2236
+ cprog(_pragma("#pragma omp target parallel for map(to: a) "
2237
+ "map(tofrom: w, host_flag) reduction(+: s)") + """
2238
+ for (int i = 0; i < n; i++) {
2239
+ s += a[i];
2240
+ #pragma omp critical
2241
+ w = w + 1;
2242
+ if (i == 0) host_flag = omp_is_initial_device();
2243
+ }
2244
+ """, decls=" int s = 0, w = 0;\n", check=_C_SUM + " && w == n"),
2245
+ mutant=(("w = w + 1;", "w = w + 2;"),)),
2246
+ CP("private-array-routine-arg", "base.device.private_array",
2247
+ "base.device.routine_call",
2248
+ "a private array passed to a declare target function",
2249
+ cprog(cploop("fill(t, a[i]);\nb[i] = t[0] + t[1] + t[2] + t[3];",
2250
+ CPL + " private(t)"), ref="2 * (i + 1) + 1",
2251
+ decls=_C_PRIV, helpers="""\
2252
+ #pragma omp declare target
2253
+ void fill(int *x, int v) {
2254
+ for (int k = 0; k < 4; k++) x[k] = 0;
2255
+ x[0] = v;
2256
+ x[1] = v + 1;
2257
+ }
2258
+ #pragma omp end declare target"""),
2259
+ mutant=(("x[1] = v + 1;", "x[1] = v;"),)),
2260
+ CP("mapper-reduction", "omp.directive.declare_mapper",
2261
+ "omp.clause.reduction",
2262
+ "a sum reduction over the pointee of a struct mapped through its "
2263
+ "default mapper",
2264
+ cprog(cploop("s += r.p[i];", "map(to: r) map(tofrom: host_flag) "
2265
+ "reduction(+: s)"),
2266
+ helpers="struct rec { int m; int *p; };\n"
2267
+ "#pragma omp declare mapper(struct rec x) map(x, x.p[0:x.m])",
2268
+ decls=" int store[n];\n struct rec r;\n int s = 0;\n",
2269
+ init=" for (int i = 0; i < n; i++) store[i] = 3 * (i + 1);\n"
2270
+ " r.m = n;\n r.p = store;\n",
2271
+ check="s == 3 * n * (n + 1) / 2"),
2272
+ mutant_device="copy semantics: without the mapper the pointee is not "
2273
+ "mapped; under unified memory the host address still "
2274
+ "works",
2275
+ mutant=(("#pragma omp declare mapper(struct rec x) map(x, x.p[0:x.m])\n",
2276
+ ""),)),
2277
+ CP("mapper-iterator", "omp.directive.declare_mapper",
2278
+ "omp.clause.map.iterator",
2279
+ "a default declare mapper whose map clause has an iterator over the "
2280
+ "pointer members of a struct",
2281
+ cprog(cploop("b[i] = r.p[0][i] + r.p[1][i];", "map(to: r) map(from: b) "
2282
+ "map(tofrom: host_flag)"),
2283
+ ref="5 * (i + 1)", helpers="struct rec2 { int m; int *p[2]; };\n"
2284
+ "#pragma omp declare mapper(struct rec2 x) map(x) "
2285
+ "map(iterator(k = 0:2), to: x.p[k][0:x.m])",
2286
+ decls=" int s0[n], s1[n];\n struct rec2 r;\n",
2287
+ init=" for (int i = 0; i < n; i++) {\n s0[i] = 2 * (i + 1);\n"
2288
+ " s1[i] = 3 * (i + 1);\n }\n r.m = n;\n r.p[0] = s0;\n"
2289
+ " r.p[1] = s1;\n"),
2290
+ spec="OpenMP 5.2 \u00a75.8.8 (declare mapper) and \u00a73.2.6 "
2291
+ "(iterator modifier)",
2292
+ mutant_device="copy semantics: without the mapper the pointees are "
2293
+ "not mapped; under unified memory the host addresses "
2294
+ "still work",
2295
+ mutant=(("#pragma omp declare mapper(struct rec2 x) map(x) "
2296
+ "map(iterator(k = 0:2), to: x.p[k][0:x.m])\n", ""),)),
2297
+ CP("allocate-const-firstprivate", "omp.clause.allocate",
2298
+ "omp.clause.firstprivate",
2299
+ "a firstprivate scalar allocated with omp_const_mem_alloc "
2300
+ "(uses_allocators) on a target loop",
2301
+ cprog(cploop("b[i] = a[i] + x;", CPL + " firstprivate(x) "
2302
+ "allocate(omp_const_mem_alloc: x) "
2303
+ "uses_allocators(omp_const_mem_alloc)"),
2304
+ ref="i + 1 + 5", decls=" int x = 5;\n"),
2305
+ mutant=(("b[i] = a[i] + x;", "b[i] = a[i];"),)),
2306
+ CP("lastprivate-parallel-in-seq-loop", "omp.clause.lastprivate",
2307
+ "base.device.parallel_in_seq_loop",
2308
+ "lastprivate on a parallel for nested in a sequential loop of a "
2309
+ "target region",
2310
+ cprog(_pragma("#pragma omp target map(to: a) map(tofrom: b, host_flag)")
2311
+ + """
2312
+ {
2313
+ host_flag = omp_is_initial_device();
2314
+ for (int k = 0; k < 3; k++) {
2315
+ int last = 0;
2316
+ #pragma omp parallel for lastprivate(last)
2317
+ for (int i = 0; i < n; i++)
2318
+ last = a[i] + k;
2319
+ b[k] = last;
2320
+ }
2321
+ }
2322
+ """, ref="i < 3 ? n + i : 0"),
2323
+ mutant=(("last = a[i] + k;", "last = a[i];"),)),
2324
+ CP("reduction-parallel-in-seq-loop", "omp.clause.reduction",
2325
+ "base.device.parallel_in_seq_loop",
2326
+ "a reduction on a parallel for nested in a sequential loop of a "
2327
+ "target region",
2328
+ cprog(_pragma("#pragma omp target map(to: a) map(tofrom: s, host_flag)")
2329
+ + """
2330
+ {
2331
+ host_flag = omp_is_initial_device();
2332
+ for (int k = 0; k < 3; k++) {
2333
+ #pragma omp parallel for reduction(+: s)
2334
+ for (int i = 0; i < n; i++)
2335
+ s += a[i];
2336
+ }
2337
+ }
2338
+ """, decls=" int s = 0;\n", check="s == 3 * n * (n + 1) / 2"),
2339
+ mutant=((" s += a[i];", " s += 1;"),)),
2340
+ CP("defaultmap-present-private-array", "omp.clause.defaultmap.present",
2341
+ "base.device.private_array",
2342
+ "defaultmap(present: aggregate) with a private array on the same "
2343
+ "target loop (the arrays the loop maps are present by enter data)",
2344
+ cprog(" #pragma omp target enter data map(to: a) map(alloc: b)\n"
2345
+ + cploop("t[0] = a[i];\nt[1] = 1;\nt[2] = a[i];\nt[3] = 0;\n"
2346
+ "b[i] = t[0] + t[1] + t[2] + t[3];",
2347
+ "defaultmap(present: aggregate) private(t) "
2348
+ "map(tofrom: host_flag)")
2349
+ + " #pragma omp target exit data map(from: b) map(release: a)\n",
2350
+ decls=_C_PRIV),
2351
+ mutant=(("t[1] = 1;", "t[1] = 0;"),),
2352
+ spec="OpenMP 5.2 §5.8.7, p.161 (defaultmap applies to variables "
2353
+ "without an explicitly determined attribute: the private array "
2354
+ "is not one)"),
2355
+ CP("reduction-derived-array", "omp.clause.reduction",
2356
+ "base.device.derived_array",
2357
+ "a sum reduction over the members of a mapped array of structs",
2358
+ cprog(cploop("s += ps[i].x + ps[i].y;", "map(to: ps) "
2359
+ "map(tofrom: host_flag) reduction(+: s)"),
2360
+ helpers="struct pt { int x; int y; };",
2361
+ decls=" struct pt ps[n];\n int s = 0;\n",
2362
+ init=" for (int i = 0; i < n; i++) {\n ps[i].x = i + 1;\n"
2363
+ " ps[i].y = 2 * (i + 1);\n }\n",
2364
+ check="s == 3 * n * (n + 1) / 2"),
2365
+ mutant=(("s += ps[i].x + ps[i].y;", "s += ps[i].x;"),)),
2366
+ CP("reduction-complex", "omp.clause.reduction", "base.device.complex",
2367
+ "a double _Complex sum reduction",
2368
+ cprog(cploop("z += (double)a[i] - (double)a[i] * I;",
2369
+ "map(to: a) map(tofrom: host_flag) reduction(+: z)"),
2370
+ includes="#include <complex.h>\n", decls=" double _Complex z = 0;\n",
2371
+ check="creal(z) == n * (n + 1) / 2.0 && cimag(z) == "
2372
+ "-n * (n + 1) / 2.0"),
2373
+ mutant=(("z += (double)a[i] - (double)a[i] * I;",
2374
+ "z += (double)a[i] + (double)a[i] * I;"),)),
2375
+ ]
2376
+
2377
+
2378
+
2379
+ # (see F_APPS)
2380
+ C_APPS = [
2381
+ CP("update-depend", "omp.directive.target_update", "omp.clause.depend",
2382
+ "a target update with a depend clause between two device loops "
2383
+ "(then taskwait)",
2384
+ cprog(" #pragma omp target enter data map(to: a) map(alloc: b)\n"
2385
+ + cploop("b[i] = 2 * a[i] + 1;", "map(tofrom: host_flag)")
2386
+ + " #pragma omp target update from(b) depend(inout: b)\n"
2387
+ " #pragma omp taskwait\n"
2388
+ " #pragma omp target exit data map(delete: a, b)\n"),
2389
+ spec=OMP_UPDATE_DEPEND,
2390
+ mutant=((" #pragma omp target update from(b) depend(inout: b)\n",
2391
+ ""),),
2392
+ mutant_device="copy semantics: without the update the host keeps "
2393
+ "b = 0 (separate memory only)"),
2394
+ ]
2395
+
2396
+ C_SPECS = C_BASE + C_DIRECTIVES + C_PAIRS + C_APPS