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,1721 @@
1
+ """nested-data: programs that map nested pointer-linked data structures to
2
+ the device.
3
+
4
+ A program is a shape (the structure the host builds), a kernel (what the
5
+ device does to every object reachable from the root) and a plan (the
6
+ data-mapping constructs that make the structure visible). Every legal plan
7
+ of one shape and kernel gives the same result, which `simulate` computes
8
+ in Python, so the expected output never comes from a compiler.
9
+
10
+ Cfg is one point of the axes. build_shape(cfg) builds types, objects and
11
+ links. simulate(shape) returns the expected `name= value` lines.
12
+ make_plan(shape) returns a strategy's constructs. validate(shape, plan)
13
+ replays them against the spec and reports defined, unspecified or illegal;
14
+ the last two are generated only as marked negatives or observations.
15
+ Rendering is in offload.engine.nested_emit, spec citations in nested_cites."""
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import random
20
+ from collections import defaultdict
21
+ from dataclasses import dataclass, field, replace
22
+
23
+ from offload.engine import nested_cites as NC
24
+
25
+ NM = 8 # elements of every data array
26
+ NK = 2 # children of an array-like link
27
+ BIG = 10 ** 6 # reference count of a declare target variable
28
+
29
+ LINKS = {"c": ("embed", "arr", "ptr", "parr", "ptrs", "pp"),
30
+ "f": ("embed", "arr", "ptr", "alloc", "aarr", "parr")}
31
+ DATAS = {"c": ("fixed", "ptr"), "f": ("fixed", "ptr", "alloc")}
32
+ ROLES = ("in", "inout", "out")
33
+ TOPOS = ("chain", "list", "tree", "diamond", "twin", "alias", "aliassub")
34
+ STRATEGIES = ("one", "enter", "tdata", "tdata_nested", "present", "always",
35
+ "close", "update", "mapper", "mapper_enter", "acc_data")
36
+ SINGLE = ("embed", "ptr", "alloc") # one child
37
+ MANY = ("arr", "parr", "ptrs", "pp", "aarr") # NK children
38
+
39
+
40
+ @dataclass(frozen=True)
41
+ class Cfg:
42
+ lang: str # "c" | "f"
43
+ model: str # "omp" | "acc"
44
+ topo: str = "chain"
45
+ depth: int = 2
46
+ links: tuple = () # chain: link kind of each level but the last
47
+ datas: tuple = ("fixed",) # data member kind per level (cycled)
48
+ roles: tuple = ("inout",) # role per depth (cycled)
49
+ null_at: int = -1 # depth whose outgoing link is NULL
50
+ kernel: str = "serial" # serial | par
51
+ strategy: str = "one"
52
+ order: str = "td" # td | bu | shuf
53
+ mods: str = "" # "" | always | present | close
54
+ root: str = "var" # var | heap | global
55
+ mutate: str = "" # a negative's mutation (see MUTATIONS)
56
+
57
+ def key(self) -> str:
58
+ return "|".join(str(v) for v in (
59
+ self.lang, self.model, self.topo, self.depth, self.links,
60
+ self.datas, self.roles, self.null_at, self.kernel,
61
+ self.strategy, self.order, self.mods, self.root, self.mutate))
62
+
63
+ @property
64
+ def uid(self) -> str:
65
+ return hashlib.sha256(self.key().encode()).hexdigest()[:8]
66
+
67
+
68
+ @dataclass
69
+ class TypeDef:
70
+ name: str
71
+ data: str # fixed | ptr | alloc
72
+ links: list = field(default_factory=list) # (member, kind, target type)
73
+
74
+
75
+ @dataclass
76
+ class Node:
77
+ nid: int
78
+ type: str
79
+ depth: int
80
+ group: int # nid of the group root (container)
81
+ role: str = "inout"
82
+ owner: int = -1 # node whose data array this node uses
83
+ off: int = 0
84
+ length: int = NM
85
+
86
+
87
+ @dataclass
88
+ class Edge:
89
+ eid: int
90
+ parent: int
91
+ member: str
92
+ kind: str
93
+ children: tuple # nid or None per child
94
+
95
+
96
+ @dataclass
97
+ class Shape:
98
+ cfg: Cfg
99
+ types: dict
100
+ order: list # type names, dependencies first
101
+ nodes: dict
102
+ edges: list
103
+ root: int
104
+ contained: frozenset
105
+
106
+ def out_edges(self, nid):
107
+ return [e for e in self.edges if e.parent == nid]
108
+
109
+ def separate_data(self, n: Node) -> bool:
110
+ k = self.types[n.type].data
111
+ return k == "ptr" or (k == "alloc" and not (
112
+ self.cfg.lang == "f" and self.cfg.model == "omp"))
113
+
114
+
115
+ # --- the shape --------------------------------------------------------------------------
116
+
117
+ def _contained(cfg: Cfg) -> frozenset:
118
+ s = {"embed", "arr"}
119
+ if cfg.lang == "f" and cfg.model == "omp":
120
+ s |= {"alloc", "aarr"}
121
+ return frozenset(s)
122
+
123
+
124
+ def _check_cfg(cfg: Cfg):
125
+ if cfg.lang not in LINKS:
126
+ raise ValueError(f"language {cfg.lang}")
127
+ for k in cfg.links:
128
+ if k not in LINKS[cfg.lang]:
129
+ raise ValueError(f"link kind {k} not in {cfg.lang}")
130
+ for k in cfg.datas:
131
+ if k not in DATAS[cfg.lang]:
132
+ raise ValueError(f"data kind {k} not in {cfg.lang}")
133
+ if cfg.topo not in TOPOS:
134
+ raise ValueError(f"topology {cfg.topo}")
135
+ if not 1 <= cfg.depth <= 4:
136
+ raise ValueError("depth 1..4")
137
+
138
+
139
+ def build_shape(cfg: Cfg) -> Shape:
140
+ _check_cfg(cfg)
141
+ contained = _contained(cfg)
142
+ types, order = {}, []
143
+ nodes: dict[int, Node] = {}
144
+ edges: list[Edge] = []
145
+
146
+ def datak(level):
147
+ return cfg.datas[level % len(cfg.datas)]
148
+
149
+ def addtype(t: TypeDef):
150
+ types[t.name] = t
151
+ order.append(t.name)
152
+
153
+ def addnode(tname, depth, group=None) -> int:
154
+ nid = len(nodes)
155
+ nodes[nid] = Node(nid, tname, depth, nid if group is None else group,
156
+ owner=nid)
157
+ return nid
158
+
159
+ def addedge(parent, member, kind, children):
160
+ e = Edge(len(edges), parent, member, kind, tuple(children))
161
+ edges.append(e)
162
+ return e
163
+
164
+ def link(parent, member, kind, tname, nullable_edge):
165
+ """A link of `parent` to new objects of type `tname`."""
166
+ p = nodes[parent]
167
+ n = NK if kind in MANY else 1
168
+ null = nullable_edge
169
+ kids = []
170
+ group = None
171
+ for k in range(n):
172
+ if null and (kind in ("ptrs", "pp") and k == n - 1 or
173
+ kind not in ("ptrs", "pp")):
174
+ kids.append(None)
175
+ continue
176
+ if kind in contained:
177
+ g = p.group
178
+ elif kind in ("parr", "aarr"):
179
+ g = group # all elements in one block
180
+ else:
181
+ g = None
182
+ c = addnode(tname, p.depth + 1, g)
183
+ if kind in ("parr", "aarr") and group is None:
184
+ group = c
185
+ kids.append(c)
186
+ return addedge(parent, member, kind, kids)
187
+
188
+ def expand(nid):
189
+ p = nodes[nid]
190
+ for (m, kind, tname) in types[p.type].links:
191
+ is_null = cfg.null_at == p.depth and kind not in (
192
+ "embed", "arr")
193
+ e = link(nid, m, kind, tname, is_null)
194
+ for c in e.children:
195
+ if c is not None:
196
+ expand(c)
197
+
198
+ if cfg.topo == "chain":
199
+ for lv in range(cfg.depth - 1, -1, -1):
200
+ t = TypeDef(f"n{lv}", datak(lv))
201
+ if lv < cfg.depth - 1:
202
+ t.links.append(("nx", cfg.links[lv], f"n{lv + 1}"))
203
+ addtype(t)
204
+ root = addnode("n0", 0)
205
+ expand(root)
206
+ elif cfg.topo == "list":
207
+ addtype(TypeDef("node", datak(0), [("nx", "ptr", "node")]))
208
+ root = addnode("node", 0)
209
+ cur = root
210
+ for d in range(1, cfg.depth):
211
+ nullcut = cfg.null_at == d - 1
212
+ if nullcut:
213
+ addedge(cur, "nx", "ptr", [None])
214
+ break
215
+ c = addnode("node", d)
216
+ addedge(cur, "nx", "ptr", [c])
217
+ cur = c
218
+ else:
219
+ addedge(cur, "nx", "ptr", [None])
220
+ elif cfg.topo == "tree":
221
+ addtype(TypeDef("node", datak(0), [("l", "ptr", "node"),
222
+ ("r", "ptr", "node")]))
223
+ root = addnode("node", 0)
224
+
225
+ def grow(nid, d):
226
+ for m in ("l", "r"):
227
+ if d + 1 < cfg.depth and not (
228
+ cfg.null_at == d and m == "r"):
229
+ c = addnode("node", d + 1)
230
+ addedge(nid, m, "ptr", [c])
231
+ grow(c, d + 1)
232
+ else:
233
+ addedge(nid, m, "ptr", [None])
234
+ grow(root, 0)
235
+ elif cfg.topo == "diamond":
236
+ addtype(TypeDef("n2", datak(2)))
237
+ addtype(TypeDef("n1", datak(1), [("c", "ptr", "n2")]))
238
+ addtype(TypeDef("n0", datak(0), [("l", "ptr", "n1"),
239
+ ("r", "ptr", "n1")]))
240
+ root = addnode("n0", 0)
241
+ x = addnode("n1", 1)
242
+ y = addnode("n1", 1)
243
+ leaf = addnode("n2", 2)
244
+ addedge(root, "l", "ptr", [x])
245
+ addedge(root, "r", "ptr", [y])
246
+ addedge(x, "c", "ptr", [leaf])
247
+ addedge(y, "c", "ptr", [leaf])
248
+ elif cfg.topo == "twin":
249
+ addtype(TypeDef("n1", datak(1)))
250
+ addtype(TypeDef("n0", datak(0), [("l", "ptr", "n1"),
251
+ ("r", "ptr", "n1")]))
252
+ root = addnode("n0", 0)
253
+ m = addnode("n1", 1)
254
+ addedge(root, "l", "ptr", [m])
255
+ addedge(root, "r", "ptr", [m])
256
+ else: # alias, aliassub
257
+ addtype(TypeDef("n1", "ptr"))
258
+ addtype(TypeDef("n0", "ptr", [("nx", "ptr", "n1")]))
259
+ root = addnode("n0", 0)
260
+ c = addnode("n1", 1)
261
+ addedge(root, "nx", "ptr", [c])
262
+ nodes[c].owner = root
263
+ if cfg.topo == "aliassub":
264
+ nodes[c].off = 2
265
+ nodes[c].length = NM - 2
266
+ shape = Shape(cfg, types, order, nodes, edges, root, contained)
267
+ for n in nodes.values(): # roles by the depth of the group root
268
+ g = nodes[n.group]
269
+ n.role = cfg.roles[g.depth % len(cfg.roles)]
270
+ if cfg.topo in ("alias", "aliassub"): # one array, one role
271
+ for n in nodes.values():
272
+ n.role = nodes[root].role
273
+ return shape
274
+
275
+
276
+ # --- visits and the model ---------------------------------------------------------------
277
+
278
+ @dataclass(frozen=True)
279
+ class Visit:
280
+ nid: int
281
+ depth: int
282
+ path: tuple # ((eid, k), ...)
283
+ j: int
284
+
285
+
286
+ def visits(shape: Shape) -> list[Visit]:
287
+ out: list[Visit] = []
288
+
289
+ def go(nid, path):
290
+ out.append(Visit(nid, shape.nodes[nid].depth, path, len(out)))
291
+ for e in shape.out_edges(nid):
292
+ for k, c in enumerate(e.children):
293
+ if c is not None:
294
+ go(c, path + ((e.eid, k),))
295
+ go(shape.root, ())
296
+ return out
297
+
298
+
299
+ def first_path(shape: Shape) -> dict:
300
+ fp = {}
301
+ for v in visits(shape):
302
+ fp.setdefault(v.nid, v.path)
303
+ return fp
304
+
305
+
306
+ def init_values(shape: Shape):
307
+ """(s, a): host initial scalar per node and data array per owner."""
308
+ s, a = {}, {}
309
+ for n in shape.nodes.values():
310
+ out = n.role == "out"
311
+ s[n.nid] = -1 if out else 10 * (n.depth + 1) + n.nid
312
+ if n.owner == n.nid:
313
+ a[n.nid] = [(-1 if out else 100 * (n.nid + 1) + i)
314
+ for i in range(NM)]
315
+ return s, a
316
+
317
+
318
+ def levels(shape: Shape) -> list[int]:
319
+ return sorted({n.depth for n in shape.nodes.values()})
320
+
321
+
322
+ def simulate(shape: Shape) -> list[tuple[str, int]]:
323
+ """The expected output: ``tot`` (what the device computed) and, per
324
+ depth, ``ha<L>`` (host sum of the data arrays of the objects at that
325
+ depth, per visit) and ``hs<L>`` (host sum of their scalars). A scalar
326
+ is not checked at a depth with an ``out`` object in a parallel kernel
327
+ (the device never writes it, so the copy back is not defined)."""
328
+ cfg = shape.cfg
329
+ s, a = init_values(shape)
330
+ vs = visits(shape)
331
+ tot = 0
332
+
333
+ def elem(v, i):
334
+ n = shape.nodes[v.nid]
335
+ return n.owner, n.off + i
336
+
337
+ def ops(v, i):
338
+ nonlocal tot
339
+ n = shape.nodes[v.nid]
340
+ L = v.depth + 1
341
+ o, ix = elem(v, i)
342
+ if n.role in ("in", "inout"):
343
+ tot += L * a[o][ix]
344
+ if n.role == "inout":
345
+ a[o][ix] += 7 * L
346
+ elif n.role == "out":
347
+ a[o][ix] = 500 * L + 10 * v.j + i
348
+
349
+ def sops(v):
350
+ nonlocal tot
351
+ n = shape.nodes[v.nid]
352
+ if n.role in ("in", "inout"):
353
+ tot += s[v.nid]
354
+ if n.role == "inout":
355
+ s[v.nid] += 3
356
+ elif n.role == "out":
357
+ s[v.nid] = 900 + v.j
358
+
359
+ if cfg.kernel == "serial":
360
+ for v in vs:
361
+ for i in range(shape.nodes[v.nid].length):
362
+ ops(v, i)
363
+ sops(v)
364
+ else:
365
+ for i in range(NM):
366
+ for v in vs:
367
+ if i < shape.nodes[v.nid].length:
368
+ ops(v, i)
369
+ out = [("tot", tot)]
370
+ for L in levels(shape):
371
+ at = [v for v in vs if v.depth == L]
372
+ out.append((f"ha{L}", sum(
373
+ sum(a[shape.nodes[v.nid].owner][shape.nodes[v.nid].off + i]
374
+ for i in range(shape.nodes[v.nid].length)) for v in at)))
375
+ if scalar_checked(shape, L):
376
+ out.append((f"hs{L}", sum(s[v.nid] for v in at)))
377
+ return out
378
+
379
+
380
+ def scalar_checked(shape: Shape, depth: int) -> bool:
381
+ if shape.cfg.kernel == "serial":
382
+ return True
383
+ return all(n.role != "out" for n in shape.nodes.values()
384
+ if n.depth == depth)
385
+
386
+
387
+ # --- blocks, references, plans ------------------------------------------------------------
388
+
389
+ # A reference names one list item of a plan:
390
+ # ("root",) the root structure
391
+ # ("e", eid, k) the objects a pointer-like link points to (k: child
392
+ # index; None for a whole array of objects)
393
+ # ("pa", eid) the array of pointers behind a pp link
394
+ # ("d", nid) the array a pointer/allocatable data member points to
395
+
396
+ def separate_edges(shape: Shape):
397
+ return [e for e in shape.edges if e.kind not in shape.contained]
398
+
399
+
400
+ def group_of(shape, nid):
401
+ return shape.nodes[nid].group
402
+
403
+
404
+ def refs_of(shape: Shape) -> dict:
405
+ """ref -> (holder block, target block, role of the target)."""
406
+ nodes = shape.nodes
407
+ out = {}
408
+ root = shape.root
409
+ out[("root",)] = (None, ("g", nodes[root].group), nodes[root].role)
410
+ for e in separate_edges(shape):
411
+ hold = ("g", nodes[e.parent].group)
412
+ if e.kind == "pp":
413
+ out[("pa", e.eid)] = (hold, ("pa", e.eid), "in")
414
+ hold = ("pa", e.eid)
415
+ if e.kind in ("parr", "aarr"):
416
+ first = next((c for c in e.children if c is not None), None)
417
+ if first is not None:
418
+ out[("e", e.eid, None)] = (hold, ("g", nodes[first].group),
419
+ nodes[first].role)
420
+ continue
421
+ for k, c in enumerate(e.children):
422
+ if c is not None:
423
+ out[("e", e.eid, k)] = (hold, ("g", nodes[c].group),
424
+ nodes[c].role)
425
+ for n in nodes.values():
426
+ if shape.separate_data(n):
427
+ o = nodes[n.owner]
428
+ out[("d", n.nid)] = (("g", n.group), ("d", n.owner), n.role)
429
+ return out
430
+
431
+
432
+ def block_role(shape, b):
433
+ if b[0] == "g":
434
+ return shape.nodes[b[1]].role
435
+ if b[0] == "d":
436
+ return shape.nodes[b[1]].role
437
+ return "in"
438
+
439
+
440
+ class Infeasible(Exception):
441
+ """No sequence of map constructs attaches every pointer."""
442
+
443
+
444
+ def _blocks_and_prim(refs):
445
+ prim, order = {}, []
446
+ for r, (h, t, _) in refs.items():
447
+ if t not in prim:
448
+ prim[t] = r
449
+ order.append(t)
450
+ return prim, order
451
+
452
+
453
+ def _toposort(order, deps):
454
+ """Stable topological order of blocks; deps: (a, b) means a before b."""
455
+ level = {b: 0 for b in order}
456
+ for _ in range(len(order) + 1):
457
+ changed = False
458
+ for a, b in deps:
459
+ if level[b] < level[a] + 1:
460
+ level[b] = level[a] + 1
461
+ changed = True
462
+ if not changed:
463
+ break
464
+ else:
465
+ raise Infeasible("cyclic attachment order")
466
+ return level
467
+
468
+
469
+ def td_steps(shape: Shape):
470
+ """Top-down map constructs. Every block is created by the construct of
471
+ its first reference; a pointer needs a construct in which its holder or
472
+ its target is created (OpenMP 5.2 §5.8.3 p.152 l.5-8), so a block's
473
+ other incoming references go in the construct that creates their
474
+ holder, which therefore comes after the target's. Blocks without
475
+ ordering constraint between them share a construct."""
476
+ refs = refs_of(shape)
477
+ prim, order = _blocks_and_prim(refs)
478
+ deps = []
479
+ for r, (h, t, _) in refs.items():
480
+ if h is None:
481
+ continue
482
+ deps.append((h, t) if prim[t] == r else (t, h))
483
+ level = _toposort(order, deps)
484
+ by_level = defaultdict(list)
485
+ for b in order:
486
+ by_level[level[b]].append(b)
487
+ steps = []
488
+ for lv in sorted(by_level):
489
+ items = []
490
+ for b in by_level[lv]:
491
+ items.append(prim[b])
492
+ items += [r for r, (h, t, _) in refs.items()
493
+ if h == b and prim[t] != r]
494
+ steps.append(items)
495
+ return steps
496
+
497
+
498
+ def bu_steps(shape: Shape, acc: bool):
499
+ """Bottom-up constructs: a block's construct maps it and lists every
500
+ pointer it holds again (OpenMP: the pointer is created now, so it is
501
+ attached; OpenACC: attach clauses). Returns (enter items, exit items)
502
+ per construct, leaves first."""
503
+ refs = refs_of(shape)
504
+ prim, order = _blocks_and_prim(refs)
505
+ deps = [(t, h) for r, (h, t, _) in refs.items() if h is not None]
506
+ level = _toposort(order, deps)
507
+ enter, exits = [], []
508
+ for b in sorted(order, key=lambda b: (level[b], order.index(b))):
509
+ out = [r for r, (h, t, _) in refs.items() if h == b]
510
+ tg = [refs[r][1] for r in out]
511
+ if len(tg) != len(set(tg)):
512
+ raise Infeasible("a block holds two pointers to one block")
513
+ e = [It(prim[b], "to" if b[0] == "pa" else mt_enter(refs[prim[b]][2]))]
514
+ x = [It(prim[b], "release" if b[0] == "pa" else
515
+ mt_exit(refs[prim[b]][2]))]
516
+ for r in out:
517
+ if acc:
518
+ e.append(It(r, "attach"))
519
+ x.append(It(r, "detach"))
520
+ else:
521
+ e.append(It(r, "to" if r[0] == "pa" else mt_enter(refs[r][2])))
522
+ x.append(It(r, "release" if r[0] == "pa" else
523
+ mt_exit(refs[r][2])))
524
+ enter.append(e)
525
+ exits.append(x)
526
+ return enter, exits
527
+
528
+
529
+ def mt_one(role):
530
+ return {"in": "to", "inout": "tofrom", "out": "from"}[role]
531
+
532
+
533
+ def mt_enter(role):
534
+ return {"in": "to", "inout": "to", "out": "alloc"}[role]
535
+
536
+
537
+ def mt_exit(role):
538
+ return {"in": "release", "inout": "from", "out": "from"}[role]
539
+
540
+
541
+ @dataclass
542
+ class It:
543
+ ref: tuple
544
+ mt: str
545
+ mods: tuple = ()
546
+
547
+
548
+ @dataclass
549
+ class Cons:
550
+ kind: str # enter exit tdata_open tdata_close region upd_to upd_from
551
+ items: list = field(default_factory=list)
552
+ mapper: str = "" # "" | "default" | "named": the root item invokes it
553
+ note: str = ""
554
+
555
+
556
+ @dataclass
557
+ class Plan:
558
+ cons: list
559
+ notes: list = field(default_factory=list)
560
+ infeasible: str = ""
561
+
562
+
563
+ def _mt_for(shape, refs, r, fn):
564
+ role = refs[r][2]
565
+ if r[0] == "pa":
566
+ return "to" if fn is mt_enter or fn is mt_one else "release"
567
+ return fn(role)
568
+
569
+
570
+ def make_plan(shape: Shape) -> Plan:
571
+ try:
572
+ return _make_plan(shape)
573
+ except Infeasible as e:
574
+ return Plan([], infeasible=str(e))
575
+
576
+
577
+ def _make_plan(shape: Shape) -> Plan:
578
+ cfg = shape.cfg
579
+ refs = refs_of(shape)
580
+ glob = cfg.root == "global"
581
+ acc = cfg.model == "acc"
582
+ st = cfg.strategy
583
+ steps = td_steps(shape)
584
+ if glob:
585
+ steps = [[r for r in stp if r != ("root",)] for stp in steps]
586
+ steps = [stp for stp in steps if stp]
587
+ flat = [r for stp in steps for r in stp]
588
+
589
+ def mt(r, fn):
590
+ return _mt_for(shape, refs, r, fn)
591
+
592
+ def items(rs, fn, mods=()):
593
+ return [It(r, mt(r, fn), mods) for r in rs]
594
+
595
+ def ordered(rs):
596
+ if cfg.order == "bu":
597
+ return list(reversed(rs))
598
+ if cfg.order == "shuf":
599
+ rr = list(rs)
600
+ random.Random(cfg.uid).shuffle(rr)
601
+ return rr
602
+ return list(rs)
603
+
604
+ cons: list[Cons] = []
605
+ root_present = [It(("root",), "present")] if acc else []
606
+
607
+ def region(its):
608
+ return Cons("region", its)
609
+
610
+ if glob:
611
+ cons.append(Cons("upd_to", [It(("root",), "to")]))
612
+
613
+ if st in ("one", "always", "close"):
614
+ mods = ("always",) if st == "always" else (
615
+ ("close",) if st == "close" else ())
616
+ its = items(ordered(flat), mt_one, mods)
617
+ if st == "always": # always is for to/from
618
+ its = [i if i.mt in ("to", "from", "tofrom") else
619
+ replace(i, mods=()) for i in its]
620
+ cons.append(region(its))
621
+ elif st == "mapper":
622
+ cons.append(region(items(flat, mt_one)))
623
+ cons[-1].mapper = "default"
624
+ elif st == "mapper_enter":
625
+ cons.append(Cons("enter", items(flat, mt_enter), mapper="default"))
626
+ cons.append(region([]))
627
+ cons.append(Cons("exit", items(list(reversed(flat)), mt_exit),
628
+ mapper="default"))
629
+ elif st in ("tdata", "acc_data"):
630
+ cons.append(Cons("tdata_open", items(ordered(flat), mt_one)))
631
+ cons.append(region(list(root_present)))
632
+ cons.append(Cons("tdata_close", items(ordered(flat), mt_one)))
633
+ elif st == "tdata_nested":
634
+ for stp in steps:
635
+ cons.append(Cons("tdata_open", items(stp, mt_one)))
636
+ cons.append(region(list(root_present)))
637
+ for stp in reversed(steps):
638
+ cons.append(Cons("tdata_close", items(stp, mt_one)))
639
+ elif st == "present":
640
+ for stp in steps:
641
+ cons.append(Cons("enter", items(stp, mt_enter)))
642
+ cons.append(region(items(flat, mt_one, ("present",))))
643
+ for stp in reversed(steps):
644
+ cons.append(Cons("exit", items(stp, mt_exit)))
645
+ elif st == "enter":
646
+ if cfg.order == "bu":
647
+ seq, exits = bu_steps(shape, acc)
648
+ if glob:
649
+ seq = [[i for i in e if i.ref != ("root",)] for e in seq]
650
+ exits = [[i for i in e if i.ref != ("root",)] for e in exits]
651
+ seq = [e for e in seq if e]
652
+ exits = [e for e in exits if e]
653
+ for its in seq:
654
+ cons.append(Cons("enter", its))
655
+ cons.append(region(list(root_present)))
656
+ for its in reversed(exits):
657
+ cons.append(Cons("exit", its))
658
+ else:
659
+ for stp in steps:
660
+ cons.append(Cons("enter", items(stp, mt_enter)))
661
+ cons.append(region(list(root_present)))
662
+ for stp in reversed(steps):
663
+ cons.append(Cons("exit", items(stp, mt_exit)))
664
+ elif st == "update":
665
+ for stp in steps:
666
+ cons.append(Cons("enter", [It(r, "alloc") for r in stp]))
667
+ rd = [r for r in flat if refs[r][2] in ("in", "inout")
668
+ and r[0] != "pa"]
669
+ wr = [r for r in flat if refs[r][2] in ("inout", "out")
670
+ and r[0] != "pa"]
671
+ cons.append(Cons("upd_to", [It(r, "to") for r in rd]))
672
+ cons.append(region(list(root_present)))
673
+ cons.append(Cons("upd_from", [It(r, "from") for r in wr]))
674
+ for stp in reversed(steps):
675
+ cons.append(Cons("exit", [It(r, "delete") for r in stp]))
676
+ else:
677
+ raise ValueError(f"strategy {st}")
678
+ if glob and shape.nodes[shape.root].role != "in":
679
+ cons.append(Cons("upd_from", [It(("root",), "from")]))
680
+ return _mutate(shape, Plan(cons), refs)
681
+
682
+
683
+ MUTATIONS = ("drop_edge", "bu_no_relist", "dup_listed", "swap_exit",
684
+ "in_alloc_only", "mapper_cycle")
685
+
686
+
687
+ def _mutate(shape, plan, refs):
688
+ m = shape.cfg.mutate
689
+ if not m:
690
+ return plan
691
+ cons = plan.cons
692
+ if m == "drop_edge": # a pointer target no map names
693
+ for c in cons:
694
+ if c.kind in ("region", "enter", "tdata_open", "exit",
695
+ "tdata_close"):
696
+ c.items = [i for i in c.items if i.ref[0] != "e"
697
+ or i.ref[1] != 0]
698
+ elif m == "bu_no_relist": # child-first without re-listing
699
+ for c in cons:
700
+ if c.kind in ("enter", "exit"):
701
+ c.items = c.items[:1]
702
+ elif m == "dup_listed": # one storage block named twice
703
+ for c in cons:
704
+ if c.kind in ("region", "enter", "tdata_open"):
705
+ dup = [i for i in c.items if i.ref[0] == "e"]
706
+ if dup:
707
+ other = next((r for r, (h, t, _) in refs.items()
708
+ if r[0] == "e" and t == refs[dup[0].ref][1]
709
+ and r != dup[0].ref), None)
710
+ if other is not None:
711
+ c.items.append(It(other, dup[0].mt))
712
+ break
713
+ elif m == "swap_exit": # parent leaves before its children
714
+ ex = [c for c in cons if c.kind == "exit"]
715
+ if len(ex) > 1:
716
+ idx = [cons.index(c) for c in ex]
717
+ cons[idx[0]], cons[idx[-1]] = cons[idx[-1]], cons[idx[0]]
718
+ elif m == "in_alloc_only": # read-roles mapped alloc, no update
719
+ for c in cons:
720
+ for i in c.items:
721
+ if i.mt == "to":
722
+ i.mt = "alloc"
723
+ plan.cons = [c for c in cons if c.items or c.kind == "region"]
724
+ return plan
725
+
726
+
727
+ # --- the legality model -----------------------------------------------------------------
728
+
729
+ @dataclass
730
+ class Verdict:
731
+ status: str = "defined" # defined | unspecified | illegal
732
+ reasons: list = field(default_factory=list) # (tag, message)
733
+
734
+ def flag(self, status, tag, msg):
735
+ order = {"defined": 0, "unspecified": 1, "illegal": 2}
736
+ if order[status] > order[self.status]:
737
+ self.status = status
738
+ self.reasons.append((tag, msg))
739
+
740
+ @property
741
+ def ok(self):
742
+ return self.status == "defined"
743
+
744
+
745
+ def validate(shape: Shape, plan: Plan, legacy: bool = False) -> Verdict:
746
+ cfg = shape.cfg
747
+ omp = cfg.model == "omp"
748
+ fort_omp = cfg.lang == "f" and omp
749
+ refs = refs_of(shape)
750
+ v = Verdict()
751
+ if plan.infeasible:
752
+ v.flag("illegal", "omp.map.same-storage" if omp else
753
+ "acc.attach.action", plan.infeasible)
754
+ return v
755
+ cnt: dict = defaultdict(int)
756
+ att: dict = defaultdict(int)
757
+ inited: set = set()
758
+ dirty: set = set()
759
+ partial: set = set()
760
+ glob = cfg.root == "global"
761
+ rootb = ("g", shape.nodes[shape.root].group)
762
+ if glob:
763
+ cnt[rootb] = BIG
764
+
765
+ def info(ref):
766
+ return refs[ref]
767
+
768
+ def do_enter(items, where):
769
+ mapped = []
770
+ for it in items:
771
+ h, t, role = info(it.ref)
772
+ if it.mt != "attach": # an attach clause counts no block
773
+ mapped.append(t)
774
+ uniq = sorted(set(mapped), key=str)
775
+ # one storage block named by two different list items
776
+ if omp:
777
+ by = defaultdict(set)
778
+ for it in items:
779
+ if it.mt != "attach":
780
+ by[info(it.ref)[1]].add(it.ref)
781
+ for b, rs in by.items():
782
+ if len(rs) > 1:
783
+ v.flag("illegal", "omp.map.same-storage",
784
+ f"{where}: two list items name one storage "
785
+ f"block {b}")
786
+ new = {b for b in uniq if cnt[b] == 0}
787
+ # Fortran: listing a pointer and a member of its target together
788
+ if fort_omp:
789
+ tgt = {info(i.ref)[1] for i in items
790
+ if i.ref[0] in ("e", "d") and i.ref != ("root",)}
791
+ for it in items:
792
+ h, t, _ = info(it.ref)
793
+ if h is not None and h in tgt and h[0] == "g":
794
+ v.flag("unspecified", "omp.map.fortran-pointer-target",
795
+ f"{where}: {it.ref} is a member of the target "
796
+ f"of a pointer listed on the same construct")
797
+ break
798
+ for it in items:
799
+ h, t, _ = info(it.ref)
800
+ if "present" in it.mods and cnt[t] == 0:
801
+ v.flag("illegal", "omp.map.present",
802
+ f"{where}: present list item {it.ref} is not "
803
+ f"present")
804
+ if fort_omp and h is not None and cnt[h] == 0 \
805
+ and h not in new and h[0] == "g":
806
+ partial.add(h)
807
+ for b in new:
808
+ if b in partial:
809
+ # 5.2 §5.8.3 p.156 l.19-22 says "must": a restriction
810
+ # (the first labels, kept for the draw, said unspecified)
811
+ v.flag("unspecified" if legacy else "illegal",
812
+ "omp.map.partly-present",
813
+ f"{where}: block {b} is mapped whole after a part "
814
+ f"of it was mapped alone")
815
+ for b in uniq:
816
+ cnt[b] += 1
817
+ for it in items:
818
+ h, t, role = info(it.ref)
819
+ if it.mt in ("to", "tofrom") and (t in new or (
820
+ "always" in it.mods)):
821
+ inited.add(t)
822
+ if it.mt in ("attach", "detach"):
823
+ pass
824
+ if h is None or it.mt == "present" and it.ref == ("root",):
825
+ continue
826
+ if cnt[h] > 0 and cnt[t] > 0:
827
+ if omp:
828
+ if t in new or h in new:
829
+ att[it.ref] += 1
830
+ else:
831
+ att[it.ref] += 1
832
+ return new
833
+
834
+ def do_exit(items, where):
835
+ for it in items:
836
+ if not omp and it.ref in att and att[it.ref] > 0 \
837
+ and it.ref != ("root",):
838
+ att[it.ref] -= 1 if it.mt != "delete" else att[it.ref]
839
+ done = set()
840
+ for it in items:
841
+ h, t, role = info(it.ref)
842
+ if it.mt in ("detach", "attach"):
843
+ continue
844
+ if t in done:
845
+ continue
846
+ done.add(t)
847
+ if cnt[t] <= 0 or (t == rootb and glob):
848
+ continue
849
+ cnt[t] -= 1
850
+ if cnt[t] == 0:
851
+ if not omp:
852
+ for r2, (h2, t2, _) in refs.items():
853
+ if h2 == t and att[r2] > 0:
854
+ v.flag("unspecified",
855
+ "acc.composite-update-attached",
856
+ f"{where}: {t} leaves the device while "
857
+ f"its pointer {r2} is still attached")
858
+ for r2, (h2, t2, _) in refs.items():
859
+ if h2 == t or t2 == t:
860
+ att[r2] = 0
861
+ if it.mt in ("from", "tofrom"):
862
+ dirty.discard(t)
863
+ elif "always" in it.mods and it.mt in ("from", "tofrom"):
864
+ dirty.discard(t)
865
+ inited.difference_update({b for b in list(inited) if cnt[b] == 0
866
+ and not (glob and b == rootb)})
867
+
868
+ if not legacy and any(c.mapper for c in plan.cons) and any(
869
+ tt == tn for tn, t in shape.types.items()
870
+ for (_m, _k, tt) in t.links):
871
+ v.flag("unspecified", "omp.mapper.cycle",
872
+ "the mapper of a self-referential type maps its own type: a "
873
+ "cyclic definition (5.2 §5.8.8 p.164 l.9-10)")
874
+ vs = visits(shape)
875
+
876
+ def check_region(where):
877
+ for vi in vs:
878
+ n = shape.nodes[vi.nid]
879
+ blocks = []
880
+ for (eid, k) in vi.path:
881
+ e = shape.edges[eid]
882
+ if e.kind in shape.contained:
883
+ continue
884
+ ref = ("e", eid, None if e.kind in ("parr", "aarr") else k)
885
+ if e.kind == "pp":
886
+ if att[("pa", eid)] <= 0:
887
+ v.flag("illegal", "omp.map.attach" if omp else
888
+ "acc.attach.action",
889
+ f"{where}: pointer array of edge {eid} is "
890
+ f"not attached")
891
+ return
892
+ if att[ref] <= 0:
893
+ v.flag("illegal", "omp.map.attach" if omp else
894
+ "acc.attach.action",
895
+ f"{where}: pointer {ref} has no attachment: the "
896
+ f"device would read a host address")
897
+ return
898
+ for nid in {vi.nid} | {nn for nn in [vi.nid]}:
899
+ pass
900
+ b = ("g", n.group)
901
+ if cnt[b] <= 0:
902
+ v.flag("illegal", "omp.map.attach",
903
+ f"{where}: block {b} not present")
904
+ return
905
+ if shape.separate_data(n):
906
+ if att[("d", n.nid)] <= 0 or cnt[("d", n.owner)] <= 0:
907
+ v.flag("illegal", "omp.map.attach" if omp else
908
+ "acc.attach.action",
909
+ f"{where}: data pointer of node {n.nid} is not "
910
+ f"attached")
911
+ return
912
+ db = ("d", n.owner)
913
+ else:
914
+ db = b
915
+ if n.role in ("in", "inout") and (b not in inited or
916
+ db not in inited):
917
+ # indeterminate values, not a restriction violated (the first
918
+ # labels, kept for the draw, said illegal)
919
+ v.flag("illegal" if legacy else "unspecified",
920
+ "omp.map.refcount",
921
+ f"{where}: node {n.nid} is read before any map "
922
+ f"copied the host value")
923
+ return
924
+ if fort_omp and not legacy and any(
925
+ shape.edges[eid].kind in ("alloc", "aarr") and
926
+ shape.nodes[shape.edges[eid].parent].role == "out"
927
+ for (eid, _k) in vi.path):
928
+ v.flag("unspecified", "omp.map.fortran-components",
929
+ f"{where}: the program tests the allocation status "
930
+ f"of a component of an object mapped only from; no "
931
+ f"rule gives the status of a device copy made "
932
+ f"without a transfer (5.2 §5.8.3 p.151 l.34-37 lets "
933
+ f"the map treat it as unallocated)")
934
+ if n.role in ("inout", "out"):
935
+ dirty.add(b)
936
+ dirty.add(db)
937
+
938
+ for ci, c in enumerate(plan.cons):
939
+ where = f"{c.kind}#{ci}"
940
+ if c.kind in ("enter", "tdata_open"):
941
+ do_enter(c.items, where)
942
+ elif c.kind == "region":
943
+ do_enter(c.items, where)
944
+ check_region(where)
945
+ do_exit(c.items, where)
946
+ elif c.kind in ("exit", "tdata_close"):
947
+ do_exit(c.items, where)
948
+ elif c.kind == "upd_to":
949
+ for it in c.items:
950
+ h, t, _ = info(it.ref)
951
+ if cnt[t] <= 0:
952
+ v.flag("illegal", "omp.update.attached",
953
+ f"{where}: update of {it.ref}: not present")
954
+ else:
955
+ inited.add(t)
956
+ elif c.kind == "upd_from":
957
+ for it in c.items:
958
+ h, t, _ = info(it.ref)
959
+ if cnt[t] <= 0:
960
+ v.flag("illegal", "omp.update.attached",
961
+ f"{where}: update of {it.ref}: not present")
962
+ else:
963
+ dirty.discard(t)
964
+ if not omp and any(att[r2] > 0 for r2, (h2, _, _)
965
+ in refs.items() if h2 == t):
966
+ v.flag("unspecified",
967
+ "acc.composite-update-attached",
968
+ f"{where}: update self of {t} with attached "
969
+ f"pointers")
970
+ if v.status == "illegal":
971
+ return v
972
+ left = [b for b, n in cnt.items() if n > 0 and not (glob and b == rootb)]
973
+ if left:
974
+ v.flag("illegal", "omp.map.refcount",
975
+ f"blocks still mapped at the end: {left}")
976
+ if dirty - ({rootb} if glob and not any(
977
+ c.kind == "upd_from" for c in plan.cons) else set()):
978
+ v.flag("illegal", "omp.map.refcount",
979
+ "the device wrote blocks the host never got back: "
980
+ f"{sorted(dirty, key=str)}")
981
+ return v
982
+
983
+
984
+ # --- the spec rows of a program ------------------------------------------------------------
985
+
986
+ def rules_of(shape: Shape, plan: Plan, verdict: Verdict) -> tuple:
987
+ """The tags (offload.engine.nested_cites) of the rules the program stresses."""
988
+ cfg = shape.cfg
989
+ omp = cfg.model == "omp"
990
+ refs = refs_of(shape)
991
+ tags: list[str] = []
992
+ attach = [r for r, (h, t, _) in refs.items() if h is not None]
993
+ kinds = {e.kind for e in shape.edges}
994
+ datas = {t.data for t in shape.types.values()}
995
+ st = cfg.strategy
996
+ implicit_region = any(c.kind == "region" and not [
997
+ i for i in c.items if i.ref != ("root",) or i.mt != "present"]
998
+ for c in plan.cons)
999
+ if omp:
1000
+ if attach:
1001
+ tags += ["omp.map.attach", "omp.map.attached-unmodified"]
1002
+ tags.append("omp.map.struct-elements")
1003
+ if len(refs) > 1 and cfg.lang == "c":
1004
+ tags.append("omp.map.struct-element-others")
1005
+ if any(c.kind in ("enter", "exit", "tdata_open", "tdata_close")
1006
+ for c in plan.cons):
1007
+ tags.append("omp.map.refcount")
1008
+ if implicit_region:
1009
+ tags += ["omp.implicit.pointer", "omp.implicit.lookup"]
1010
+ if cfg.root == "var":
1011
+ tags.append("omp.implicit.nonscalar")
1012
+ if cfg.lang == "f":
1013
+ tags.append("omp.map.default-mapper")
1014
+ if kinds & {"alloc", "aarr"} or "alloc" in datas:
1015
+ tags += ["omp.map.fortran-components", "omp.map.alloc-status"]
1016
+ if kinds & {"ptr", "parr"} or "ptr" in datas:
1017
+ tags += ["omp.map.fortran-pointer-target",
1018
+ "omp.map.pointer-association"]
1019
+ if cfg.topo in ("diamond", "twin", "alias", "aliassub"):
1020
+ tags += ["omp.map.same-storage", "omp.map.storage-block"]
1021
+ if cfg.topo == "aliassub":
1022
+ tags.append("omp.map.partly-present")
1023
+ if st == "always":
1024
+ tags.append("omp.map.always")
1025
+ if st == "present":
1026
+ tags.append("omp.map.present")
1027
+ if st == "close":
1028
+ tags.append("omp.map.close")
1029
+ if any(c.kind in ("upd_to", "upd_from") for c in plan.cons):
1030
+ tags.append("omp.update.attached")
1031
+ if cfg.lang == "f":
1032
+ tags += ["omp.update.pointer", "omp.update.allocatable"]
1033
+ if st in ("mapper", "mapper_enter"):
1034
+ tags += ["omp.mapper.decay", "omp.mapper.nested",
1035
+ "omp.map.default-mapper"]
1036
+ if kinds & {"parr", "ptrs", "pp"}:
1037
+ tags.append("omp.mapper.array")
1038
+ if cfg.topo in ("list", "tree"):
1039
+ tags.append("omp.mapper.cycle")
1040
+ else:
1041
+ tags.append("acc.composite.c" if cfg.lang == "c"
1042
+ else "acc.composite.fortran")
1043
+ if attach:
1044
+ tags += ["acc.host-pointer-copied", "acc.attach.action",
1045
+ "acc.copyin.attach"]
1046
+ if cfg.strategy == "enter" and cfg.order == "bu":
1047
+ tags += ["acc.attach.clause", "acc.detach"]
1048
+ elif attach:
1049
+ tags.append("acc.restore-host-pointer")
1050
+ if cfg.null_at >= 0 or cfg.topo in ("list", "tree"):
1051
+ tags.append("acc.attach.null")
1052
+ if kinds & {"ptrs", "pp"}:
1053
+ tags.append("acc.pointer-array")
1054
+ if cfg.lang == "f" and kinds & {"parr"}:
1055
+ tags.append("acc.fortran-array-pointer")
1056
+ for t, _ in verdict.reasons:
1057
+ if t not in tags:
1058
+ tags.append(t)
1059
+ seen, out = set(), []
1060
+ for t in tags:
1061
+ if t in NC.CITES and t not in seen:
1062
+ seen.add(t)
1063
+ out.append(t)
1064
+ return tuple(out)
1065
+
1066
+
1067
+ # --- programs --------------------------------------------------------------------------------
1068
+
1069
+ @dataclass(frozen=True)
1070
+ class Program:
1071
+ id: str
1072
+ family: str
1073
+ title: str
1074
+ lang: str # "c" | "f90"
1075
+ model: str # "omp" | "acc"
1076
+ version: int # 52 | 34
1077
+ source: str
1078
+ expected: dict
1079
+ legality: str # defined | unspecified | illegal
1080
+ why: str
1081
+ rules: tuple # tags
1082
+ cites: tuple # rows: dicts as nested_cites
1083
+ axes: dict
1084
+ cfg: Cfg = None
1085
+ modes: tuple = ("copy", "unified")
1086
+
1087
+ @property
1088
+ def text(self) -> str: # offload.engine.prerun reads .text or .source
1089
+ return self.source
1090
+
1091
+ def harness(self):
1092
+ from offload.engine.gen import Program as HP
1093
+ return HP(id=self.id, lang=self.lang, source=self.source,
1094
+ atoms=frozenset({f"nested.{self.family}"}),
1095
+ primary_atom=f"nested.{self.family}",
1096
+ legal=self.legality == "defined", violates=None,
1097
+ observable=True, model=self.model)
1098
+
1099
+
1100
+ def axes_of(shape: Shape, plan: Plan) -> dict:
1101
+ cfg = shape.cfg
1102
+ kinds = sorted({e.kind for e in shape.edges})
1103
+ datas = sorted({t.data for t in shape.types.values()})
1104
+ roles = sorted({n.role for n in shape.nodes.values()})
1105
+ return {"lang": cfg.lang, "model": cfg.model, "topo": cfg.topo,
1106
+ "depth": max(n.depth for n in shape.nodes.values()) + 1,
1107
+ "links": kinds, "datas": datas, "roles": roles,
1108
+ "null": any(None in e.children for e in shape.edges),
1109
+ "kernel": cfg.kernel, "strategy": cfg.strategy,
1110
+ "order": cfg.order if cfg.strategy in (
1111
+ "one", "enter", "tdata") else "-",
1112
+ "root": cfg.root, "constructs": len(plan.cons),
1113
+ "objects": len(shape.nodes)}
1114
+
1115
+
1116
+ def _title(shape, plan):
1117
+ cfg = shape.cfg
1118
+ ax = axes_of(shape, plan)
1119
+ lang = {"c": "C", "f": "Fortran"}[cfg.lang]
1120
+ model = {"omp": "OpenMP", "acc": "OpenACC"}[cfg.model]
1121
+ what = {"chain": "chain", "list": "linked list", "tree": "binary tree",
1122
+ "diamond": "shared child (diamond)",
1123
+ "twin": "two pointers to one object",
1124
+ "alias": "aliasing arrays",
1125
+ "aliassub": "array aliasing a part of another"}[cfg.topo]
1126
+ order = f" {cfg.order}" if cfg.strategy in (
1127
+ "one", "enter", "tdata") and cfg.order != "td" else ""
1128
+ return (f"{lang} {model}: {ax['depth']}-level {what} (links "
1129
+ f"{', '.join(ax['links']) or 'none'}; data "
1130
+ f"{', '.join(ax['datas'])}; roles {', '.join(ax['roles'])}; "
1131
+ f"{cfg.kernel} kernel), strategy {cfg.strategy}{order}, "
1132
+ f"root {cfg.root}")
1133
+
1134
+
1135
+ # Fortran OpenACC programs that gfortran and ftn both refuse (a derived-type
1136
+ # variable and its components in one data directive over a tree or an
1137
+ # aliasing section) and for which the cached OpenACC 3.4 text has no rule
1138
+ # that makes them defined: neither a defect nor a negative
1139
+ PENDING = {"a8bf33a0", "4276fdd8", "5eb3a148", "c0f2037d"}
1140
+ PENDING_WHY = ("pending: gfortran and ftn both refuse it and the cached "
1141
+ "OpenACC 3.4 text has no rule that makes it defined")
1142
+
1143
+
1144
+ # OpenACC programs whose overlapping subarrays (an array and a section of it that another level
1145
+ # points to) sit in one clause set: the cached OpenACC 3.4 text has no rule for a var that overlaps
1146
+ # another var of the same directive. The draw is made before this label.
1147
+ ACC_OVERLAP_PENDING = True
1148
+ OVERLAP_WHY = ("pending: the cached OpenACC 3.4 text has no rule for a var that overlaps another var "
1149
+ "of the same directive (an array and the section another level points to)")
1150
+
1151
+
1152
+ def program(cfg: Cfg, legacy: bool = False, review: bool = True) -> Program:
1153
+ from offload.engine import nested_emit as E
1154
+ shape = build_shape(cfg)
1155
+ plan = make_plan(shape)
1156
+ verdict = validate(shape, plan, legacy=legacy)
1157
+ if not legacy and cfg.uid in PENDING and verdict.status == "defined":
1158
+ verdict.status = "pending"
1159
+ verdict.reasons.append(("acc.composite.fortran", PENDING_WHY))
1160
+ if (review and not legacy and ACC_OVERLAP_PENDING and verdict.status == "defined"
1161
+ and cfg.model == "acc" and cfg.topo == "aliassub" and cfg.strategy in ("one", "tdata")):
1162
+ verdict.status = "pending"
1163
+ verdict.reasons.append(("acc.overlap", OVERLAP_WHY))
1164
+ expected = simulate(shape)
1165
+ tags = rules_of(shape, plan, verdict)
1166
+ rows = NC.rows_for(tags)
1167
+ depth = max(n.depth for n in shape.nodes.values()) + 1
1168
+ pid = f"nd-{cfg.lang}-{cfg.model}-{cfg.strategy}-{cfg.topo}-d{depth}-" \
1169
+ f"{cfg.uid}"
1170
+ title = _title(shape, plan)
1171
+ acc = cfg.model == "acc"
1172
+ mark = "//" if cfg.lang == "c" else "!"
1173
+ why = "; ".join(m for _, m in verdict.reasons)
1174
+ head = [f"{mark} nested-data {pid} "
1175
+ f"({'OpenACC 3.4' if acc else 'OpenMP 5.2'}, "
1176
+ f"{'C11' if cfg.lang == 'c' else 'free-form Fortran'}):"]
1177
+ head += E.wrap_comment(mark, "", title)
1178
+ head += E.wrap_comment(mark, "spec: ", "; ".join(
1179
+ NC.cite_text(r) for r in rows))
1180
+ head += E.wrap_comment(mark, "rules: ", ", ".join(tags))
1181
+ head += E.wrap_comment(mark, "legality: ", verdict.status + (
1182
+ f": {why}" if why else ""))
1183
+ head += E.wrap_comment(mark, "expected (computed by "
1184
+ "compliance/nested_gen.py): ",
1185
+ ", ".join(f"{k}= {v}" for k, v in expected))
1186
+ em = (E.EmitC if cfg.lang == "c" else E.EmitF)(shape, plan, verdict,
1187
+ expected, head)
1188
+ src = em.emit()
1189
+ long = [ln for ln in src.split("\n") if len(ln) > 132]
1190
+ if long:
1191
+ raise ValueError(f"{pid}: line over 132 characters: {long[0][:60]}")
1192
+ return Program(
1193
+ id=pid, family=f"{cfg.lang}-{cfg.model}-{cfg.strategy}", title=title,
1194
+ lang="c" if cfg.lang == "c" else "f90", model=cfg.model,
1195
+ version=34 if acc else 52, source=src, expected=dict(expected),
1196
+ legality=verdict.status, why=why, rules=tags,
1197
+ cites=tuple(tuple(sorted(r.items())) for r in rows),
1198
+ axes=axes_of(shape, plan), cfg=cfg)
1199
+
1200
+
1201
+ def parse_observed(stdout: str) -> dict:
1202
+ import re
1203
+ return {m.group(1): int(m.group(2)) for m in
1204
+ re.finditer(r"^(\w+)= (-?\d+)\s*$", stdout or "", re.M)}
1205
+
1206
+
1207
+ # --- the sample ------------------------------------------------------------------------------
1208
+
1209
+ STRATS = {("c", "omp"): {"one": 5, "enter": 5, "tdata": 3, "tdata_nested": 3,
1210
+ "present": 2, "always": 2, "close": 1, "update": 3,
1211
+ "mapper": 3, "mapper_enter": 1},
1212
+ ("f", "omp"): {"one": 4, "enter": 6, "tdata": 3, "tdata_nested": 4,
1213
+ "present": 2, "always": 2, "close": 1, "update": 3,
1214
+ "mapper": 2, "mapper_enter": 1},
1215
+ ("c", "acc"): {"one": 3, "enter": 7, "tdata": 4},
1216
+ ("f", "acc"): {"one": 3, "enter": 7, "tdata": 4}}
1217
+ TOPO_W = {"chain": 62, "list": 8, "tree": 7, "diamond": 7, "alias": 5,
1218
+ "aliassub": 4, "twin": 2}
1219
+ DEPTHS = {"chain": ((1, 2, 3, 4), (10, 35, 35, 20)),
1220
+ "list": ((2, 3, 4), (3, 4, 3)), "tree": ((2, 3), (1, 1)),
1221
+ "diamond": ((3,), (1,)), "twin": ((2,), (1,)),
1222
+ "alias": ((2,), (1,)), "aliassub": ((2,), (1,))}
1223
+
1224
+
1225
+ def _wchoice(rng, d):
1226
+ keys = list(d)
1227
+ return rng.choices(keys, [d[k] for k in keys])[0]
1228
+
1229
+
1230
+ def normalize(cfg: Cfg) -> Cfg:
1231
+ """Make the combination one the strategy can express."""
1232
+ st = cfg.strategy
1233
+ kw = {}
1234
+ if cfg.topo in ("alias", "aliassub"):
1235
+ kw["kernel"] = "serial"
1236
+ kw["datas"] = ("ptr",)
1237
+ kw["roles"] = (cfg.roles[0],)
1238
+ if cfg.topo != "chain":
1239
+ kw["links"] = ()
1240
+ if st in ("mapper", "mapper_enter"):
1241
+ kw["roles"] = (cfg.roles[0],) if st == "mapper" else ("inout",)
1242
+ kw["null_at"] = -1
1243
+ if cfg.topo == "chain":
1244
+ ok = ("ptr", "parr", "ptrs", "pp") if cfg.lang == "c" else (
1245
+ "ptr", "parr")
1246
+ kw["links"] = tuple(k if k in ok else "ptr" for k in cfg.links)
1247
+ kw["root"] = "var" if cfg.root == "global" else cfg.root
1248
+ if st in ("always", "present", "close", "update", "mapper",
1249
+ "mapper_enter", "tdata_nested") and cfg.model == "acc":
1250
+ kw["strategy"] = "enter"
1251
+ if st in ("always", "close", "present"):
1252
+ kw["order"] = "td"
1253
+ if cfg.model == "acc" and cfg.root == "global":
1254
+ kw["root"] = "heap"
1255
+ if cfg.root == "global" and st not in ("enter", "update"):
1256
+ kw["root"] = "var"
1257
+ if st == "enter" and cfg.order == "shuf":
1258
+ kw["order"] = "td"
1259
+ if st in ("tdata_nested", "update", "mapper", "mapper_enter"):
1260
+ kw["order"] = "td"
1261
+ return replace(cfg, **kw) if kw else cfg
1262
+
1263
+
1264
+ def random_cfg(rng: random.Random, lang: str, model: str, **fixed) -> Cfg:
1265
+ topo = fixed.get("topo") or _wchoice(rng, TOPO_W)
1266
+ ds, dw = DEPTHS[topo]
1267
+ depth = fixed.get("depth") or rng.choices(ds, dw)[0]
1268
+ nlev = 3 if topo in ("diamond",) else depth
1269
+ kinds = LINKS[lang]
1270
+ wk = {k: (4 if k == "ptr" else 1) for k in kinds}
1271
+ links = tuple(_wchoice(rng, wk) for _ in range(max(depth - 1, 0)))
1272
+ if fixed.get("link") and depth >= 2:
1273
+ links = (fixed["link"],) + links[1:]
1274
+ datas = tuple(rng.choice(DATAS[lang]) for _ in range(max(nlev, 1)))
1275
+ if fixed.get("data"):
1276
+ datas = (fixed["data"],) + datas[1:]
1277
+ roles = tuple(rng.choice(ROLES) for _ in range(max(nlev, 1)))
1278
+ if fixed.get("role"):
1279
+ roles = (fixed["role"],) + roles[1:]
1280
+ nullable = [i for i, k in enumerate(links) if k not in ("embed", "arr")]
1281
+ null_at = -1
1282
+ want_null = fixed.get("null")
1283
+ if topo == "chain" and nullable and (want_null or (
1284
+ want_null is None and rng.random() < 0.15)):
1285
+ null_at = rng.choice(nullable)
1286
+ elif topo in ("list", "tree") and depth >= 2 and (want_null or (
1287
+ want_null is None and rng.random() < 0.15)):
1288
+ null_at = rng.randrange(0, depth - 1)
1289
+ strat = fixed.get("strategy") or _wchoice(rng, STRATS[(lang, model)])
1290
+ order = fixed.get("order") or rng.choices(
1291
+ ("td", "bu", "shuf"), (6, 3, 1))[0]
1292
+ kernel = fixed.get("kernel") or ("par" if rng.random() < 0.4
1293
+ else "serial")
1294
+ root = fixed.get("root") or ("global" if model == "omp" and
1295
+ rng.random() < 0.1 else
1296
+ rng.choice(("var", "heap")))
1297
+ return normalize(Cfg(lang, model, topo, depth, links, datas, roles,
1298
+ null_at, kernel, strat, order, "", root))
1299
+
1300
+
1301
+ MIN_COVER = 4
1302
+
1303
+
1304
+ def cov_keys(p: Program) -> list:
1305
+ ax = p.axes
1306
+ lm = f"{ax['lang']}-{ax['model']}"
1307
+ ks = [(lm, "topo", ax["topo"]), (lm, "depth", ax["depth"]),
1308
+ (lm, "kernel", ax["kernel"]), (lm, "strategy", ax["strategy"]),
1309
+ (lm, "root", ax["root"])]
1310
+ if ax["order"] != "-":
1311
+ ks.append((lm, "order", ax["order"]))
1312
+ ks += [(lm, "link", k) for k in ax["links"]]
1313
+ ks += [(lm, "data", k) for k in ax["datas"]]
1314
+ ks += [(lm, "role", k) for k in ax["roles"]]
1315
+ if ax["null"]:
1316
+ ks.append((lm, "null", True))
1317
+ return ks
1318
+
1319
+
1320
+ def _force_for(key):
1321
+ axis, val = key[1], key[2]
1322
+ return {"topo": {"topo": val}, "depth": {"depth": val},
1323
+ "kernel": {"kernel": val}, "strategy": {"strategy": val},
1324
+ "root": {"root": val}, "order": {"order": val},
1325
+ "link": {"link": val}, "data": {"data": val},
1326
+ "role": {"role": val}, "null": {"null": True}}[axis]
1327
+
1328
+
1329
+ def pilot(n: int = 400, seed: int = 1, neg_frac: float = 0.12,
1330
+ min_cover: int = MIN_COVER, legacy: bool = True,
1331
+ max_tries: int = 80) -> list[Program]:
1332
+ """About `n` programs sampled over the axes: legal ones (defined), the
1333
+ unspecified ones the draw produced (observations) and marked illegal
1334
+ negatives (mutations of legal plans, and the shapes with no legal plan).
1335
+ Every (language/model, axis, value) the axes can express is covered
1336
+ at least `min_cover` times, or the shortfall is reported by
1337
+ ``coverage``."""
1338
+ rng = random.Random(seed)
1339
+ quota = {("c", "omp"): 0.42, ("f", "omp"): 0.30, ("c", "acc"): 0.14,
1340
+ ("f", "acc"): 0.14}
1341
+ seen: set = set()
1342
+ keep: list[Program] = []
1343
+ legacy_defined: set = set()
1344
+ count: dict = defaultdict(int)
1345
+
1346
+ def add(cfg, allow=("defined",)) -> Program | None:
1347
+ if cfg.uid in seen:
1348
+ return None
1349
+ try:
1350
+ lp = program(cfg, legacy=legacy, review=False) # the draw keeps the labels it was made under
1351
+ p = program(cfg)
1352
+ except (ValueError, KeyError, IndexError):
1353
+ return None
1354
+ if lp.legality not in allow:
1355
+ return None
1356
+ seen.add(cfg.uid)
1357
+ keep.append(p)
1358
+ if lp.legality == "defined":
1359
+ legacy_defined.add(p.id)
1360
+ for k in cov_keys(lp):
1361
+ count[k] += 1
1362
+ return lp
1363
+
1364
+ n_neg = int(n * neg_frac)
1365
+ n_unspec = n_neg // 2
1366
+ n_def = n - n_neg
1367
+ for (lang, model), q in quota.items():
1368
+ want = round(n_def * q)
1369
+ got = tries = 0
1370
+ while got < want and tries < want * 40:
1371
+ tries += 1
1372
+ if add(random_cfg(rng, lang, model)) is not None:
1373
+ got += 1
1374
+ # top up the axis values the draw missed (legal programs only)
1375
+ for lang, model in quota:
1376
+ for key in _feasible_keys(lang, model):
1377
+ tries = 0
1378
+ while count[key] < min_cover and tries < max_tries:
1379
+ tries += 1
1380
+ add(random_cfg(rng, lang, model, **_force_for(key)))
1381
+ # observations: what the spec leaves open (a Fortran pointer chain
1382
+ # listed whole, a parent leaving first in OpenACC, a cyclic mapper)
1383
+ got = tries = 0
1384
+ while got < n_unspec and tries < n * 200:
1385
+ tries += 1
1386
+ lang, model = rng.choice(list(quota))
1387
+ if add(random_cfg(rng, lang, model), ("unspecified",)) is not None:
1388
+ got += 1
1389
+ # negatives: mutations of legal programs
1390
+ base = [p for p in keep if p.id in legacy_defined]
1391
+ rng.shuffle(base)
1392
+ mutants = 0
1393
+ for p in base:
1394
+ if mutants >= n_neg - n_unspec:
1395
+ break
1396
+ c = p.cfg
1397
+ opts = []
1398
+ if c.strategy in ("one", "tdata", "enter", "present", "tdata_nested"):
1399
+ opts += ["drop_edge", "in_alloc_only"]
1400
+ if c.strategy == "enter" and c.order == "bu":
1401
+ opts.append("bu_no_relist")
1402
+ if c.strategy == "enter" and c.order == "td" and c.model == "acc":
1403
+ opts.append("swap_exit")
1404
+ if c.strategy == "one":
1405
+ opts.append("dup_listed")
1406
+ if not opts:
1407
+ continue
1408
+ q = add(replace(c, mutate=rng.choice(opts)),
1409
+ ("illegal", "unspecified"))
1410
+ if q is not None:
1411
+ mutants += 1
1412
+ keep += fnres_programs()
1413
+ return sorted(keep, key=lambda p: p.id)
1414
+
1415
+
1416
+ def _feasible_keys(lang, model):
1417
+ keys = []
1418
+ lm = f"{lang}-{model}"
1419
+ keys += [(lm, "topo", t) for t in TOPOS if t != "twin" and not (
1420
+ lm == "f-omp" and t in ("diamond", "alias", "aliassub"))]
1421
+ keys += [(lm, "depth", d) for d in (1, 2, 3, 4)]
1422
+ keys += [(lm, "kernel", k) for k in ("serial", "par")]
1423
+ keys += [(lm, "strategy", s) for s in STRATS[(lang, model)]]
1424
+ keys += [(lm, "root", r) for r in (("var", "heap", "global")
1425
+ if model == "omp" else
1426
+ ("var", "heap"))]
1427
+ keys += [(lm, "order", o) for o in ("td", "bu")]
1428
+ keys += [(lm, "link", k) for k in LINKS[lang]]
1429
+ keys += [(lm, "data", k) for k in DATAS[lang]]
1430
+ keys += [(lm, "role", r) for r in ROLES]
1431
+ keys += [(lm, "null", True)]
1432
+ return keys
1433
+
1434
+
1435
+ def coverage(programs, min_cover: int = MIN_COVER) -> dict:
1436
+ """(language-model, axis, value) -> number of legal programs, for every
1437
+ key the axes can express."""
1438
+ cnt: dict = defaultdict(int)
1439
+ for p in programs:
1440
+ if p.legality == "defined":
1441
+ for k in cov_keys(p):
1442
+ cnt[k] += 1
1443
+ out = {}
1444
+ for lang, model in STRATS:
1445
+ for k in _feasible_keys(lang, model):
1446
+ out[k] = cnt.get(k, 0)
1447
+ return out
1448
+
1449
+
1450
+ # --- derived-type and struct function results -------------------------------------------------
1451
+
1452
+ def _fn_header(mark, pid, lang_note, title, tags, expected):
1453
+ from offload.engine import nested_emit as E
1454
+ rows = NC.rows_for(tags)
1455
+ h = [f"{mark} nested-data {pid} (OpenMP 5.2, {lang_note}):"]
1456
+ h += E.wrap_comment(mark, "", title)
1457
+ h += E.wrap_comment(mark, "spec: ", "; ".join(NC.cite_text(r)
1458
+ for r in rows))
1459
+ h += E.wrap_comment(mark, "rules: ", ", ".join(tags))
1460
+ h += E.wrap_comment(mark, "legality: ", "defined")
1461
+ h += E.wrap_comment(mark, "expected (computed by "
1462
+ "compliance/nested_gen.py): ",
1463
+ ", ".join(f"{k}= {v}" for k, v in expected))
1464
+ return h, rows
1465
+
1466
+
1467
+ def _fn_program(variant, lang, title, body, expected):
1468
+ tags = ("omp.map.attach", "omp.map.struct-elements",
1469
+ "omp.implicit.pointer", "omp.declare-target.procs")
1470
+ mark = "//" if lang == "c" else "!"
1471
+ pid = f"nd-fnres-{lang}-{variant}"
1472
+ head, rows = _fn_header(mark, pid, "C11" if lang == "c" else
1473
+ "free-form Fortran", title, tags, expected)
1474
+ checks = list(expected)
1475
+ if lang == "c":
1476
+ tail = [f" ok = ok && ({k} == {v});" for k, v in checks]
1477
+ tail += [f" printf(\"{k}= %d\\n\", {k});" for k, _ in checks]
1478
+ tail += [" printf(\"RESULT ran_on_host=%d check=%s\\n\", host_flag, "
1479
+ "ok ? \"pass\" : \"fail\");", " return 0;", "}", ""]
1480
+ else:
1481
+ tail = [f" ok = ok .and. ({k} == {v})" for k, v in checks]
1482
+ tail += [f" print '(a,i0)', '{k}= ', {k}" for k, _ in checks]
1483
+ tail += [" print '(a,i0,a,a)', 'RESULT ran_on_host=', host_flag, "
1484
+ "' check=', merge('pass', 'fail', ok)", "end program nd", ""]
1485
+ src = "\n".join(head) + "\n" + body.rstrip("\n") + "\n" + "\n".join(tail)
1486
+ long = [ln for ln in src.split("\n") if len(ln) > 132]
1487
+ if long:
1488
+ raise ValueError(f"{pid}: line over 132 characters")
1489
+ return Program(
1490
+ id=pid, family=f"{lang}-omp-fnres", title=title,
1491
+ lang="c" if lang == "c" else "f90", model="omp", version=52,
1492
+ source=src, expected=dict(expected), legality="defined", why="",
1493
+ rules=tags, cites=tuple(tuple(sorted(r.items())) for r in rows),
1494
+ axes={"lang": lang, "model": "omp", "topo": "fnres", "depth": 2,
1495
+ "links": ["ptr"], "datas": ["ptr"], "roles": ["inout"],
1496
+ "null": False, "kernel": "serial", "strategy": "fnres",
1497
+ "order": "-", "root": "heap", "constructs": 2, "objects": 2})
1498
+
1499
+
1500
+ _C_HEAD = """#include <stdio.h>
1501
+ #include <stdlib.h>
1502
+ #include <omp.h>
1503
+ enum { NM = 8 };
1504
+ struct node { int s; int *a; struct node *nx; };
1505
+ struct view { int *p; int n; };
1506
+ struct stat3 { int sum; int mx; int arr[4]; };
1507
+ #pragma omp declare target
1508
+ static struct view mkview(int *p, int n) { struct view v; v.p = p; v.n = n; return v; }
1509
+ static int vsum(struct view v) { int t = 0; for (int i = 0; i < v.n; i++) t += v.p[i]; return t; }
1510
+ static struct node *child(struct node *r) { return r->nx; }
1511
+ static struct stat3 summarize(const int *p, int n)
1512
+ {
1513
+ struct stat3 s;
1514
+ s.sum = 0; s.mx = p[0];
1515
+ for (int i = 0; i < 4; i++) s.arr[i] = 0;
1516
+ for (int i = 0; i < n; i++) { s.sum += p[i]; if (p[i] > s.mx) s.mx = p[i]; s.arr[i % 4] += p[i]; }
1517
+ return s;
1518
+ }
1519
+ #pragma omp end declare target
1520
+ int main(void)
1521
+ {
1522
+ int host_flag = 1, ok = 1, i;
1523
+ int tot = 0, ha1 = 0, out = 0;
1524
+ struct node *r = calloc(1, sizeof *r);
1525
+ #pragma omp target map(from: host_flag)
1526
+ host_flag = omp_is_initial_device() ? 1 : 0;
1527
+ r->nx = calloc(1, sizeof *r->nx);
1528
+ r->a = malloc(NM * sizeof(int));
1529
+ r->nx->a = malloc(NM * sizeof(int));
1530
+ for (i = 0; i < NM; i++) { r->a[i] = 100 + i; r->nx->a[i] = 200 + i; }
1531
+ """
1532
+ _C_MAPS = """ map(to: r[0:1]) map(to: r->a[0:NM]) \\
1533
+ map(to: r->nx[0:1]) map(to: r->nx->a[0:NM])"""
1534
+
1535
+ _F_HEAD = """module nd_m
1536
+ implicit none
1537
+ integer, parameter :: nm = 8
1538
+ type :: node
1539
+ integer :: s = 0
1540
+ integer, pointer :: a(:) => null()
1541
+ type(node), pointer :: nx => null()
1542
+ end type node
1543
+ type :: view
1544
+ integer, pointer :: p(:) => null()
1545
+ integer :: n = 0
1546
+ end type view
1547
+ type :: stat3
1548
+ integer :: sum = 0, mx = 0
1549
+ integer :: arr(4) = 0
1550
+ end type stat3
1551
+ contains
1552
+ function mkview(p) result(v)
1553
+ !$omp declare target
1554
+ integer, pointer, intent(in) :: p(:)
1555
+ type(view) :: v
1556
+ v%p => p
1557
+ v%n = size(p)
1558
+ end function mkview
1559
+ integer function vsum(v)
1560
+ !$omp declare target
1561
+ type(view), intent(in) :: v
1562
+ integer :: k
1563
+ vsum = 0
1564
+ do k = 1, v%n
1565
+ vsum = vsum + v%p(k)
1566
+ end do
1567
+ end function vsum
1568
+ function child(r) result(c)
1569
+ !$omp declare target
1570
+ type(node), pointer, intent(in) :: r
1571
+ type(node), pointer :: c
1572
+ c => r%nx
1573
+ end function child
1574
+ function summarize(p, n) result(s)
1575
+ !$omp declare target
1576
+ integer, intent(in) :: p(:), n
1577
+ type(stat3) :: s
1578
+ integer :: k
1579
+ s%sum = 0
1580
+ s%mx = p(1)
1581
+ s%arr = 0
1582
+ do k = 1, n
1583
+ s%sum = s%sum + p(k)
1584
+ if (p(k) > s%mx) s%mx = p(k)
1585
+ s%arr(mod(k - 1, 4) + 1) = s%arr(mod(k - 1, 4) + 1) + p(k)
1586
+ end do
1587
+ end function summarize
1588
+ subroutine bump(r, t)
1589
+ !$omp declare target
1590
+ type(node), pointer, intent(in) :: r
1591
+ integer, intent(inout) :: t
1592
+ type(node), pointer :: c
1593
+ integer :: k
1594
+ c => child(r)
1595
+ do k = 1, nm
1596
+ c%a(k) = c%a(k) + 5 * k
1597
+ t = t + c%a(k)
1598
+ end do
1599
+ end subroutine bump
1600
+ end module nd_m
1601
+
1602
+ program nd
1603
+ use omp_lib
1604
+ use nd_m
1605
+ implicit none
1606
+ integer :: host_flag, i, tot, ha1, out
1607
+ logical :: ok
1608
+ type(node), pointer :: r
1609
+ type(view) :: v
1610
+ type(stat3) :: s
1611
+ host_flag = 1
1612
+ tot = 0
1613
+ ha1 = 0
1614
+ out = 0
1615
+ !$omp target map(from: host_flag)
1616
+ host_flag = merge(1, 0, omp_is_initial_device())
1617
+ !$omp end target
1618
+ allocate(r)
1619
+ allocate(r%nx)
1620
+ allocate(r%a(nm))
1621
+ allocate(r%nx%a(nm))
1622
+ do i = 1, nm
1623
+ r%a(i) = 100 + i - 1
1624
+ r%nx%a(i) = 200 + i - 1
1625
+ end do
1626
+ ok = .true.
1627
+ """
1628
+ _F_MAPS = """ !$omp map(to: r) map(to: r%a) map(to: r%nx) map(to: r%nx%a)"""
1629
+
1630
+
1631
+ def fnres_programs() -> list[Program]:
1632
+ ar = [100 + i for i in range(8)]
1633
+ ac = [200 + i for i in range(8)]
1634
+ out = []
1635
+ # C: a struct holding a pointer, returned by value and passed on
1636
+ body = _C_HEAD + """ #pragma omp target map(tofrom: tot) \\
1637
+ """ + _C_MAPS + """
1638
+ {
1639
+ struct view v = mkview(r->nx->a, NM);
1640
+ tot = vsum(v);
1641
+ v = mkview(r->a, NM);
1642
+ tot += vsum(v);
1643
+ }
1644
+ """
1645
+ out.append(_fn_program(
1646
+ "view-by-value", "c", "C OpenMP: a device function returns a struct "
1647
+ "that holds a pointer into a mapped array (by value, passed to a "
1648
+ "second function)", body, [("tot", sum(ar) + sum(ac))]))
1649
+ # C: a function returning a pointer to the next struct
1650
+ body = _C_HEAD + """ #pragma omp target enter data map(to: r[0:1]) map(to: r->a[0:NM]) \\
1651
+ map(to: r->nx[0:1]) map(to: r->nx->a[0:NM])
1652
+ #pragma omp target map(tofrom: tot)
1653
+ {
1654
+ for (int q = 0; q < NM; q++) {
1655
+ child(r)->a[q] = child(r)->a[q] + 5 * (q + 1);
1656
+ tot += child(r)->a[q];
1657
+ }
1658
+ }
1659
+ #pragma omp target exit data map(from: r->nx->a[0:NM]) map(from: r->nx[0:1]) \\
1660
+ map(from: r->a[0:NM]) map(from: r[0:1])
1661
+ for (i = 0; i < NM; i++) ha1 += r->nx->a[i];
1662
+ """
1663
+ new_ac = [v + 5 * (i + 1) for i, v in enumerate(ac)]
1664
+ out.append(_fn_program(
1665
+ "child-pointer", "c", "C OpenMP: a device function returns the "
1666
+ "pointer to the next struct of the chain; the kernel updates the "
1667
+ "child's array through it", body,
1668
+ [("tot", sum(new_ac)), ("ha1", sum(new_ac))]))
1669
+ # C: a struct with a fixed array returned by value
1670
+ body = _C_HEAD + """ #pragma omp target map(from: out) \\
1671
+ """ + _C_MAPS + """
1672
+ {
1673
+ struct stat3 s = summarize(r->nx->a, NM);
1674
+ out = s.sum * 1000 + s.mx * 10 + s.arr[3];
1675
+ }
1676
+ """
1677
+ arr = [0] * 4
1678
+ for k, v in enumerate(ac):
1679
+ arr[k % 4] += v
1680
+ out.append(_fn_program(
1681
+ "stats-struct", "c", "C OpenMP: a device function returns a struct "
1682
+ "with a fixed-size array computed from a mapped pointer member",
1683
+ body, [("out", sum(ac) * 1000 + max(ac) * 10 + arr[3])]))
1684
+ # Fortran
1685
+ fh = _F_HEAD
1686
+ body = fh + """ !$omp target map(tofrom: tot) &
1687
+ """ + _F_MAPS + """
1688
+ v = mkview(r%nx%a)
1689
+ tot = vsum(v)
1690
+ v = mkview(r%a)
1691
+ tot = tot + vsum(v)
1692
+ !$omp end target
1693
+ """
1694
+ out.append(_fn_program(
1695
+ "view-by-value", "f", "Fortran OpenMP: a device function result of "
1696
+ "derived type holds a pointer component associated with a mapped "
1697
+ "array", body, [("tot", sum(ar) + sum(ac))]))
1698
+ body = fh + """ !$omp target enter data map(to: r) map(to: r%a) map(to: r%nx) map(to: r%nx%a)
1699
+ !$omp target map(tofrom: tot)
1700
+ call bump(r, tot)
1701
+ !$omp end target
1702
+ !$omp target exit data map(from: r%nx%a) map(from: r%nx) map(from: r%a) map(from: r)
1703
+ ha1 = sum(r%nx%a)
1704
+ """
1705
+ out.append(_fn_program(
1706
+ "child-pointer", "f", "Fortran OpenMP: a device function returns "
1707
+ "a pointer to the next derived-type object of the chain; the kernel "
1708
+ "updates the child's array through it", body,
1709
+ [("tot", sum(new_ac)), ("ha1", sum(new_ac))]))
1710
+ body = fh + """ !$omp target map(from: out) &
1711
+ """ + _F_MAPS + """
1712
+ s = summarize(r%nx%a, nm)
1713
+ out = s%sum * 1000 + s%mx * 10 + s%arr(4)
1714
+ !$omp end target
1715
+ """
1716
+ out.append(_fn_program(
1717
+ "stats-struct", "f", "Fortran OpenMP: a device function result of "
1718
+ "derived type with a fixed-size array component, computed from a "
1719
+ "mapped pointer component", body,
1720
+ [("out", sum(ac) * 1000 + max(ac) * 10 + arr[3])]))
1721
+ return out