On Tue, May 10, 2016 at 01:29:50PM -0700, Cesar Philippidis wrote:
> @@ -12542,7 +12543,7 @@ c_finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>         t = OMP_CLAUSE_DECL (c);
>         if (TREE_CODE (t) == TREE_LIST)
>           {
> -           if (handle_omp_array_sections (c, ort & C_ORT_OMP))
> +           if (handle_omp_array_sections (c, ort & (C_ORT_OMP | C_ORT_ACC)))
>               {
>                 remove = true;
>                 break;

There are no array sections in Cilk+, so the above is always then (for C).
Thus, the is_omp argument to handle_omp_array_sections* should be removed
and code adjusted.

> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clasues", t);

Typo.

> +           else
> +             error ("%qD appears both in data and map clauses", t);
>             remove = true;
>           }
>         else
> @@ -12893,7 +12908,10 @@ c_finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>           }
>         else if (bitmap_bit_p (&map_head, DECL_UID (t)))
>           {
> -           error ("%qD appears both in data and map clauses", t);
> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clasues", t);

Likewise.

> +           else
> +             error ("%qD appears both in data and map clauses", t);
>             remove = true;
>           }
>         else

> @@ -5796,12 +5796,14 @@ tree
>  finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
>  {
>    bitmap_head generic_head, firstprivate_head, lastprivate_head;
> -  bitmap_head aligned_head, map_head, map_field_head;
> +  bitmap_head aligned_head, map_head, map_field_head, oacc_reduction_head;
>    tree c, t, *pc;
>    tree safelen = NULL_TREE;
>    bool branch_seen = false;
>    bool copyprivate_seen = false;
>    bool ordered_seen = false;
> +  bool allow_fields = (ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
> +    || ort == C_ORT_ACC;
>  

Formatting.  You want = already on the new line, or add () around the whole
rhs and align || below (ort &.

Though, this looks wrong to me, does OpenACC all of sudden support
privatization of non-static data members in methods?

>    bitmap_obstack_initialize (NULL);
>    bitmap_initialize (&generic_head, &bitmap_default_obstack);
> @@ -5810,6 +5812,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>    bitmap_initialize (&aligned_head, &bitmap_default_obstack);
>    bitmap_initialize (&map_head, &bitmap_default_obstack);
>    bitmap_initialize (&map_field_head, &bitmap_default_obstack);
> +  bitmap_initialize (&oacc_reduction_head, &bitmap_default_obstack);
>  
>    for (pc = &clauses, c = clauses; c ; c = *pc)
>      {
> @@ -5829,8 +5832,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>         t = OMP_CLAUSE_DECL (c);
>         if (TREE_CODE (t) == TREE_LIST)
>           {
> -           if (handle_omp_array_sections (c, ((ort & C_ORT_OMP_DECLARE_SIMD)
> -                                              == C_ORT_OMP)))
> +           if (handle_omp_array_sections (c, allow_fields))

IMNSHO you don't want to change this, instead adjust C++
handle_omp_array_sections* where it deals with array sections to just use
the is_omp variant; there are still other places where it deals with
non-static data members and I think you don't want to change those.
>               {
>                 remove = true;
>                 break;
> @@ -6040,6 +6042,17 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>                      omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
>             remove = true;
>           }
> +       else if (ort == C_ORT_ACC
> +                && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION)
> +         {
> +           if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t)))
> +             {
> +               error ("%qD appears more than once in reduction clauses", t);
> +               remove = true;
> +             }
> +           else
> +             bitmap_set_bit (&oacc_reduction_head, DECL_UID (t));
> +         }
>         else if (bitmap_bit_p (&generic_head, DECL_UID (t))
>                  || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
>                  || bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
> @@ -6050,7 +6063,10 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>         else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
>                  && bitmap_bit_p (&map_head, DECL_UID (t)))
>           {
> -           error ("%qD appears both in data and map clauses", t);
> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clauses", t);
> +           else
> +             error ("%qD appears both in data and map clauses", t);
>             remove = true;
>           }
>         else
> @@ -6076,7 +6092,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>           omp_note_field_privatization (t, OMP_CLAUSE_DECL (c));
>         else
>           t = OMP_CLAUSE_DECL (c);
> -       if (t == current_class_ptr)
> +       if (ort != C_ORT_ACC && t == current_class_ptr)
>           {
>             error ("%<this%> allowed in OpenMP only in %<declare simd%>"
>                    " clauses");
> @@ -6103,7 +6119,10 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>           }
>         else if (bitmap_bit_p (&map_head, DECL_UID (t)))
>           {
> -           error ("%qD appears both in data and map clauses", t);
> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clauses", t);
> +           else
> +             error ("%qD appears both in data and map clauses", t);
>             remove = true;
>           }
>         else
> @@ -6551,8 +6570,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>           }
>         if (TREE_CODE (t) == TREE_LIST)
>           {
> -           if (handle_omp_array_sections (c, ((ort & C_ORT_OMP_DECLARE_SIMD)
> -                                              == C_ORT_OMP)))
> +           if (handle_omp_array_sections (c, allow_fields))
>               remove = true;
>             break;
>           }
> @@ -6586,8 +6604,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>         t = OMP_CLAUSE_DECL (c);
>         if (TREE_CODE (t) == TREE_LIST)
>           {
> -           if (handle_omp_array_sections (c, ((ort & C_ORT_OMP_DECLARE_SIMD)
> -                                              == C_ORT_OMP)))
> +           if (handle_omp_array_sections (c, allow_fields))
>               remove = true;
>             else
>               {
> @@ -6616,6 +6633,9 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>                         if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
>                           error ("%qD appears more than once in motion"
>                                  " clauses", t);
> +                       else if (ort == C_ORT_ACC)
> +                         error ("%qD appears more than once in data"
> +                                " clauses", t);
>                         else
>                           error ("%qD appears more than once in map"
>                                  " clauses", t);
> @@ -6627,6 +6647,27 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>                         bitmap_set_bit (&map_field_head, DECL_UID (t));
>                       }
>                   }
> +               else if (TREE_CODE (t) == TREE_LIST)
> +                 {
> +                   while (TREE_CODE (t = TREE_CHAIN (t)) == TREE_LIST)
> +                     ;

This looks too ugly.  Please avoid the assignment inside of TREE_CODE.
Better:
                      do
                        t = TREE_CHAIN (t);
                      while (TREE_CODE (t) == TREE_LIST);
or while loop.  Also, I'm surprised you are adding a new whole if, if it is
something you hit only for C_ORT_ACC (why), then it should be also guarded
with ort == C_ORT_ACC.  TREE_LIST should mean just type dependent array
section, on which IMHO nothing should be done.

> +
> +                   if (DECL_P (t))
> +                     {
> +                       if (bitmap_bit_p (&map_head, DECL_UID (t)))
> +                         {
> +                           if (ort == C_ORT_ACC)
> +                             error ("%qD appears more than once in data "
> +                                    "clauses", t);
> +                           else
> +                             error ("%qD appears more than once in map "
> +                                    "clauses", t);
> +                           remove = true;
> +                         }
> +                       else
> +                         bitmap_set_bit (&map_head, DECL_UID (t));
> +                     }
> +                 }
>               }
>             break;
>           }
> @@ -6703,7 +6744,7 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>                    omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
>             remove = true;
>           }
> -       else if (t == current_class_ptr)
> +       else if (ort != C_ORT_ACC && t == current_class_ptr)
>           {
>             error ("%<this%> allowed in OpenMP only in %<declare simd%>"
>                    " clauses");
> @@ -6752,7 +6793,10 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>               }
>             else if (bitmap_bit_p (&map_head, DECL_UID (t)))
>               {
> -               error ("%qD appears both in data and map clauses", t);
> +               if (ort == C_ORT_ACC)
> +                 error ("%qD appears more than once in data clauses", t);
> +               else
> +                 error ("%qD appears both in data and map clauses", t);
>                 remove = true;
>               }
>             else
> @@ -6762,6 +6806,8 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>           {
>             if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
>               error ("%qD appears more than once in motion clauses", t);
> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clauses", t);
>             else
>               error ("%qD appears more than once in map clauses", t);
>             remove = true;
> @@ -6769,7 +6815,10 @@ finish_omp_clauses (tree clauses, enum 
> c_omp_region_type ort)
>         else if (bitmap_bit_p (&generic_head, DECL_UID (t))
>                  || bitmap_bit_p (&firstprivate_head, DECL_UID (t)))
>           {
> -           error ("%qD appears both in data and map clauses", t);
> +           if (ort == C_ORT_ACC)
> +             error ("%qD appears more than once in data clauses", t);
> +           else
> +             error ("%qD appears both in data and map clauses", t);
>             remove = true;
>           }
>         else
> diff --git a/gcc/gimplify.c b/gcc/gimplify.c
> index f13980d..512b3dd 100644
> --- a/gcc/gimplify.c
> +++ b/gcc/gimplify.c
> @@ -6255,6 +6255,9 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree 
> decl, bool in_code)
>                       error ("variable %qE declared in enclosing "
>                              "%<host_data%> region", DECL_NAME (decl));
>                     nflags |= GOVD_MAP;
> +                   if (octx->region_type == ORT_ACC_DATA
> +                       && (n2->value & GOVD_MAP_0LEN_ARRAY))
> +                     nflags |= GOVD_MAP_0LEN_ARRAY;
>                     goto found_outer;
>                   }
>               }
> @@ -6830,9 +6833,14 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
> *pre_p,
>           {
>           case OMP_TARGET:
>             break;
> +         case OACC_DATA:
> +           if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
> +             break;
>           case OMP_TARGET_DATA:
>           case OMP_TARGET_ENTER_DATA:
>           case OMP_TARGET_EXIT_DATA:
> +         case OACC_ENTER_DATA:
> +         case OACC_EXIT_DATA:
>           case OACC_HOST_DATA:
>             if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER
>                 || (OMP_CLAUSE_MAP_KIND (c)
> @@ -7286,6 +7294,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
> *pre_p,
>                   omp_notice_variable (outer_ctx, t, true);
>               }
>           }
> +       if (code == OACC_DATA && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
> +           && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER)

If you need more than one line for an if condition, put each && subcondition
on separate line.

> +         flags |= GOVD_MAP_0LEN_ARRAY;
>         omp_add_variable (ctx, decl, flags);
>         if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
>             && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
> @@ -7544,6 +7555,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
> *pre_p,
>         gcc_unreachable ();
>       }
>  
> +      if (code == OACC_DATA && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
> +       && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER)
> +     remove = true;

Likewise.

        Jakub

Reply via email to