[gcc/devel/omp/gcc-16] openmp, Fortran: Add support using iterators with custom mappers in Fortran

Sandra Loosemore via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:289de210f318f2c794e4fb305e0a362b69f7ae3d

commit 289de210f318f2c794e4fb305e0a362b69f7ae3d
Author: Kwok Cheung Yeung <[email protected]>
Date:   Sat May 3 20:42:46 2025 +0000

    openmp, Fortran: Add support using iterators with custom mappers in Fortran
    
    gcc/fortran/
    
            * openmp.cc (gfc_omp_instantiate_mapper): Add argument for namespace.
            Apply namespace to new clauses.  Propagate namespace to nested
            mappers.
            (gfc_omp_instantiate_mappers): Pass namespace of clause to clauses
            generated by mappers.
    
    libgomp/
    
            * testsuite/libgomp.fortran/mapper-iterators-1.f90: New test.
            * testsuite/libgomp.fortran/mapper-iterators-2.f90: New test.
            * testsuite/libgomp.fortran/mapper-iterators-3.f90: New test.
            * testsuite/libgomp.fortran/mapper-iterators-4.f90: New test.
    
    Co-authored-by: Andrew Stubbs <[email protected]>

Diff:
---
 gcc/fortran/openmp.cc                              |  9 ++--
 .../libgomp.fortran/mapper-iterators-1.f90         | 38 ++++++++++++++++
 .../libgomp.fortran/mapper-iterators-2.f90         | 49 ++++++++++++++++++++
 .../libgomp.fortran/mapper-iterators-3.f90         | 33 ++++++++++++++
 .../libgomp.fortran/mapper-iterators-4.f90         | 52 ++++++++++++++++++++++
 5 files changed, 178 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 857ffb30d26a..67193c0d1be1 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -14642,6 +14642,7 @@ static gfc_omp_namelist **
 gfc_omp_instantiate_mapper (gfc_code *code, gfc_omp_namelist **outlistp,
 			    gfc_omp_namelist *clause,
 			    gfc_omp_map_op outer_map_op, gfc_omp_udm *udm,
+			    gfc_namespace *ns,
 			    toc_directive cd, int list)
 {
   /* Here "sym" and "expr" describe the clause as written, to be substituted
@@ -14759,14 +14760,15 @@ gfc_omp_instantiate_mapper (gfc_code *code, gfc_omp_namelist **outlistp,
 	new_clause->u.map.op = new_kind;
 
       new_clause->where = clause->where;
+      new_clause->u2.ns = ns;
 
       if (mapper_clause->u3.udm
 	  && mapper_clause->u3.udm->udm != udm)
 	{
 	  gfc_omp_udm *inner_udm = mapper_clause->u3.udm->udm;
 	  outlistp = gfc_omp_instantiate_mapper (code, outlistp, new_clause,
-						 outer_map_op, inner_udm, cd,
-						 list);
+						 outer_map_op, inner_udm, ns,
+						 cd, list);
 	}
       else
 	{
@@ -14815,7 +14817,8 @@ gfc_omp_instantiate_mappers (gfc_code *code, gfc_omp_clauses *clauses,
 	    }
 	  clausep = gfc_omp_instantiate_mapper (code, clausep, clause,
 						outer_map_op,
-						clause->u3.udm->udm, cd, list);
+						clause->u3.udm->udm,
+						clause->u2.ns, cd, list);
 	  *clausep = clause->next;
 	  invoked_mappers = true;
 	}
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90 b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
new file mode 100644
index 000000000000..d0f2bc3217d2
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
@@ -0,0 +1,38 @@
+program myprog
+  type t
+    integer :: size
+    integer :: arr(99)
+  end type t
+
+  type u
+    type(t) :: myt
+  end type u
+
+  integer :: i, j
+  integer, parameter :: N = 10
+  type(u) :: x(N)
+
+  !$omp declare mapper (t :: x) map(tofrom: x%size, x%arr(1:x%size))
+  !$omp declare mapper (u :: x) map(tofrom: x%myt)
+
+  do i = 1, N
+    x(i)%myt%size = 99
+    do j = 1, 99
+      x(i)%myt%arr(j) = i*j
+    end do
+  end do
+
+  !$omp target map(iterator(i=1:N), tofrom: x(i))
+    do i = 1, N
+      do j = 1, 99
+        x(i)%myt%arr(j) = x(i)%myt%arr(j) + 1
+      end do
+    end do
+  !$omp end target
+
+  do i = 1, N
+    do j = 1, 99
+      if (x(i)%myt%arr(j) /= i*j + 1) stop 1
+    end do
+  end do
+end program myprog
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90 b/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90
new file mode 100644
index 000000000000..e02e9d9af621
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90
@@ -0,0 +1,49 @@
+! { dg-do run }
+
+program myprog
+type t
+  integer, dimension (8) :: arr1
+end type t
+type u
+  type(t) :: t_elem
+end type u
+
+integer :: i
+integer, parameter :: N = 10
+type(u) :: myu(N)
+
+!$omp declare mapper (t :: x) map(x%arr1(5:8))
+!$omp declare mapper (tmapper: t :: x) map(x%arr1(1:4))
+!$omp declare mapper (u :: x) map(mapper(tmapper), tofrom: x%t_elem)
+
+do i = 1, N
+  myu(i)%t_elem%arr1(1) = 1
+  myu(i)%t_elem%arr1(5) = 1
+end do
+
+! Different ways of invoking nested mappers, named vs. unnamed
+
+!$omp target map(iterator (n=1:N), tofrom:myu(n)%t_elem)
+do i = 1, N
+  myu(i)%t_elem%arr1(5) = myu(i)%t_elem%arr1(5) + 1
+end do
+!$omp end target
+
+!$omp target map(iterator (n=1:N), tofrom:myu(n))
+do i = 1, N
+  myu(i)%t_elem%arr1(1) = myu(i)%t_elem%arr1(1) + 1
+end do
+!$omp end target
+
+!$omp target
+do i = 1, N
+  myu(i)%t_elem%arr1(1) = myu(i)%t_elem%arr1(1) + 1
+end do
+!$omp end target
+
+do i = 1, N
+  if (myu(i)%t_elem%arr1(1).ne.3) stop 1
+  if (myu(i)%t_elem%arr1(5).ne.2) stop 2
+end do
+
+end program myprog
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90 b/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90
new file mode 100644
index 000000000000..10d8ac6bf844
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90
@@ -0,0 +1,33 @@
+! { dg-do run }
+
+program myprog
+
+type A
+character(len=20) :: string1
+character(len=:), pointer :: string2
+end type A
+
+integer, parameter :: N = 8
+integer :: i
+
+!$omp declare mapper (A :: x) map(to:x%string1) map(from:x%string2)
+
+type(A) :: var(N)
+
+do i = 1, N
+  allocate(character(len=20) :: var(i)%string2)
+
+  var(i)%string1 = "hello world"
+end do
+
+!$omp target map(iterator (n=1:N), to:var(n)%string1) map(iterator (n=1:N), from:var(n)%string2)
+do i = 1, N
+  var(i)%string2 = var(i)%string1
+end do
+!$omp end target
+
+do i = 1, N
+  if (var(i)%string2.ne."hello world") stop 1
+end do
+
+end program myprog
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90 b/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90
new file mode 100644
index 000000000000..06eb0224ea67
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90
@@ -0,0 +1,52 @@
+! { dg-do run }
+
+module mymod
+type F
+integer :: a, b, c
+integer, dimension(10) :: d
+end type F
+
+type G
+integer :: x, y
+type(F), pointer :: myf
+integer :: z
+end type G
+
+! Check that nested mappers work inside modules.
+
+!$omp declare mapper (F :: f) map(to: f%b) map(f%d)
+!$omp declare mapper (G :: g) map(tofrom: g%myf)
+
+end module mymod
+
+program myprog
+use mymod
+
+integer, parameter :: N = 8
+integer :: i
+
+type(F), target :: ftmp(N)
+type(G) :: gvar(N)
+
+do i = 1, N
+  gvar(i)%myf => ftmp(i)
+  gvar(i)%myf%d = 0
+end do
+
+!$omp target map(iterator (n=1:N), tofrom: gvar(n)%myf)
+do i = 1, N
+  gvar(i)%myf%d(1) = gvar(i)%myf%d(1) + 1
+end do
+!$omp end target
+
+!$omp target map(iterator (n=1:N), tofrom: gvar(n))
+do i = 1, N
+  gvar(i)%myf%d(1) = gvar(i)%myf%d(1) + 1
+end do
+!$omp end target
+
+do i = 1, N
+  if (gvar(i)%myf%d(1).ne.2) stop 1
+end do
+
+end program myprog
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.