+2019-10-02 Tobias Burnus <tobias@codesourcery.com>
+
+ * omp-low.c (lower_omp_target): Dereference optional argument
+ to work with the right pointer.
+
2019-10-02 Kwok Cheung Yeung <kcy@codesourcery.com>
* langhooks-def.h (LANG_HOOKS_OMP_IS_OPTIONAL_ARGUMENT): Default to
var = build_fold_addr_expr (var);
else
{
- if (omp_is_reference (ovar))
+ if (omp_is_reference (ovar) || omp_is_optional_argument (ovar))
{
type = TREE_TYPE (type);
if (TREE_CODE (type) != ARRAY_TYPE
+2019-10-02 Tobias Burnus <tobias@codesourcery.com>
+
+ * libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-1.f90: New.
+
2019-10-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91940
--- /dev/null
+! Test whether use_device_ptr properly handles OPTIONAL arguments
+! (Only case of present arguments is tested)
+program test_it
+ implicit none
+ integer, target :: ixx
+ integer, pointer :: ptr_i, ptr_null
+
+ ptr_i => ixx
+ call foo(ptr_i)
+
+ ptr_null => null()
+ call bar(ptr_null)
+contains
+ subroutine foo(ii)
+ integer, pointer, optional :: ii
+
+ if (.not.present(ii)) call abort()
+ if (.not.associated(ii, ixx)) call abort()
+ !$omp target data map(to:ixx) use_device_ptr(ii)
+ if (.not.present(ii)) call abort()
+ if (.not.associated(ii)) call abort()
+ !$omp end target data
+ end subroutine foo
+
+ ! For bar, it is assumed that a NULL ptr on the host maps to NULL on the device
+ subroutine bar(jj)
+ integer, pointer, optional :: jj
+
+ if (.not.present(jj)) call abort()
+ if (associated(jj)) call abort()
+ !$omp target data map(to:ixx) use_device_ptr(jj)
+ if (.not.present(jj)) call abort()
+ if (associated(jj)) call abort()
+ !$omp end target data
+ end subroutine bar
+end program test_it