[PATCH 2/9] [OpenACC] GOMP_MAP_ATTACH handling in find_group_last

Julian Brown julian@codesourcery.com
Tue Jun 16 22:38:32 GMT 2020


Later patches in this series assume that GOMP_MAP_ATTACH will 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.
This patch arranges for that to be so.

OK?

Julian

ChangeLog

	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.
---
 libgomp/oacc-mem.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/libgomp/oacc-mem.c b/libgomp/oacc-mem.c
index 936ae649dd9..be7f8d600eb 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:
+      return pos;
+
     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++;
     }
 
-- 
2.23.0



More information about the Gcc-patches mailing list