[gcc/devel/omp/gcc-14] OpenACC: Allow implicit uses of assumed-size arrays in offload regions

Paul-Antoine Arras parras@gcc.gnu.org
Fri Jun 28 09:53:41 GMT 2024


https://gcc.gnu.org/g:5813266ee2fc9f9f9e90e44f72bde348411318e4

commit 5813266ee2fc9f9f9e90e44f72bde348411318e4
Author: Julian Brown <julian@codesourcery.com>
Date:   Mon Jun 19 09:10:14 2023 +0000

    OpenACC: Allow implicit uses of assumed-size arrays in offload regions
    
    This patch reimplements the functionality of the previously-reverted
    patch "Assumed-size arrays with non-lexical data mappings". The purpose
    is to support implicit uses of assumed-size arrays for Fortran when those
    arrays have already been mapped on the target some other way (e.g. by
    "acc enter data").
    
    This relates to upstream OpenACC issue 489 (not yet resolved).
    
    2023-06-16  Julian Brown  <julian@codesourcery.com>
    
    gcc/fortran/
            * trans-openmp.cc (gfc_omp_finish_clause): Treat implicitly-mapped
            assumed-size arrays as zero-sized for OpenACC, rather than an error.
    
    gcc/testsuite/
            * gfortran.dg/goacc/assumed-size.f90: Don't expect error.
    
    libgomp/
            * testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-1.f90: New
            test.
            * testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-2.f90: New
            test.

Diff:
---
 gcc/fortran/ChangeLog.omp                          |  5 +++
 gcc/fortran/trans-openmp.cc                        | 16 ++++++---
 gcc/testsuite/ChangeLog.omp                        |  4 +++
 gcc/testsuite/gfortran.dg/goacc/assumed-size.f90   |  4 +--
 libgomp/ChangeLog.omp                              |  7 ++++
 .../nonlexical-assumed-size-1.f90                  | 28 +++++++++++++++
 .../nonlexical-assumed-size-2.f90                  | 40 ++++++++++++++++++++++
 7 files changed, 98 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index e28e1133d69..cbf99275a44 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,8 @@
+2023-06-19  Julian Brown  <julian@codesourcery.com>
+
+	* trans-openmp.cc (gfc_omp_finish_clause): Treat implicitly-mapped
+	assumed-size arrays as zero-sized for OpenACC, rather than an error.
+
 2023-06-19  Julian Brown  <julian@codesourcery.com>
 
 	* trans-openmp.cc (gfc_omp_finish_clause): Handle "declare create" for
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 33436bd9c5f..73441836fbc 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -1596,6 +1596,7 @@ gfc_omp_finish_clause (tree c, gimple_seq *pre_p, bool openacc)
     return;
 
   tree decl = OMP_CLAUSE_DECL (c);
+  bool assumed_size = false;
 
   /* Assumed-size arrays can't be mapped implicitly, they have to be
      mapped explicitly using array sections.  */
@@ -1606,9 +1607,14 @@ gfc_omp_finish_clause (tree c, gimple_seq *pre_p, bool openacc)
 				GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)) - 1)
 	 == NULL)
     {
-      error_at (OMP_CLAUSE_LOCATION (c),
-		"implicit mapping of assumed size array %qD", decl);
-      return;
+      if (openacc)
+	assumed_size = true;
+      else
+	{
+	  error_at (OMP_CLAUSE_LOCATION (c),
+		    "implicit mapping of assumed size array %qD", decl);
+	  return;
+	}
     }
 
   if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FORCE_DEVICEPTR)
