Hi Tobias!

On 2024-10-13T10:21:01+0200, Tobias Burnus <tbur...@baylibre.com> wrote:
> Now pushed as r15-4298-g3269a722b7a036.

> Tobias Burnus wrote:
>> Anyone feeling like reviewing this patch?

Yes.  But please allow for more than 1 1/2 work days.

>> Tobias Burnus write:
>>> Tobias Burnus wrote:
>>>> Sometimes waiting a bit leads to better code …
>>>>
>>>> Tobias Burnus wrote:
>>>>> ...
>>>>> [I guess, we eventually want to add support for more builtins. For 
>>>>> instance, acc_on_device would be a candidate, but I could imagine 
>>>>> some additional builtins.]
>>>>
>>>> I have now implemented acc_on_device and I think the new fix-up 
>>>> function is way is nicer.

Thanks for looking into this!

>>>> Thus, this patch does:

I wonder why you didn't make these several orthogonal changes into
several separate patches?

>>>> * (v1) Fix omp_is_initial_device → do only replace when used in 
>>>> calls (and not when used as function pointer/actual to a dummy 
>>>> function) + fix ICE due to integer(4) != logical(4) in the middle end.

No. 1.

>>>> * (new) For OpenACC, use a builtin for acc_on_device + actually do 
>>>> compile-time optimization when offloading is not configured.

No. 2.  This resolved
PR82250 "Fortran OpenACC acc_on_device early folding", right?
(..., which you recently had duplicated as
PR116269 "[OpenACC] acc_on_device – compile-time optimization fails",
right?)

Please:

    git mv gfortran.dg/goacc/acc_on_device-2{-off,_-fno-openacc}.f95

..., and add a 's%-fno-openacc%-fno-builtin-acc_on_device' variant.

Hmm, why can't 'gfortran.dg/goacc/acc_on_device-2.f95' be un-XFAILed?

>>>> * (new) libgomp.texi: Typo fixes accumulated, fix wording

No. 3.

>>>> and for 
>>>> acc_on_device, add a note that compile-time folding may be done (and 
>>>> how it can be disabled).

Into No. 2.

>>>> For OpenACC, I now mix compile time folding vs. runtime to ensure 
>>>> that it works.

No. 4.

And this:

    --- a/gcc/fortran/types.def
    +++ b/gcc/fortran/types.def
    
    -DEF_PRIMITIVE_TYPE (BT_BOOL,
    -               (*lang_hooks.types.type_for_size) (BOOL_TYPE_SIZE, 1))
    +DEF_PRIMITIVE_TYPE (BT_BOOL, boolean_type_node)

... is yet another unrelated change?  No. 5.

>>>> Tested on x86-64 without and with offloading configured, running 
>>>> with nvptx offloading.

>>>> PS: The testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c 
>>>> example is not completely clear to me; however, the new optimization 
>>>> causes that without offloading enabled, the dump message is not 
>>>> shown. I tried to understand it better with 
>>>> -fno-builtin-acc_on_device, but that then caused link errors as the 
>>>> device function wasn't optimizated away, leaving me puzzled. — At 
>>>> the end, I just changed the dg-* and did not try to understand the 
>>>> issue.

Why then not wait for someone else to help look into that?  :-)

On 2024-10-10T10:31:13+0200, Tobias Burnus <tbur...@baylibre.com> wrote:
> Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' 
> __builtin_is_initial_device

Missing 'omp_' in '__builtin_[omp_]is_initial_device'.


I just received a SIGKID; to be continued in follow-on emails.


Grüße
 Thomas


> It turned out that 'if (omp_is_initial_device() .eqv. true)' gave an ICE
> due to comparing 'int' with 'logical(4)'. When digging deeper, it also
> turned out that when the procedure pointer is needed, the builtin cannot
> be used, either.  (Follow up to r15-2799-gf1bfba3a9b3f31 )

