https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108422

--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> ---
  FOR_EACH_VEC_ELT (*groups, i, grp)
    {
      if (grp->mark != PERMANENT)
        if (!omp_tsort_mapping_groups_1 (&cursor, groups, grpmap, grp))
          return NULL;
    }

first processes:

map(to:*(const struct ._anon_0 *) __closure) map(firstprivate:__closure
[pointer assign, bias: 0]) map(tofrom:*__closure->__a [len: 4])
map(always_pointer:__closure->__a [pointer assign, bias: 0]) map(to:*__closure)
map(to:*(const struct ._anon_0 *) __closure)

which then has:
  *innerp == grp
in omp_tsort_mapping_groups_1.

The next VEC has:

(gdb) p debug(*grp.grp_start)
map(tofrom:*__closure->__a [len: 4]) map(always_pointer:__closure->__a [pointer
assign, bias: 0]) map(to:*__closure) map(to:*(const struct ._anon_0 *)
__closure)

But the inner one is again the previous one:

(gdb) p debug(**innerp.grp_start)
map(to:*(const struct ._anon_0 *) __closure) map(firstprivate:__closure
[pointer assign, bias: 0]) map(tofrom:*__closure->__a [len: 4])
map(always_pointer:__closure->__a [pointer assign, bias: 0]) map(to:*__closure)
map(to:*(const struct ._anon_0 *) __closure)

where:

(gdb) p (*innerp)->mark
$78 = PERMANENT


Untested patch:

--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -9643 +9643 @@ omp_tsort_mapping_groups_1 (omp_mapping_group ***outlist,
-      if (innerp && *innerp != grp)
+      if (innerp && *innerp != grp && (*innerp)->mark != PERMANENT)

Reply via email to