]> 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)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Wed, 21 Apr 2021 16:33:49 +0000 (09:33 -0700)
gcc/
* gimplify.c (gimplify_adjust_omp_clauses_1): Support implied no_alloc
and optional arguments based on mappings in enclosing data regions.

gcc/ChangeLog.omp
gcc/gimplify.c

index eabcfb9e44bb02e606e62a62078ef942b8b04b84..f98933fd60fa153b4f0ec4b215b6139dad64c49b 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 5b9e51ea785cf1bebd0cf1b52b191281bc0d2c97..28fb659536d2bf59e43e3408e073c2a0e65696e6 100644 (file)
@@ -10449,9 +10449,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_check_optional_argument (decl, false) ? GOMP_MAP_IF_PRESENT
-                                                   : 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_IF_PRESENT);
+
+      if (no_alloc || omp_check_optional_argument (decl, false))
+        presence_kind = GOMP_MAP_IF_PRESENT;
 
       if (code == OMP_CLAUSE_FIRSTPRIVATE)
        /* Oops, we have the wrong type of clause.  Rebuild it.  */
@@ -10466,7 +10469,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));