Fix omp target issue with Fortran optional arguments
authorTobias Burnus <tobias@codesourcery.com>
Wed, 2 Oct 2019 10:33:42 +0000 (10:33 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Wed, 2 Oct 2019 10:33:42 +0000 (12:33 +0200)
        gcc/
        * omp-low.c (lower_omp_target): Dereference optional argument
        to work with the right pointer.

        gcc/testsuite/
        * libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-1.f90: New.

From-SVN: r276445

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-1.f90 [new file with mode: 0644]

index 7e467035d1bc8469ea3c5b8cca107b0c8278cda7..6f577c36d641b74f9aecbcf20186caf91daefacd 100644 (file)
@@ -1,3 +1,8 @@
+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
index a0e5041d3f2d8a99743af7bc1497fba715de10c2..ca7dfdb83a1516a33099fa1e9d29ac8d147ddcf1 100644 (file)
@@ -11870,7 +11870,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
              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
index 4cb430364654e4611f2a3e22c5ffb147ce0e412b..d95e6e753f2212f8d39f4c58fc8d5fe7f0b3e700 100644 (file)
@@ -1,3 +1,7 @@
+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
diff --git a/libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-1.f90 b/libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-1.f90
new file mode 100644 (file)
index 0000000..93c6121
--- /dev/null
@@ -0,0 +1,36 @@
+! 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