@@ -1663,7 +1669,9 @@ gfc_omp_finish_clause (tree c, gimple_seq *pre_p, bool openacc)
       else
 	{
 	  OMP_CLAUSE_DECL (c) = decl;
-	  OMP_CLAUSE_SIZE (c) = NULL_TREE;
+	  OMP_CLAUSE_SIZE (c) = assumed_size ? size_zero_node : NULL_TREE;
+	  if (assumed_size)
+	    OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
 	}
       if (TREE_CODE (TREE_TYPE (orig_decl)) == REFERENCE_TYPE
 	  && (GFC_DECL_GET_SCALAR_POINTER (orig_decl)
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 5bafd09b66f..55c2248f2ce 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,7 @@
+2023-06-19  Julian Brown  <julian@codesourcery.com>
+
+	* gfortran.dg/goacc/assumed-size.f90: Don't expect error.
+
 2023-06-19  Julian Brown  <julian@codesourcery.com>
 
 	* c-c++-common/goacc/acc-data-chain.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/goacc/assumed-size.f90 b/gcc/testsuite/gfortran.dg/goacc/assumed-size.f90
index 4fced2e70c9..12f44c4743a 100644
--- a/gcc/testsuite/gfortran.dg/goacc/assumed-size.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/assumed-size.f90
@@ -4,7 +4,8 @@
 ! exit data, respectively.
 
 ! This does not appear to be supported by the OpenACC standard as of version
-! 3.0.  Check for an appropriate error message.
+! 3.0.  There is however real-world code that relies on this working, so we
+! make an attempt to support it.
 
 program test
   implicit none
@@ -26,7 +27,6 @@ subroutine dtest (a, n)
   !$acc enter data copyin(a(1:n))
 
   !$acc parallel loop
-! { dg-error {implicit mapping of assumed size array 'a'} "" { target *-*-* } .-1 }
   do i = 1, n
      a(i) = i
   end do
diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp
index ff49b4769de..630a21b030e 100644
--- a/libgomp/ChangeLog.omp
+++ b/libgomp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2023-06-19  Julian Brown  <julian@codesourcery.com>
+
+	* testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-1.f90: New
+	test.
+	* testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-2.f90: New
+	test.
+
 2023-06-19  Julian Brown  <julian@codesourcery.com>
 
 	* testsuite/libgomp.oacc-fortran/declare-create-1.f90: New test.
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-1.f90
new file mode 100644
index 00000000000..4b61e1cee9b
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-1.f90
@@ -0,0 +1,28 @@
+! { dg-do run }
+
+program p
+implicit none
+integer :: myarr(10)
+
+myarr = 0
+
+call subr(myarr)
+
+if (myarr(5).ne.5) stop 1
+
+contains
+
+subroutine subr(arr)
+implicit none
+integer :: arr(*)
+
+!$acc enter data copyin(arr(1:10))
+
+!$acc serial
+arr(5) = 5
+!$acc end serial
+
+!$acc exit data copyout(arr(1:10))
+
+end subroutine subr
+end program p
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-2.f90 b/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-2.f90
new file mode 100644
index 00000000000..daf7089915f
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/nonlexical-assumed-size-2.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+
+program p
+implicit none
+integer :: myarr(10)
+
+myarr = 0
+
+call subr(myarr)
+
+if (myarr(5).ne.5) stop 1
+
+contains
+
+subroutine subr(arr)
+implicit none
+integer :: arr(*)
+
+! At first glance, it might not be obvious how this works.  The "enter data"
+! and "exit data" operations expand to a pair of mapping nodes for OpenACC,
+! GOMP_MAP_{TO/FROM} and GOMP_MAP_POINTER.  The former maps the array data,
+! and the latter creates a separate mapping on the target for the pointer
+! itself with a bias so it represents the "zeroth" element.
+
+!$acc enter data copyin(arr(2:8))
+
+! ...then this implicit mapping creates a zero-length array section
+! (GOMP_MAP_ZERO_LEN_ARRAY_SECTION) followed by another GOMP_MAP_POINTER for
+! 'arr'.  But now that pointer is already "present" on the target, so is not
+! overwritten.
+
+!$acc serial
+! This access is then done via the on-target pointer.
+arr(5) = 5
+!$acc end serial
+
+!$acc exit data copyout(arr(2:8))
+
+end subroutine subr
+end program p


More information about the Gcc-cvs mailing list