https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120505
Bug ID: 120505 Summary: [OpenMP] Fortran deep mapping of alloc comp + component mapping like 'map(var%arr(1)%alloc)' in target (enter/exit) data Product: gcc Version: 16.0 Status: UNCONFIRMED Keywords: openmp, wrong-code Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: burnus at gcc dot gnu.org Target Milestone: --- Created attachment 61559 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61559&action=edit Fortran testcase Found with SPEC hpc's 619.clvleaf_s. The problem is code like: ----------------- !$omp target enter data map(var%tiles(1)%den1, var%tiles(1)%den2) ... !$omp target map(var) ! explicit or implicit. ----------------- The latter attempts a deep mapping of 'var' – which will have issues if part of the data has already been mapped: - extending partially mapped data - mapping "too much". RFC: What does 'target enter data map(var%tiles(1)%den1, ...%den2)' map? Just a (partial) struct map of 'type t', i.e. struct var.tiles->data(1) [len: 2] map var.tiles->data(1).den1 (+ alloc comp) map var.tiles->data(1).den2 (+ alloc comp) or because it is an allocatable component (C++ reference type), does it also map: struct var [len: 1] var.tiles (+ attach of...) var.tiles->data + attach var.tiles->data(1) to data In any case, '!$omp target map(/* always : */ var)' shall not map 'var%tiles(1)%den3' (as 'den{1,2}' has been struct mapped) - attempting to do so will cause an runtime error. Still, with 'map(always: var)' * 'var%tiles(1)%den{1,2}' has to be updated * if either of them was previous unallocated, they should get deep mapped. If 'var' counts as mapped (see RFC above), there is no need to walk the allocatable components, except for 'always'. In particular, the previously unmapped 'var%tiles(2)' shouldn't be mapped in that case - as 'var%tiles(1)' has then be mapped before. * * * Possible ingredients to solve this issue: * GCC could add 'implicit' to the deep mapping (might not be needed) * add 'begin/end alloc comp' flags to 'kinds' - need to check whether where - and whether that solves the skip 'dep3->data' mapping and + dep3 map/attach, but still handles updating dep{1,2}->data updating (with always) deep mapping of either (if previously unallocated + 'always').