https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113724
--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Debugging shows:
In gimplify_adjust_omp_clauses
(line numbers are off by 1 as I have a #pragma GCC optimize("O0") on top of the
file):
13717 groups = omp_gather_mapping_groups (list_p);
...
13720 if (groups)
13721 {
13722 grpmap = omp_index_mapping_groups (groups);
13723
13724 omp_resolve_clause_dependencies (code, groups, grpmap);
13725 omp_build_struct_sibling_lists (code, ctx->region_type,
groups,
13726 &grpmap, list_p);
On the outermost side:
(gdb) p debug(*list_p)
num_teams(-2) thread_limit(0)
(gdb) p debug(*list_p)
map(tofrom:S1.b) map(tofrom:S1.a) map(tofrom:S1.p) map(tofrom:*S1.p [len: 400])
map(attach_detach:S1.p [bias: 0])
The latter goes into the 'if (groups)' and list_p after line 13726 is:
(gdb) p debug(*list_p)
map(struct:S1 [len: 3]) map(tofrom:S1.a) map(tofrom:S1.b)
The later ICE / segfault is because 'map(struct' has len = 3 but only two map
clauses follow.
And the other question is: Why is 'S1.p' gone?
* * *
The 'struct' (GOMP_MAP_STRUCT) with initial length is created by
omp_accumulate_sibling_list:
11120 OMP_CLAUSE_SET_MAP_KIND (l, str_kind);
11121 OMP_CLAUSE_DECL (l) = unshare_expr (base);
11122 OMP_CLAUSE_SIZE (l) = size_int (1);
and later updated via
11462 OMP_CLAUSE_SIZE (*osc)
11463 = size_binop (PLUS_EXPR, OMP_CLAUSE_SIZE (*osc),
size_one_node);
11464
11465 if (reprocessing_struct)
* * *
This works fine for:
map(tofrom:S1.b)
-> create struct with len=1
It works also for:
map(tofrom:S1.a)
-> update struct len to 2 + add 'S1.a'
But not for:
map(tofrom:S1.p)
-> does update len to 3 but doesn't add 'S1.p'.
I do note that at:
11382 if (attach_detach && sc == grp_start_p)
(gdb) p attach_detach
$139 = true
(gdb) p sc == grp_start_p
$140 = false
(gdb) p debug(*sc)
map(tofrom:S1.b) map(tofrom:S1.p) map(tofrom:*S1.p [len: 400])
map(attach_detach:S1.p [bias: 0])
(gdb) p debug(*grp_start_p)
map(tofrom:*S1.p [len: 400]) map(attach_detach:S1.p [bias: 0])