]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix lexically-nested data mappings for no_alloc or optional arguments
authorJulian Brown <julian@codesourcery.com>
Tue, 21 May 2019 00:27:38 +0000 (17:27 -0700)
committerThomas Schwinge <thomas@codesourcery.com>
Tue, 3 Mar 2020 11:17:59 +0000 (12:17 +0100)
gcc/
* gimplify.c (gimplify_adjust_omp_clauses_1): Support implied no_alloc
and optional arguments based on mappings in enclosing data regions.

(cherry picked from openacc-gcc-9-branch commit
34ca2518b914173caec7f3287b29cd1b012e0d8d)

gcc/ChangeLog.omp
gcc/gimplify.c

index eac7b7a52452bf061880910b6f3bc8a331d77ab0..5fa50356f7439f93f034f4d6fd7891bbb7502589 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-20  Julian Brown  <julian@codesourcery.com>
+
+       * gimplify.c (gimplify_adjust_omp_clauses_1): Support implied no_alloc
+       and optional arguments based on mappings in enclosing data regions.
+
 2019-05-19  Julian Brown  <julian@codesourcery.com>
 
        * gimplify.c (oacc_array_mapping_info): Add REF field.
index 7e46ef459e876dc0e12e700671b6ecc6cf44e65e..56d707d735d6c72c073f173787188e6961581fc7 100644 (file)
@@ -9853,9 +9853,12 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
     {
       tree mapping = array_info->mapping;
       tree pointer = array_info->pointer;
-      const gomp_map_kind presence_kind
-       = omp_is_optional_argument (decl) ? GOMP_MAP_NO_ALLOC
-                                         : GOMP_MAP_FORCE_PRESENT;
+      gomp_map_kind presence_kind = GOMP_MAP_FORCE_PRESENT;
+      bool no_alloc = (OMP_CLAUSE_CODE (mapping) == OMP_CLAUSE_MAP
+                      && OMP_CLAUSE_MAP_KIND (mapping) == GOMP_MAP_NO_ALLOC);
+
+      if (no_alloc || omp_is_optional_argument (decl))
+        presence_kind = GOMP_MAP_NO_ALLOC;
 
       if (code == OMP_CLAUSE_FIRSTPRIVATE)
        /* Oops, we have the wrong type of clause.  Rebuild it.  */
@@ -9870,7 +9873,8 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
       tree nc = build_omp_clause (OMP_CLAUSE_LOCATION (clause),
                                  OMP_CLAUSE_MAP);
       OMP_CLAUSE_DECL (nc) = unshare_expr (OMP_CLAUSE_DECL (pointer));
-      OMP_CLAUSE_SET_MAP_KIND (nc, GOMP_MAP_POINTER);
+      OMP_CLAUSE_SET_MAP_KIND (nc, no_alloc ? GOMP_MAP_FIRSTPRIVATE_POINTER
+                                           : GOMP_MAP_POINTER);
 
       /* For GOMP_MAP_FIRSTPRIVATE_POINTER, this is a bias, not a size.  */
       OMP_CLAUSE_SIZE (nc) = unshare_expr (OMP_CLAUSE_SIZE (pointer));