openacc: GOMP_MAP_ATTACH handling in find_group_last
Arrange for GOMP_MAP_ATTACH to be grouped together with a preceding GOMP_MAP_TO_PSET or other "to" data movement clause, except in cases where an explicit "attach" clause is used. 2020-07-09 Julian Brown <julian@codesourcery.com> include/ * gomp-constants.h (gomp_map_kind): Update comment for GOMP_MAP_TO_PSET. libgomp/ * oacc-mem.c (find_group_last): Group data-movement clauses (GOMP_MAP_TO_PSET, GOMP_MAP_TO, etc.) together with a subsequent GOMP_MAP_ATTACH. Allow standalone GOMP_MAP_ATTACH also.
This commit is contained in:
parent
ac8996edb1
commit
8d2e5026d2
|
@ -65,7 +65,10 @@ enum gomp_map_kind
|
|||
/* Also internal, behaves like GOMP_MAP_TO, but additionally any
|
||||
GOMP_MAP_POINTER records consecutive after it which have addresses
|
||||
falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't
|
||||
mapped already. */
|
||||
mapped already.
|
||||
For OpenACC attach operations (e.g. copyin of struct members),
|
||||
GOMP_MAP_TO_PSET is followed by a single GOMP_MAP_ATTACH mapping
|
||||
instead. */
|
||||
GOMP_MAP_TO_PSET = (GOMP_MAP_FLAG_SPECIAL_0 | 1),
|
||||
/* Must already be present. */
|
||||
GOMP_MAP_FORCE_PRESENT = (GOMP_MAP_FLAG_SPECIAL_0 | 2),
|
||||
|
|
|
@ -985,9 +985,15 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
|
|||
switch (kind0)
|
||||
{
|
||||
case GOMP_MAP_TO_PSET:
|
||||
while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
|
||||
if (pos + 1 < mapnum
|
||||
&& (kinds[pos + 1] & 0xff) == GOMP_MAP_ATTACH)
|
||||
return pos + 1;
|
||||
|
||||
while (pos + 1 < mapnum
|
||||
&& (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
|
||||
pos++;
|
||||
/* We expect at least one GOMP_MAP_POINTER after a GOMP_MAP_TO_PSET. */
|
||||
/* We expect at least one GOMP_MAP_POINTER (if not a single
|
||||
GOMP_MAP_ATTACH) after a GOMP_MAP_TO_PSET. */
|
||||
assert (pos > first_pos);
|
||||
break;
|
||||
|
||||
|
@ -1002,6 +1008,9 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
|
|||
gomp_fatal ("unexpected mapping");
|
||||
break;
|
||||
|
||||
case GOMP_MAP_ATTACH:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* GOMP_MAP_ALWAYS_POINTER can only appear directly after some other
|
||||
mapping. */
|
||||
|
@ -1012,9 +1021,16 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
|
|||
return pos + 1;
|
||||
}
|
||||
|
||||
/* We can have a single GOMP_MAP_ATTACH mapping after a to/from
|
||||
mapping. */
|
||||
if (pos + 1 < mapnum
|
||||
&& (kinds[pos + 1] & 0xff) == GOMP_MAP_ATTACH)
|
||||
return pos + 1;
|
||||
|
||||
/* We can have zero or more GOMP_MAP_POINTER mappings after a to/from
|
||||
(etc.) mapping. */
|
||||
while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
|
||||
while (pos + 1 < mapnum
|
||||
&& (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
|
||||
pos++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue