https://gcc.gnu.org/g:8fab63e1ce20ea15bd99f805b7af003fab63f7fb
commit 8fab63e1ce20ea15bd99f805b7af003fab63f7fb Author: Kwok Cheung Yeung <kcye...@baylibre.com> Date: Tue Mar 11 22:41:54 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 <a...@baylibre.com> Diff: --- gcc/fortran/ChangeLog.omp | 8 ++++ gcc/fortran/openmp.cc | 9 ++-- libgomp/ChangeLog.omp | 7 +++ .../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 ++++++++++++++++++++++ 7 files changed, 193 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index d10c2f883cb6..1d05abede709 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,11 @@ +2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> + + * 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. + 2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> * trans-openmp.cc (gfc_trans_omp_array_section): Use macros for diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 99029d63059d..348c1b820ffc 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -14026,6 +14026,7 @@ static gfc_omp_namelist ** gfc_omp_instantiate_mapper (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 @@ -14141,14 +14142,15 @@ gfc_omp_instantiate_mapper (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 (outlistp, new_clause, - outer_map_op, inner_udm, cd, - list); + outer_map_op, inner_udm, ns, + cd, list); } else { @@ -14191,7 +14193,8 @@ gfc_omp_instantiate_mappers (gfc_code *code, gfc_omp_clauses *clauses, gcc_unreachable (); } clausep = gfc_omp_instantiate_mapper (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/ChangeLog.omp b/libgomp/ChangeLog.omp index 3612f1a419be..e441b06073db 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,10 @@ +2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> + + * 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. + 2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> * testsuite/libgomp.c-c++-common/mapper-iterators-1.c: New test. 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..a28f7cbac2ac --- /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..c550e73d7b38 --- /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..21db835fc174 --- /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