On 04/05/2017 01:22 PM, Thomas Schwinge wrote:

>> --- a/gcc/gimplify.c
>> +++ b/gcc/gimplify.c
>> @@ -6102,14 +6102,19 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, 
>> tree decl, unsigned flags)
>>  {
>>    const char *rkind;
>>    bool on_device = false;
>> +  bool is_private = false;
> 
> So the intention here is that by default everything stays the same as
> before; "is_private == false".  This property is satisfied in the
> following code.

Yes.

>>    tree type = TREE_TYPE (decl);
>>  
>>    if (lang_hooks.decls.omp_privatize_by_reference (decl))
>>      type = TREE_TYPE (type);
>>  
>> +  if (RECORD_OR_UNION_TYPE_P (type))
>> +    is_private = lang_hooks.decls.omp_disregard_value_expr (decl, false);
>> +
>>    if ((ctx->region_type & (ORT_ACC_PARALLEL | ORT_ACC_KERNELS)) != 0
>>        && is_global_var (decl)
>> -      && device_resident_p (decl))
>> +      && device_resident_p (decl)
>> +      && !is_private)
>>      {
>>        on_device = true;
>>        flags |= GOVD_MAP_TO_ONLY;
> |      }
> 
> For "is_private == true" we will not possibly enter this block.
> 
> | [ORT_ACC_KERNELS]
>>        /* Scalars are default 'copy' under kernels, non-scalars are default
>>       'present_or_copy'.  */
>>        flags |= GOVD_MAP;
>> -      if (!AGGREGATE_TYPE_P (type))
>> +      if (!AGGREGATE_TYPE_P (type) && !is_private)
>>      flags |= GOVD_MAP_FORCE;
> 
> For "is_private == true" we will not possibly enter this block, which
> means in this case we will map both scalars and aggregates as
> "present_or_copy".

Yes. Inside kernels regions, everything is pcopy, unless it's private.

Some private variables include, e.g., fortran array descriptors.

>>      case ORT_ACC_PARALLEL:
>>        {
>> -    if (on_device || AGGREGATE_TYPE_P (type))
>> +    if (!is_private && (on_device || AGGREGATE_TYPE_P (type)))
>>        /* Aggregates default to 'present_or_copy'.  */
>>        flags |= GOVD_MAP;
>>      else
> |       /* Scalars default to 'firstprivate'.  */
> |       flags |= GOVD_FIRSTPRIVATE;
> 
> For "is_private == true" we will not possibly enter the "if" block, so we
> will always enter the "else" block, which means in this case we will map
> both scalars and aggregates as "firstprivate".
> 
> Is that all correct?

Yes. Is there something wrong with that behavior or is it just unclear?

Cesar

Reply via email to