> Extend the code to also use the builtin acc_on_device with OpenACC,
> which was previously only used in C/C++.  Additionally, fix folding
> when offloading is not enabled.
>
> Fixes additionally the BT_BOOL data type, which was 'char'/integer(1)
> instead of bool, backing the booleaness; use bool_type_node as the rest
> of GCC.
>
> gcc/fortran/ChangeLog:
>
>       * gfortran.h (gfc_option_t): Add disable_acc_on_device.
>       * options.cc (gfc_handle_option): Handle -fno-builtin-acc_on_device.
>       * trans-decl.cc (gfc_get_extern_function_decl): Move
>       __builtin_omp_is_initial_device handling to ...
>       * trans-expr.cc (get_builtin_fn): ... this new function.
>       (conv_function_val): Call it.
>       (update_builtin_function): New.
>       (gfc_conv_procedure_call): Call it.
>       * types.def (BT_BOOL): Fix type by using bool_type_node.
>
> gcc/ChangeLog:
>
>       * gimple-fold.cc (gimple_fold_builtin_acc_on_device): Also fold
>       when offloading is not configured.
>
> libgomp/ChangeLog:
>
>       * libgomp.texi (TR13): Fix minor typos.
>       (omp_is_initial_device): Improve wording.
>       (acc_on_device): Note how to disable the builtin.
>       * testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90: Remove TODO.
>       * testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f: Likewise.
>       Add -fno-builtin-acc_on_device.
>       * testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f: Likewise.
>       * testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c: Update
>       dg- as !offloading_enabled now compile-time expands acc_on_device.
>       * testsuite/libgomp.fortran/target-is-initial-device-3.f90: New test.
>       * testsuite/libgomp.oacc-fortran/acc_on_device-2.f90: New test.
>
>  gcc/fortran/gfortran.h                             |  3 +-
>  gcc/fortran/options.cc                             |  5 +-
>  gcc/fortran/trans-decl.cc                          |  9 ----
>  gcc/fortran/trans-expr.cc                          | 58 
> +++++++++++++++++++---
>  gcc/fortran/types.def                              |  3 +-
>  gcc/gimple-fold.cc                                 |  2 +-
>  libgomp/libgomp.texi                               | 18 ++++---
>  .../libgomp.fortran/target-is-initial-device-3.f90 | 50 +++++++++++++++++++
>  .../libgomp.oacc-c-c++-common/routine-nohost-1.c   |  3 +-
>  .../libgomp.oacc-fortran/acc_on_device-1-1.f90     |  5 --
>  .../libgomp.oacc-fortran/acc_on_device-1-2.f       |  7 +--
>  .../libgomp.oacc-fortran/acc_on_device-1-3.f       |  7 +--
>  .../libgomp.oacc-fortran/acc_on_device-2.f90       | 40 +++++++++++++++
>  13 files changed, 164 insertions(+), 46 deletions(-)
>
> diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
> index 917866a7ef0..680e7f7b75b 100644
> --- a/gcc/fortran/gfortran.h
> +++ b/gcc/fortran/gfortran.h
> @@ -3200,7 +3200,8 @@ typedef struct
>    int flag_init_logical;
>    int flag_init_character;
>    char flag_init_character_value;
> -  int disable_omp_is_initial_device;
> +  bool disable_omp_is_initial_device;
> +  bool disable_acc_on_device;
>  
>    int fpe;
>    int fpe_summary;
> diff --git a/gcc/fortran/options.cc b/gcc/fortran/options.cc
> index 6f2579ad9de..4920691dba6 100644
> --- a/gcc/fortran/options.cc
> +++ b/gcc/fortran/options.cc
> @@ -864,11 +864,14 @@ gfc_handle_option (size_t scode, const char *arg, 
> HOST_WIDE_INT value,
>        break;
>  
>      case OPT_fbuiltin_:
> -      /* We only handle -fno-builtin-omp_is_initial_device.  */
> +      /* We only handle -fno-builtin-omp_is_initial_device
> +      and -fno-builtin-acc_on_device.  */
>        if (value)
>       return false;  /* Not supported. */
>        if (!strcmp ("omp_is_initial_device", arg))
>       gfc_option.disable_omp_is_initial_device = true;
> +      else if (!strcmp ("acc_on_device", arg))
> +     gfc_option.disable_acc_on_device = true;
>        else
>       warning (0, "command-line option %<-fno-builtin-%s%> is not valid for "
>                "Fortran", arg);
> diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
> index 2586c6d7a79..56b6202510e 100644
> --- a/gcc/fortran/trans-decl.cc
> +++ b/gcc/fortran/trans-decl.cc
> @@ -2231,15 +2231,6 @@ gfc_get_extern_function_decl (gfc_symbol * sym, 
> gfc_actual_arglist *actual_args,
>       to know that.  */
>    gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
>  
> -  if (!gfc_option.disable_omp_is_initial_device
> -      && flag_openmp && sym->attr.function && sym->ts.type == BT_LOGICAL
> -      && !strcmp (sym->name, "omp_is_initial_device"))
> -    {
> -      sym->backend_decl
> -     = builtin_decl_explicit (BUILT_IN_OMP_IS_INITIAL_DEVICE);
> -      return sym->backend_decl;
> -    }
> -
>    if (sym->attr.proc_pointer)
>      return get_proc_pointer_decl (sym);
>  
> diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
> index 9f223a1314a..8094171eb27 100644
> --- a/gcc/fortran/trans-expr.cc
> +++ b/gcc/fortran/trans-expr.cc
> @@ -4381,13 +4381,51 @@ conv_base_obj_fcn_val (gfc_se * se, tree base_object, 
> gfc_expr * expr)
>    se->expr = build_fold_addr_expr_loc (input_location, se->expr);
>  }
>  
> +static tree
> +get_builtin_fn (gfc_symbol * sym)
> +{
> +  if (!gfc_option.disable_omp_is_initial_device
> +      && flag_openmp && sym->attr.function && sym->ts.type == BT_LOGICAL
> +      && !strcmp (sym->name, "omp_is_initial_device"))
> +    return builtin_decl_explicit (BUILT_IN_OMP_IS_INITIAL_DEVICE);
> +
> +  if (!gfc_option.disable_acc_on_device
> +      && flag_openacc && sym->attr.function && sym->ts.type == BT_LOGICAL
> +      && !strcmp (sym->name, "acc_on_device_h"))
> +    return builtin_decl_explicit (BUILT_IN_ACC_ON_DEVICE);
> +
> +  return NULL_TREE;
> +}
> +
> +static tree
> +update_builtin_function (tree fn_call, gfc_symbol *sym)
> +{
> +  tree fn = TREE_OPERAND (CALL_EXPR_FN (fn_call), 0);
> +
> +  if (DECL_FUNCTION_CODE (fn) == BUILT_IN_OMP_IS_INITIAL_DEVICE)
> +     /* In Fortran omp_is_initial_device returns logical(4)
> +     but the builtin uses 'int'.  */
> +    return fold_convert (TREE_TYPE (TREE_TYPE (sym->backend_decl)), fn_call);
> +
> +  else if (DECL_FUNCTION_CODE (fn) == BUILT_IN_ACC_ON_DEVICE)
> +    {
> +      /* Likewise for the return type; additionally, the argument it a
> +      call-by-value int, Fortran has a by-reference 'integer(4)'.  */
> +      tree arg = build_fold_indirect_ref_loc (input_location,
> +                                           CALL_EXPR_ARG (fn_call, 0));
> +      CALL_EXPR_ARG (fn_call, 0) = fold_convert (integer_type_node, arg);
> +      return fold_convert (TREE_TYPE (TREE_TYPE (sym->backend_decl)), 
> fn_call);
> +    }
> +  return fn_call;
> +}
>  
>  static void
> -conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr,
> -                gfc_actual_arglist *actual_args)
> +conv_function_val (gfc_se * se, bool *is_builtin, gfc_symbol * sym,
> +                gfc_expr * expr, gfc_actual_arglist *actual_args)
>  {
>    tree tmp;
>  
> +  *is_builtin = false;
>    if (gfc_is_proc_ptr_comp (expr))
>      tmp = get_proc_ptr_comp (expr);
>    else if (sym->attr.dummy)
> @@ -4404,9 +4442,13 @@ conv_function_val (gfc_se * se, gfc_symbol * sym, 
> gfc_expr * expr,
>        if (!sym->backend_decl)
>       sym->backend_decl = gfc_get_extern_function_decl (sym, actual_args);
>  
> -      TREE_USED (sym->backend_decl) = 1;
> -
> -      tmp = sym->backend_decl;
> +      if ((tmp = get_builtin_fn (sym)) != NULL_TREE)
> +     *is_builtin = true;
> +      else
> +     {
> +       TREE_USED (sym->backend_decl) = 1;
> +       tmp = sym->backend_decl;
> +     }
>  
>        if (sym->attr.cray_pointee)
>       {
> @@ -6324,6 +6366,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
>    gfc_actual_arglist *arg;
>    int has_alternate_specifier = 0;
>    bool need_interface_mapping;
> +  bool is_builtin;
>    bool callee_alloc;
>    bool ulim_copy;
>    gfc_typespec ts;
> @@ -8164,7 +8207,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
>  
>    /* Generate the actual call.  */
>    if (base_object == NULL_TREE)
> -    conv_function_val (se, sym, expr, args);
> +    conv_function_val (se, &is_builtin, sym, expr, args);
>    else
>      conv_base_obj_fcn_val (se, base_object, expr);
>  
> @@ -8189,6 +8232,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
>    fntype = TREE_TYPE (TREE_TYPE (se->expr));
>    se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist);
>  
> +  if (is_builtin)
> +    se->expr = update_builtin_function (se->expr, sym);
> +
>    /* Allocatable scalar function results must be freed and nullified
>       after use. This necessitates the creation of a temporary to
>       hold the result to prevent duplicate calls.  */
> diff --git a/gcc/fortran/types.def b/gcc/fortran/types.def
> index 390cc9542f7..aa61750ec59 100644
> --- a/gcc/fortran/types.def
> +++ b/gcc/fortran/types.def
> @@ -45,8 +45,7 @@ along with GCC; see the file COPYING3.  If not see
>      the type pointed to.  */
>  
>  DEF_PRIMITIVE_TYPE (BT_VOID, void_type_node)
> -DEF_PRIMITIVE_TYPE (BT_BOOL,
> -                 (*lang_hooks.types.type_for_size) (BOOL_TYPE_SIZE, 1))
> +DEF_PRIMITIVE_TYPE (BT_BOOL, boolean_type_node)
>  DEF_PRIMITIVE_TYPE (BT_INT, integer_type_node)
>  DEF_PRIMITIVE_TYPE (BT_UINT, unsigned_type_node)
>  DEF_PRIMITIVE_TYPE (BT_LONG, long_integer_type_node)
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index 942de7720fd..9a84483f9bf 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -4190,7 +4190,7 @@ static bool
>  gimple_fold_builtin_acc_on_device (gimple_stmt_iterator *gsi, tree arg0)
>  {
>    /* Defer folding until we know which compiler we're in.  */
> -  if (symtab->state != EXPANSION)
> +  if (ENABLE_OFFLOADING && symtab->state != EXPANSION)
>      return false;
>  
>    unsigned val_host = GOMP_DEVICE_HOST;
> diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
> index cc44efdd937..6860963f368 100644
> --- a/libgomp/libgomp.texi
> +++ b/libgomp/libgomp.texi
> @@ -547,7 +547,7 @@ Technical Report (TR) 13 is the third preview for OpenMP 
> 6.0.
>  @item @code{no_openmp_constructs} assumptions clause @tab N @tab
>  @item Restriction for @code{ordered} regarding loop-transforming directives
>        @tab N @tab
> -@item @code{apply} code to loop-transforming constructs @tab N @tab
> +@item @code{apply} clause to loop-transforming constructs @tab N @tab
>  @item Non-constant values in the @code{sizes} clause @tab N @tab
>  @item @code{fuse} loop-transformation construct @tab N @tab
>  @item @code{interchange} loop-transformation construct @tab N @tab
> @@ -573,7 +573,7 @@ Technical Report (TR) 13 is the third preview for OpenMP 
> 6.0.
>  @item New @code{priority} clause to @code{target}, @code{target_enter_data},
>        @code{target_data}, @code{target_exit_data} and @code{target_update}
>        @tab N @tab
> -@item New @code{device_type} clause to the @code{target} directive.
> +@item New @code{device_type} clause to the @code{target} directive
>        @tab N @tab
>  @item @code{target_data} as composite construct @tab N @tab
>  @item @code{nowait} clause with reverse-offload @code{target} directives
> @@ -584,7 +584,7 @@ Technical Report (TR) 13 is the third preview for OpenMP 
> 6.0.
>  @item @code{memscope} clause to @code{atomic} and @code{flush} @tab N @tab
>  @item New @code{transparent} clause for multi-generational task-dependence 
> graphs
>        @tab N @tab
> -@item The @code{cancel} construct new completes tasks with unfulfilled events
> +@item The @code{cancel} construct now completes tasks with unfulfilled events
>        @tab N @tab
>  @item @code{omp_fulfill_event} routine was restricted regarding fulfillment 
> of
>        event variables @tab N @tab
> @@ -622,7 +622,7 @@ Technical Report (TR) 13 is the third preview for OpenMP 
> 6.0.
>  @item @code{ompt_get_buffer_limits} OMPT routine @tab N @tab
>  @end multitable
>  
> -@unnumberedsubsec Deprecated features, unless listed above.
> +@unnumberedsubsec Deprecated features, unless listed above
>  @multitable @columnfractions .60 .10 .25
>  @item Deprecation of omitting the optional white space to separate adjacent
>        keywords in the directive-name in Fortran (fixed and free source form)
> @@ -1915,9 +1915,9 @@ This function returns @code{true} if currently running 
> on the host device,
>  @code{false} otherwise.  Here, @code{true} and @code{false} represent
>  their language-specific counterparts.
>  
> -Note that in GCC this value is already folded to a constant in the compiler;
> -compile with @option{-fno-builtin-omp_is_initial_device} if a run-time 
> function
> -is desired.
> +Note that in GCC this function call is already folded to a constant in the
> +compiler; compile with @option{-fno-builtin-omp_is_initial_device} if a
> +run-time function is desired.
>  
>  @item @emph{C/C++}:
>  @multitable @columnfractions .20 .80
> @@ -4886,6 +4886,10 @@ In Fortran, @code{true} is returned. If the program is 
> not executing
>  on the specified device type C/C++ returns zero, while Fortran
>  returns @code{false}.
>  
> +Note that in GCC, depending on @var{devicetype}, the function call might
> +be folded to a constant in the compiler; compile with
> +@option{-fno-builtin-acc_on_device} if a run-time function is desired.
> +
>  @item @emph{C/C++}:
>  @multitable @columnfractions .20 .80
>  @item @emph{Prototype}: @tab @code{acc_on_device(acc_device_t devicetype);}
> diff --git a/libgomp/testsuite/libgomp.fortran/target-is-initial-device-3.f90 
> b/libgomp/testsuite/libgomp.fortran/target-is-initial-device-3.f90
> new file mode 100644
> index 00000000000..3ce24f1757d
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.fortran/target-is-initial-device-3.f90
> @@ -0,0 +1,50 @@
> +! { dg-additional-options "-fdump-tree-original" }
> +!
> +! Check that EXPR_EQ works with __builtin_omp_is_initial_device,
> +! which returns an 'int' while Fortran uses 'logical(4)'.
> +!
> +! Check that 'call ff (omp_is_initial_device)' accesses the library
> +! function and not the builtin.
> +!
> +! { dg-final { scan-tree-dump-times "__builtin_omp_is_initial_device \\(\\)" 
> 14 "original" } } */
> +! { dg-final { scan-tree-dump "ff \\(omp_is_initial_device\\);" "original" } 
> } */
> +!
> +program main
> +  use omp_lib, only: omp_is_initial_device
> +  implicit none (type, external)
> +
> +  logical(1) :: t1
> +  logical(2) :: f2
> +  t1 = .true.
> +  f2 = .false.
> +
> +  if (omp_is_initial_device () .eqv. .true.) then
> +  else
> +    stop 1
> +  end if
> +  if (omp_is_initial_device () .neqv. .true.) stop 2
> +  if (omp_is_initial_device () .eqv. .false.) stop 3
> +  if (omp_is_initial_device () .neqv. .false.) then
> +  else
> +    stop 4
> +  end if
> +
> +  if (omp_is_initial_device () .neqv. .true._1) stop 5
> +  if (omp_is_initial_device () .eqv. .false._1) stop 6
> +  if (omp_is_initial_device () .neqv. .true._2) stop 7
> +  if (omp_is_initial_device () .eqv. .false._2) stop 8
> +  if (omp_is_initial_device () .neqv. .true._4) stop 9
> +  if (omp_is_initial_device () .eqv. .false._4) stop 10
> +  if (omp_is_initial_device () .neqv. .true._8) stop 11
> +  if (omp_is_initial_device () .eqv. .false._8) stop 12
> +
> +  if (omp_is_initial_device () .neqv. t1) stop 13
> +  if (omp_is_initial_device () .eqv. f2) stop 14
> +
> +  call ff (omp_is_initial_device)
> +contains
> +  subroutine ff(xx)
> +    procedure (omp_is_initial_device) :: xx
> +    if (.not. xx ()) stop 15
> +  end
> +end
> diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c 
> b/libgomp/testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c
> index 7dc7459e5fe..e64711b536b 100644
> --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c
> +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c
> @@ -36,8 +36,7 @@ static int fact_nohost(int n)
>  
>    return fact(n);
>  }
> -/* { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'fact_nohost' has 
> 'nohost' clause\.$} 1 oaccloops { target c } } }
> -   { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'int 
> fact_nohost\(int\)' has 'nohost' clause\.$} 1 oaccloops { target { c++ && { ! 
> offloading_enabled } } } } }
> +/* { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'fact_nohost' has 
> 'nohost' clause\.$} 1 oaccloops { target { c && offloading_enabled } } } }
>     { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 
> 'fact_nohost\(int\)' has 'nohost' clause\.$} 1 oaccloops { target { c++ && 
> offloading_enabled } } } }
>     TODO See PR101551 for 'offloading_enabled' differences.  */
>  
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 
> b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
> index cd599e5d0e3..89748204f05 100644
> --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
> @@ -7,11 +7,6 @@
>  ! { dg-additional-options "-foffload=--param=openacc-privatization=noisy" }
>  ! for testing/documenting aspects of that functionality.
>  
> -! TODO: Have to disable the acc_on_device builtin for we want to test the
> -! libgomp library function?  The command line option
> -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not for
> -! Fortran.
> -
>  use openacc
>  implicit none
>  
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f 
> b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
> index eb3daba0188..e31e0fc715b 100644
> --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
> @@ -1,5 +1,5 @@
>  ! { dg-do run }
> -! { dg-additional-options "-cpp" }
> +! { dg-additional-options "-cpp -fno-builtin-acc_on_device" }
>  
>  ! { dg-additional-options "-fopt-info-all-omp" }
>  ! { dg-additional-options "--param=openacc-privatization=noisy" }
> @@ -7,11 +7,6 @@
>  ! { dg-additional-options "-foffload=--param=openacc-privatization=noisy" }
>  ! for testing/documenting aspects of that functionality.
>  
> -! TODO: Have to disable the acc_on_device builtin for we want to test
> -! the libgomp library function?  The command line option
> -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not
> -! for Fortran.
> -
>        USE OPENACC
>        IMPLICIT NONE
>  
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f 
> b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
> index 5f500c19481..0595be241f8 100644
> --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
> @@ -1,5 +1,5 @@
>  ! { dg-do run }
> -! { dg-additional-options "-cpp" }
> +! { dg-additional-options "-cpp -fno-builtin-acc_on_device" }
>  
>  ! { dg-additional-options "-fopt-info-all-omp" }
>  ! { dg-additional-options "--param=openacc-privatization=noisy" }
> @@ -7,11 +7,6 @@
>  ! { dg-additional-options "-foffload=--param=openacc-privatization=noisy" }
>  ! for testing/documenting aspects of that functionality.
>  
> -! TODO: Have to disable the acc_on_device builtin for we want to test
> -! the libgomp library function?  The command line option
> -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not
> -! for Fortran.
> -
>        IMPLICIT NONE
>        INCLUDE "openacc_lib.h"
>  
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-2.f90 
> b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-2.f90
> new file mode 100644
> index 00000000000..39d4357dd55
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-2.f90
> @@ -0,0 +1,40 @@
> +! { dg-do link }
> +
> +! Check whether 'acc_on_device()' is properly compile-time optimized. */
> +
> +! { dg-additional-options "-fdump-tree-gimple -fdump-tree-optimized" }
> +! { dg-additional-options -foffload-options=-fdump-tree-optimized { target { 
> offload_device_nvptx || offload_target_amdgcn } } }
> +
> +! { dg-final { scan-tree-dump-times "acc_on_device" 1 "gimple" } }
> +
> +! { dg-final { scan-tree-dump-not "acc_on_device" "optimized" } }
> +
> +! { dg-final { only_for_offload_target amdgcn-amdhsa 
> scan-offload-tree-dump-not "acc_on_device" "optimized" { target 
> offload_target_amdgcn } } }
> +! { dg-final { only_for_offload_target nvptx-none scan-offload-tree-dump-not 
> "acc_on_device" "optimized" { target offload_target_nvptx } } }
> +
> +
> +module m
> +   integer :: xxxx
> +   !$acc declare device_resident(xxxx)
> +contains
> +  subroutine set_var
> +    !$acc routine
> +    use openacc
> +    implicit none (type, external)
> +    if (acc_on_device(acc_device_host)) then
> +      xxxx = 1234
> +    else
> +      xxxx = 4242
> +    end if
> +  end
> +end module m
> +
> +
> +program main
> +  use m
> +  call set_var
> +  !$acc serial
> +    ! { dg-warning "using 'vector_length \\(32\\)', ignoring 1" "" { target 
> openacc_nvidia_accel_selected } .-1 }
> +    call set_var
> +  !$acc end serial
> +end

Reply via email to