Hi Tobias! On 2025-04-15T11:30:18+0200, Tobias Burnus <tbur...@baylibre.com> wrote: > --- /dev/null > +++ b/libgomp/testsuite/libgomp.fortran/map-alloc-comp-6.f90 > @@ -0,0 +1,308 @@ > +! NOTE: This code uses POINTER. > +! While map(p, var%p) etc. maps the ptr/ptr comp p / var%p (incl. > allocatable comps), > +! map(var) does not map var%p. > + > +use iso_c_binding > +implicit none > +type t2 > + integer, allocatable :: x, y, z > +end type t2 > +type t > + integer, pointer :: A => null() > + integer, pointer :: B(:) => null() > + type(t2), pointer :: C => null() > + type(t2), pointer :: D(:,:) => null() > +end type t > + > +type t3 > + type(t) :: Q > + type(t) :: R(5) > +end type > + > +type(t) :: var, var2 > +type(t3) :: var3, var4 > +integer(c_intptr_t) :: iptr > + > +! -------------------------------------- > +! Assign + allocate > +allocate (var%A, source=45) > +allocate (var%B(3), source=[1,2,3]) > +allocate (var%C) > +var%C%x = 6; var%C%y = 5; var%C%z = 4 > +allocate (var%D(2,2)) > +var%D(1,1)%x = 1 > +var%D(1,1)%y = 2 > +var%D(1,1)%z = 3 > +var%D(2,1)%x = 4 > +var%D(2,1)%y = 5 > +var%D(2,1)%z = 6 > +var%D(1,2)%x = 11 > +var%D(1,2)%y = 12 > +var%D(1,2)%z = 13 > +var%D(2,2)%x = 14 > +var%D(2,2)%y = 15 > +var%D(2,2)%z = 16 > + > +! Assign + allocate > +allocate (var2%A, source=145) > +allocate (var2%B, source=[991,992,993]) > +allocate (var2%C) > +var2%C%x = 996; var2%C%y = 995; var2%C%z = 994 > +allocate (var2%D(2,2)) > +var2%D(1,1)%x = 199 > +var2%D(1,1)%y = 299 > +var2%D(1,1)%z = 399 > +var2%D(2,1)%x = 499 > +var2%D(2,1)%y = 599 > +var2%D(2,1)%z = 699 > +var2%D(1,2)%x = 1199 > +var2%D(1,2)%y = 1299 > +var2%D(1,2)%z = 1399 > +var2%D(2,2)%x = 1499 > +var2%D(2,2)%y = 1599 > +var2%D(2,2)%z = 1699 > + > +block > + integer(c_intptr_t) :: loc_a, loc_b, loc_c, loc_d, loc2_a, loc2_b, loc2_c, > loc2_d > + loc_a = loc (var%a) > + loc_b = loc (var%b) > + loc_c = loc (var%d) > + loc_d = loc (var%d) > + loc2_a = loc (var2%a) > + loc2_b = loc (var2%b) > + loc2_c = loc (var2%c) > + loc2_d = loc (var2%d) > + ! var/var2 are mapped, but the pointer components aren't > + !$omp target map(to: var) map(tofrom: var2) > + if (loc_a /= loc (var%a)) stop 31 > + if (loc_b /= loc (var%b)) stop 32 > + if (loc_c /= loc (var%d)) stop 33 > + if (loc_d /= loc (var%d)) stop 34 > + if (loc2_a /= loc (var2%a)) stop 35 > + if (loc2_b /= loc (var2%b)) stop 36 > + if (loc2_c /= loc (var2%c)) stop 37 > + if (loc2_d /= loc (var2%d)) stop 38 > + !$omp end target > + if (loc_a /= loc (var%a)) stop 41 > + if (loc_b /= loc (var%b)) stop 42 > + if (loc_c /= loc (var%d)) stop 43 > + if (loc_d /= loc (var%d)) stop 44 > + if (loc2_a /= loc (var2%a)) stop 45 > + if (loc2_b /= loc (var2%b)) stop 46 > + if (loc2_c /= loc (var2%c)) stop 47 > + if (loc2_d /= loc (var2%d)) stop 48 > +end block > + > +block > + ! Map only (all) components, but this maps also the alloc comps > + !$omp target map(to: var%a, var%b, var%c, var%d) map(tofrom: var2%a, > var2%b, var2%c, var2%d) > + call foo (var,var2) > + !$omp end target > +end block > + > +if (var2%A /= 45) stop 9 > +if (any (var2%B /= [1,2,3])) stop 10 > +if (var2%C%x /= 6) stop 11 > +if (var2%C%y /= 5) stop 11 > +if (var2%C%z /= 4) stop 11 > +block > + integer :: tmp_x(2,2), tmp_y(2,2), tmp_z(2,2), i, j > + tmp_x = reshape([1, 4, 11, 14], [2,2]) > + tmp_y = reshape([2, 5, 12, 15], [2,2]) > + tmp_z = reshape([3, 6, 13, 16], [2,2]) > + do j = 1, 2 > + do i = 1, 2 > + if (var2%D(i,j)%x /= tmp_x(i,j)) stop 12 > + if (var2%D(i,j)%y /= tmp_y(i,j)) stop 12 > + if (var2%D(i,j)%z /= tmp_z(i,j)) stop 12 > + end do > + end do > +end block > + > +! Extra deallocates due to PR fortran/104697 > +deallocate(var%C%x, var%C%y, var%C%z) > +deallocate(var%D(1,1)%x, var%D(1,1)%y, var%D(1,1)%z) > +deallocate(var%D(2,1)%x, var%D(2,1)%y, var%D(2,1)%z) > +deallocate(var%D(1,2)%x, var%D(1,2)%y, var%D(1,2)%z) > +deallocate(var%D(2,2)%x, var%D(2,2)%y, var%D(2,2)%z) > +deallocate(var%A, var%B, var%C, var%D) > + > +deallocate(var2%C%x, var2%C%y, var2%C%z) > +deallocate(var2%D(1,1)%x, var2%D(1,1)%y, var2%D(1,1)%z) > +deallocate(var2%D(2,1)%x, var2%D(2,1)%y, var2%D(2,1)%z) > +deallocate(var2%D(1,2)%x, var2%D(1,2)%y, var2%D(1,2)%z) > +deallocate(var2%D(2,2)%x, var2%D(2,2)%y, var2%D(2,2)%z) > +deallocate(var2%A, var2%B, var2%C, var2%D) > + > +! -------------------------------------- > +! Assign + allocate > +allocate (var3%Q%A, source=45) > +allocate (var3%Q%B, source=[1,2,3]) > +allocate (var3%Q%C, source=t2(6,5,4)) > +allocate (var3%Q%D(2,2)) > +var3%Q%D(1,1) = t2(1,2,3) > +var3%Q%D(2,1) = t2(4,5,6) > +var3%Q%D(1,2) = t2(11,12,13) > +var3%Q%D(2,2) = t2(14,15,16) > + > +allocate (var3%R(2)%A, source=45) > +allocate (var3%R(2)%B, source=[1,2,3]) > +allocate (var3%R(2)%C, source=t2(6,5,4)) > +allocate (var3%R(2)%D(2,2)) > +var3%R(2)%D(1,1) = t2(1,2,3) > +var3%R(2)%D(2,1) = t2(4,5,6) > +var3%R(2)%D(1,2) = t2(11,12,13) > +var3%R(2)%D(2,2) = t2(14,15,16) > + > +! Assign + allocate > +allocate (var4%Q%A, source=145) > +allocate (var4%Q%B, source=[991,992,993]) > +allocate (var4%Q%C, source=t2(996,995,994)) > +allocate (var4%Q%D(2,2)) > +var4%Q%D(1,1) = t2(199,299,399) > +var4%Q%D(2,1) = t2(499,599,699) > +var4%Q%D(1,2) = t2(1199,1299,1399) > +var4%Q%D(2,2) = t2(1499,1599,1699) > + > +allocate (var4%R(3)%A, source=145) > +allocate (var4%R(3)%B, source=[991,992,993]) > +allocate (var4%R(3)%C, source=t2(996,995,994)) > +allocate (var4%R(3)%D(2,2)) > +var4%R(3)%D(1,1) = t2(199,299,399) > +var4%R(3)%D(2,1) = t2(499,599,699) > +var4%R(3)%D(1,2) = t2(1199,1299,1399) > +var4%R(3)%D(2,2) = t2(1499,1599,1699) > + > +!$omp target map(to: var3%Q%A, var3%Q%B, var3%Q%C, var3%Q%D) & > +!$omp& map(tofrom: var4%Q%A, var4%Q%B, var4%Q%C, var4%Q%D) > + call foo(var3%Q, var4%Q) > +!$omp end target > + > +iptr = loc(var3%R(2)%A) > + > +!$omp target map(to: var3%R(2)%A, var3%R(2)%B, var3%R(2)%C, var3%R(2)%D) & > +!$omp& map(tofrom: var4%R(3)%A, var4%R(3)%B, var4%R(3)%C, var4%R(3)%D) > + call foo(var3%R(2), var4%R(3)) > +!$omp end target > + > +if (var4%Q%A /= 45) stop 13 > +if (any (var4%Q%B /= [1,2,3])) stop 14 > +if (var4%Q%C%x /= 6) stop 15 > +if (var4%Q%C%y /= 5) stop 15 > +if (var4%Q%C%z /= 4) stop 15 > +block > + integer :: tmp_x(2,2), tmp_y(2,2), tmp_z(2,2), i, j > + tmp_x = reshape([1, 4, 11, 14], [2,2]) > + tmp_y = reshape([2, 5, 12, 15], [2,2]) > + tmp_z = reshape([3, 6, 13, 16], [2,2]) > + do j = 1, 2 > + do i = 1, 2 > + if (var4%Q%D(i,j)%x /= tmp_x(i,j)) stop 16 > + if (var4%Q%D(i,j)%y /= tmp_y(i,j)) stop 16 > + if (var4%Q%D(i,j)%z /= tmp_z(i,j)) stop 16 > + end do > + end do > +end block > + > +! Cf. PR fortran/s104696 > +! { dg-output "valid mapping, OK" { xfail { offload_device_nonshared_as } } }
For both GCN and nvptx offloading with 'offload_device_nonshared_as', I see: +PASS: libgomp.fortran/map-alloc-comp-6.f90 -O (test for excess errors) +PASS: libgomp.fortran/map-alloc-comp-6.f90 -O execution test +XPASS: libgomp.fortran/map-alloc-comp-6.f90 -O output pattern test spawn [open ...] valid mapping, OK Grüße Thomas > +if (iptr /= loc(var3%R(2)%A)) then > + print *, "invalid mapping, cf. PR fortran/104696" > +else > + > +if (var4%R(3)%A /= 45) stop 17 > +if (any (var4%R(3)%B /= [1,2,3])) stop 18 > +if (var4%R(3)%C%x /= 6) stop 19 > +if (var4%R(3)%C%y /= 5) stop 19 > +if (var4%R(3)%C%z /= 4) stop 19 > +block > + integer :: tmp_x(2,2), tmp_y(2,2), tmp_z(2,2), i, j > + tmp_x = reshape([1, 4, 11, 14], [2,2]) > + tmp_y = reshape([2, 5, 12, 15], [2,2]) > + tmp_z = reshape([3, 6, 13, 16], [2,2]) > + do j = 1, 2 > + do i = 1, 2 > + if (var4%R(3)%D(i,j)%x /= tmp_x(i,j)) stop 20 > + if (var4%R(3)%D(i,j)%y /= tmp_y(i,j)) stop 20 > + if (var4%R(3)%D(i,j)%z /= tmp_z(i,j)) stop 20 > + end do > + end do > +end block > + > +! Extra deallocates due to PR fortran/104697 > +deallocate(var3%Q%C%x, var3%Q%D(1,1)%x, var3%Q%D(2,1)%x, var3%Q%D(1,2)%x, > var3%Q%D(2,2)%x) > +deallocate(var3%Q%C%y, var3%Q%D(1,1)%y, var3%Q%D(2,1)%y, var3%Q%D(1,2)%y, > var3%Q%D(2,2)%y) > +deallocate(var3%Q%C%z, var3%Q%D(1,1)%z, var3%Q%D(2,1)%z, var3%Q%D(1,2)%z, > var3%Q%D(2,2)%z) > +deallocate(var3%Q%A, var3%Q%B, var3%Q%C, var3%Q%D) > + > +deallocate(var4%Q%C%x, var4%Q%D(1,1)%x, var4%Q%D(2,1)%x, var4%Q%D(1,2)%x, > var4%Q%D(2,2)%x) > +deallocate(var4%Q%C%y, var4%Q%D(1,1)%y, var4%Q%D(2,1)%y, var4%Q%D(1,2)%y, > var4%Q%D(2,2)%y) > +deallocate(var4%Q%C%z, var4%Q%D(1,1)%z, var4%Q%D(2,1)%z, var4%Q%D(1,2)%z, > var4%Q%D(2,2)%z) > +deallocate(var4%Q%A, var4%Q%B, var4%Q%C, var4%Q%D) > + > +deallocate(var3%R(2)%C%x, var3%R(2)%D(1,1)%x, var3%R(2)%D(2,1)%x, > var3%R(2)%D(1,2)%x, var3%R(2)%D(2,2)%x) > +deallocate(var3%R(2)%C%y, var3%R(2)%D(1,1)%y, var3%R(2)%D(2,1)%y, > var3%R(2)%D(1,2)%y, var3%R(2)%D(2,2)%y) > +deallocate(var3%R(2)%C%z, var3%R(2)%D(1,1)%z, var3%R(2)%D(2,1)%z, > var3%R(2)%D(1,2)%z, var3%R(2)%D(2,2)%z) > +deallocate(var3%R(2)%A, var3%R(2)%B, var3%R(2)%C, var3%R(2)%D) > + > +deallocate(var4%R(3)%C%x, var4%R(3)%D(1,1)%x, var4%R(3)%D(2,1)%x, > var4%R(3)%D(1,2)%x, var4%R(3)%D(2,2)%x) > +deallocate(var4%R(3)%C%y, var4%R(3)%D(1,1)%y, var4%R(3)%D(2,1)%y, > var4%R(3)%D(1,2)%y, var4%R(3)%D(2,2)%y) > +deallocate(var4%R(3)%C%z, var4%R(3)%D(1,1)%z, var4%R(3)%D(2,1)%z, > var4%R(3)%D(1,2)%z, var4%R(3)%D(2,2)%z) > +deallocate(var4%R(3)%A, var4%R(3)%B, var4%R(3)%C, var4%R(3)%D) > + > + print *, "valid mapping, OK" > +endif > + > +contains > + subroutine foo(x, y) > + type(t) :: x, y > + intent(in) :: x > + intent(inout) :: y > + integer :: tmp_x(2,2), tmp_y(2,2), tmp_z(2,2), i, j > + if (x%A /= 45) stop 1 > + if (any (x%B /= [1,2,3])) stop 2 > + if (x%C%x /= 6) stop 3 > + if (x%C%y /= 5) stop 3 > + if (x%C%z /= 4) stop 3 > + > + tmp_x = reshape([1, 4, 11, 14], [2,2]) > + tmp_y = reshape([2, 5, 12, 15], [2,2]) > + tmp_z = reshape([3, 6, 13, 16], [2,2]) > + do j = 1, 2 > + do i = 1, 2 > + if (x%D(i,j)%x /= tmp_x(i,j)) stop 4 > + if (x%D(i,j)%y /= tmp_y(i,j)) stop 4 > + if (x%D(i,j)%z /= tmp_z(i,j)) stop 4 > + end do > + end do > + > + if (y%A /= 145) stop 5 > + if (any (y%B /= [991,992,993])) stop 6 > + if (y%C%x /= 996) stop 7 > + if (y%C%y /= 995) stop 7 > + if (y%C%z /= 994) stop 7 > + tmp_x = reshape([199, 499, 1199, 1499], [2,2]) > + tmp_y = reshape([299, 599, 1299, 1599], [2,2]) > + tmp_z = reshape([399, 699, 1399, 1699], [2,2]) > + do j = 1, 2 > + do i = 1, 2 > + if (y%D(i,j)%x /= tmp_x(i,j)) stop 8 > + if (y%D(i,j)%y /= tmp_y(i,j)) stop 8 > + if (y%D(i,j)%z /= tmp_z(i,j)) stop 8 > + end do > + end do > + > + y%A = x%A > + y%B(:) = x%B > + y%C%x = x%C%x > + y%C%y = x%C%y > + y%C%z = x%C%z > + do j = 1, 2 > + do i = 1, 2 > + y%D(i,j)%x = x%D(i,j)%x > + y%D(i,j)%y = x%D(i,j)%y > + y%D(i,j)%z = x%D(i,j)%z > + end do > + end do > + end > +end