On Mon, Jul 29, 2019 at 10:00:53PM +0100, Kwok Cheung Yeung wrote:
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -11636,9 +11636,40 @@ lower_omp_target (gimple_stmt_iterator *gsi_p,
> omp_context *ctx)
>             tkind = GOMP_MAP_FIRSTPRIVATE_INT;
>           type = TREE_TYPE (ovar);
>           if (TREE_CODE (type) == ARRAY_TYPE)
> -           var = build_fold_addr_expr (var);
> +           {
> +             var = build_fold_addr_expr (var);
> +             gimplify_assign (x, var, &ilist);
> +           }
>           else
>             {
> +             tree opt_arg_label;
> +             bool optional_arg_p
> +               = TREE_CODE (TREE_TYPE (ovar)) == POINTER_TYPE
> +                 && omp_is_optional_argument (ovar);

This should be also wrapped in ()s for emacs, like:

                bool optional_arg_p
                  = (TREE_CODE (TREE_TYPE (ovar)) == POINTER_TYPE
                     && omp_is_optional_argument (ovar));

> +
> +             if (optional_arg_p)
> +               {
> +                 tree null_label
> +                   = create_artificial_label (UNKNOWN_LOCATION);
> +                 tree notnull_label
> +                   = create_artificial_label (UNKNOWN_LOCATION);
> +                 opt_arg_label
> +                   = create_artificial_label (UNKNOWN_LOCATION);
> +                 tree new_x = copy_node (x);

Please use unshare_expr instead of copy_node here.

Otherwise LGTM.

On the OpenMP side this isn't sufficient, because it only
handles mapping clauses, not the data sharing, so I guess I'll need to go
through all data sharing clauses on all constructs, write testcases and see
if what OpenMP spec says (just a general rule):
"If a list item that appears in a directive or clause is an optional dummy 
argument that is not present,
the directive or clause for that list item is ignored.

If the variable referenced inside a construct is an optional dummy argument 
that is not present, any
explicitly determined, implicitly determined, or predetermined data-sharing and 
data-mapping
attribute rules for that variable are ignored. Otherwise, if the variable is an 
optional dummy
argument that is present, it is present inside the construct."
is handled right.

        Jakub

Reply via email to