[PATCH, 1/3, OpenMP] Target mapping changes for OpenMP 5.0, front-end parts

Jakub Jelinek jakub@redhat.com
Tue Oct 13 13:01:38 GMT 2020


On Tue, Sep 01, 2020 at 09:16:23PM +0800, Chung-Lin Tang wrote:
> this patch set implements parts of the target mapping changes introduced
> in OpenMP 5.0, mainly the attachment requirements for pointer-based
> list items, and the clause ordering.
> 
> The first patch here are the C/C++ front-end changes.
> 
> The entire set of changes has been tested for without regressions for
> the compiler and libgomp. Hope this is ready to commit to master.

Sorry for the delay in patch review and thanks for the standard citations,
that really helps.

>         gcc/c-family/
>         * c-common.h (c_omp_adjust_clauses): New declaration.
>         * c-omp.c (c_omp_adjust_clauses): New function.

Besides the naming, I wonder why is it done in a separate function and so
early, can't what the function does be done either in
{,c_}finish_omp_clauses (provided we'd pass separate ORT_OMP vs.
ORT_OMP_TARGET to it to determine if it is target region vs. anything else),
or perhaps even better during gimplification (gimplify_scan_omp_clauses)?

>         gcc/c/
>         * c-parser.c (c_parser_omp_target_data): Add use of
>         new c_omp_adjust_clauses function. Add GOMP_MAP_ATTACH_DETACH as
> 	handled map clause kind.
>         (c_parser_omp_target_enter_data): Likewise.
>         (c_parser_omp_target_exit_data): Likewise.
>         (c_parser_omp_target): Likewise.
>         * c-typeck.c (handle_omp_array_sections): Adjust COMPONENT_REF case to
>         use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type.
>         (c_finish_omp_clauses): Adjust bitmap checks to allow struct decl and
>         same struct field access to co-exist on OpenMP construct.
> 
>         gcc/cp/
>         * parser.c (cp_parser_omp_target_data): Add use of
>         new c_omp_adjust_clauses function. Add GOMP_MAP_ATTACH_DETACH as
>         handled map clause kind.
>         (cp_parser_omp_target_enter_data): Likewise.
> 	(cp_parser_omp_target_exit_data): Likewise.
> 	(cp_parser_omp_target): Likewise.
> 	* semantics.c (handle_omp_array_sections): Adjust COMPONENT_REF case to
> 	use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type. Fix
> 	interaction between reference case and attach/detach.
> 	(finish_omp_clauses): Adjust bitmap checks to allow struct decl and
> 	same struct field access to co-exist on OpenMP construct.

The changelog has some 8 space indented lines.

> +  for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
> +    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
> +	&& OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER
> +	&& TREE_CODE (TREE_TYPE (OMP_CLAUSE_DECL (c))) != ARRAY_TYPE)
> +      {
> +	tree ptr = OMP_CLAUSE_DECL (c);
> +	bool ptr_mapped = false;
> +	if (is_target)
> +	  {
> +	    for (tree m = clauses; m; m = OMP_CLAUSE_CHAIN (m))

Isn't this O(n^2) in number of clauses?  I mean, e.g. for the equality
comparisons (but see below) it could be dealt with e.g. using some bitmap
with DECL_UIDs.

> +	      if (OMP_CLAUSE_CODE (m) == OMP_CLAUSE_MAP
> +		  && OMP_CLAUSE_DECL (m) == ptr

Does it really need to be equality?  I mean it will be for
map(tofrom:ptr) map(tofrom:ptr[:32])
but what about e.g.
map(tofrom:structx) map(tofrom:structx.ptr[:32])
?  It is true that likely we don't parse this yet though.

> +		  && (OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_ALLOC
> +		      || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_TO
> +		      || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_FROM
> +		      || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_TOFROM))

What about the always modified mapping kinds?

> +		{
> +		  ptr_mapped = true;
> +		  break;
> +		}
> +
> +	    if (!ptr_mapped
> +		&& DECL_P (ptr)
> +		&& is_global_var (ptr)
> +		&& lookup_attribute ("omp declare target",
> +				     DECL_ATTRIBUTES (ptr)))
> +	      ptr_mapped = true;
> +	  }
> +
> +	/* If the pointer variable was mapped, or if this is not an offloaded
> +	   target region, adjust the map kind to attach/detach.  */
> +	if (ptr_mapped || !is_target)
> +	  {
> +	    OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ATTACH_DETACH);
> +	    c_common_mark_addressable_vec (ptr);

Though perhaps this is argument why it needs to be done in the FEs and not
during gimplification, because it is hard to mark something addressable at
that point.

> --- a/gcc/c/c-typeck.c
> +++ b/gcc/c/c-typeck.c
> @@ -13580,16 +13580,17 @@ handle_omp_array_sections (tree c, enum c_omp_region_type ort)
>  	    break;
>  	  }
>        tree c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP);
>        if (ort != C_ORT_OMP && ort != C_ORT_ACC)
>  	OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_POINTER);
>        else if (TREE_CODE (t) == COMPONENT_REF)
>  	{
> -	  gomp_map_kind k = (ort == C_ORT_ACC) ? GOMP_MAP_ATTACH_DETACH
> -					       : GOMP_MAP_ALWAYS_POINTER;
> +	  gomp_map_kind k
> +	    = ((ort == C_ORT_ACC || ort == C_ORT_OMP)
> +	       ? GOMP_MAP_ATTACH_DETACH : GOMP_MAP_ALWAYS_POINTER);

So what kind of C_ORT_* would be left after this change? 
C_ORT_*DECLARE_SIMD shouldn't have any kind of array sections in it.
So maybe just

>  	  OMP_CLAUSE_SET_MAP_KIND (c2, k);
OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ALWAYS_POINTER);
?

>  	      if (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
>  		{
> -		  if (bitmap_bit_p (&map_field_head, DECL_UID (t)))
> +		  if (bitmap_bit_p (&map_field_head, DECL_UID (t))
> +		      || bitmap_bit_p (&map_head, DECL_UID (t)))
>  		    break;

Shall this change apply to OpenACC too?

>  		}
>  	    }
>  	  if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
>  	    {
>  	      error_at (OMP_CLAUSE_LOCATION (c),
>  			"%qE is not a variable in %qs clause", t,
> @@ -14751,29 +14753,36 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
>  		    error_at (OMP_CLAUSE_LOCATION (c),
>  			      "%qD appears both in data and map clauses", t);
>  		  remove = true;
>  		}
>  	      else
>  		bitmap_set_bit (&generic_head, DECL_UID (t));
>  	    }
> -	  else if (bitmap_bit_p (&map_head, DECL_UID (t)))
> +	  else if (bitmap_bit_p (&map_head, DECL_UID (t))
> +		   && !bitmap_bit_p (&map_field_head, DECL_UID (t)))

Ditto.  Otherwise, what shall this diagnose now that the restriction that
the same list item may not appear in multiple clauses is gone.

>  	    {
>  	      if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
>  		error_at (OMP_CLAUSE_LOCATION (c),
>  			  "%qD appears more than once in motion clauses", t);
>  	      else if (ort == C_ORT_ACC)
>  		error_at (OMP_CLAUSE_LOCATION (c),
>  			  "%qD appears more than once in data clauses", t);
>  	      else
>  		error_at (OMP_CLAUSE_LOCATION (c),
>  			  "%qD appears more than once in map clauses", t);
>  	      remove = true;

So what is this supposed to diagnose now that the restriction that

C++ ditto.

	Jakub



More information about the Gcc-patches mailing list