diff options
author | Julian Brown <julian@codesourcery.com> | 2020-06-11 06:43:59 -0700 |
---|---|---|
committer | Julian Brown <julian@codesourcery.com> | 2020-07-13 10:10:33 -0700 |
commit | 91e25d6ababe0924f6080d1a92b185fa1611ba8a (patch) | |
tree | 6a1f3549eef6309c9d6c0a4b83a0d712da9eaf6c /libgomp | |
parent | ea219a53fde044bc1335643644f261cb7496fd9a (diff) | |
download | gcc-91e25d6ababe0924f6080d1a92b185fa1611ba8a.tar.gz |
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.
(cherry picked from commit 8d2e5026d22b3f30e7df7adfd4ebf4ebc1e77e2d)
Diffstat (limited to 'libgomp')
-rw-r--r-- | libgomp/oacc-mem.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/libgomp/oacc-mem.c b/libgomp/oacc-mem.c index 4fb78ee9634..247ca135804 100644 --- a/libgomp/oacc-mem.c +++ b/libgomp/oacc-mem.c @@ -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++; } |