On Fri, Nov 21, 2014 at 11:19:26PM +0300, Ilya Verbin wrote:
> Hi,
> 
> '#pragma omp critical (name)' can be placed in the function, marked
> with '#pragma omp declare target', in this case the corresponding node
> should be marked as offloadable too.
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Please add a testcase for this.

>       * omp-low.c (lower_omp_critical): Mark critical sections
>       inside target functions as offloadable.
> 
> 
> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> index 3924282..6c5774c 100644
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -9366,16 +9366,6 @@ lower_omp_critical (gimple_stmt_iterator *gsi_p, 
> omp_context *ctx)
>         DECL_ARTIFICIAL (decl) = 1;
>         DECL_IGNORED_P (decl) = 1;
>  
> -       /* If '#pragma omp critical' is inside target region, the symbol must
> -          be marked for offloading.  */
> -       omp_context *octx;
> -       for (octx = ctx->outer; octx; octx = octx->outer)
> -         if (is_targetreg_ctx (octx))
> -           {
> -             varpool_node::get_create (decl)->offloadable = 1;
> -             break;
> -           }
> -
>         varpool_node::finalize_decl (decl);
>  
>         critical_name_mutexes->put (name, decl);
> @@ -9383,6 +9373,20 @@ lower_omp_critical (gimple_stmt_iterator *gsi_p, 
> omp_context *ctx)
>        else
>       decl = *n;
>  
> +      /* If '#pragma omp critical' is inside target region or
> +      inside function marked as offloadable, the symbol must be
> +      marked as offloadable too.  */
> +      omp_context *octx;
> +      if (cgraph_node::get (current_function_decl)->offloadable)
> +     varpool_node::get_create (decl)->offloadable = 1;
> +      else
> +     for (octx = ctx->outer; octx; octx = octx->outer)
> +       if (is_targetreg_ctx (octx))
> +         {
> +           varpool_node::get_create (decl)->offloadable = 1;
> +           break;
> +         }
> +
>        lock = builtin_decl_explicit (BUILT_IN_GOMP_CRITICAL_NAME_START);
>        lock = build_call_expr_loc (loc, lock, 1, build_fold_addr_expr_loc 
> (loc, decl));
>  

        Jakub

Reply via email to