On Fri, Sep 13, 2013 at 02:36:14PM +0200, Jakub Jelinek wrote:
> FYI, I'm attaching a WIP patch with the splay tree stuff, debugging
> target-1.c with OMP_DEFAULT_DEVICE=257 right now (with all tgtv related
> stuff removed), but hitting some error regarding OMP_CLAUSE_MAP_POINTER
> reallocation, supposedly a bug on the compiler side.  But e.g. fn2 and fn3
> already seem to pass with that, only fn4 is problematic.

Ok, found the bug, this should fix fn4 and the whole test passes
now with OMP_DEFAULT_DEVICE=257.

Will commit once the http://gcc.gnu.org/ml/gcc-patches/2013-09/msg01044.html
issue is resolved.

2013-09-13  Jakub Jelinek  <ja...@redhat.com>

        * omp-low.c (install_var_field): Use (mask & 4) to request double
        indirection.
        (scan_sharing_clauses): For OMP_CLAUSE_MAP_POINTER arrays pass
        7 instead of 3 to install_var_field.
        (lower_omp_target): For OMP_CLAUSE_MAP_POINTER arrays add extra
        indirection.

--- gcc/omp-low.c.jj    2013-09-12 13:55:34.000000000 +0200
+++ gcc/omp-low.c       2013-09-13 15:57:58.425272908 +0200
@@ -1017,7 +1017,12 @@ install_var_field (tree var, bool by_ref
              || !splay_tree_lookup (ctx->sfield_map, (splay_tree_key) var));
 
   type = TREE_TYPE (var);
-  if (by_ref)
+  if (mask & 4)
+    {
+      gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
+      type = build_pointer_type (build_pointer_type (type));
+    }
+  else if (by_ref)
     type = build_pointer_type (type);
   else if ((mask & 3) == 1 && is_reference (var))
     type = TREE_TYPE (type);
@@ -1587,7 +1592,13 @@ scan_sharing_clauses (tree clauses, omp_
                }
              else
                {
-                 install_var_field (decl, true, 3, ctx);
+                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
+                     && OMP_CLAUSE_MAP_KIND (c) == OMP_CLAUSE_MAP_POINTER
+                     && !OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION (c)
+                     && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
+                   install_var_field (decl, true, 7, ctx);
+                 else
+                   install_var_field (decl, true, 3, ctx);
                  if (gimple_omp_target_kind (ctx->stmt)
                      == GF_OMP_TARGET_KIND_REGION)
                    install_var_local (decl, ctx);
@@ -9331,6 +9342,11 @@ lower_omp_target (gimple_stmt_iterator *
          {
            x = build_receiver_ref (var, true, ctx);
            tree new_var = lookup_decl (var, ctx);
+           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
+               && OMP_CLAUSE_MAP_KIND (c) == OMP_CLAUSE_MAP_POINTER
+               && !OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION (c)
+               && TREE_CODE (TREE_TYPE (var)) == ARRAY_TYPE)
+             x = build_simple_mem_ref (x);
            SET_DECL_VALUE_EXPR (new_var, x);
            DECL_HAS_VALUE_EXPR_P (new_var) = 1;
          }
@@ -9435,7 +9451,20 @@ lower_omp_target (gimple_stmt_iterator *
              {
                tree var = lookup_decl_in_outer_ctx (ovar, ctx);
                tree x = build_sender_ref (ovar, ctx);
-               if (is_gimple_reg (var))
+               if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
+                   && OMP_CLAUSE_MAP_KIND (c) == OMP_CLAUSE_MAP_POINTER
+                   && !OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION (c)
+                   && TREE_CODE (TREE_TYPE (ovar)) == ARRAY_TYPE)
+                 {
+                   gcc_assert (kind == GF_OMP_TARGET_KIND_REGION);
+                   tree avar
+                     = create_tmp_var (TREE_TYPE (TREE_TYPE (x)), NULL);
+                   mark_addressable (avar);
+                   gimplify_assign (avar, build_fold_addr_expr (var), &ilist);
+                   avar = build_fold_addr_expr (avar);
+                   gimplify_assign (x, avar, &ilist);
+                 }
+               else if (is_gimple_reg (var))
                  {
                    gcc_assert (kind == GF_OMP_TARGET_KIND_REGION);
                    tree avar = create_tmp_var (TREE_TYPE (var), NULL);


        Jakub

Reply via email to