blob: 54f4b2e9ddc49e14298f9a6327872355e06ce778 [file] [log] [blame]
! { dg-do run }
! { dg-additional-options "-fdump-tree-gimple" }
!
! PR fortran/92568
!
program main
implicit none
integer :: xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2
allocatable :: xa1, xa2, xat1, xat2
pointer :: xp1, xp2
allocate (xa1, xa2, xat1, xat2, xp1, xp2)
call foo (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
call foo2 (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
call foo3 (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
call bar (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
deallocate (xa1, xa2, xat1, xat2, xp1, xp2)
contains
! Implicit mapping
subroutine foo (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
implicit none
integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
pointer :: ip1, ip2, ip3
target :: iat1, iat2, iat3, it1, it2, it3
optional :: ia1, ip1, iat1, it1, ii1
allocate(ia3, iat3, ip3)
ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
ii1 = 2; ii2 = 2; ii3 = 2
! Implicitly, scalars are 'firstprivate' except
! if target, allocatable, pointer they are always tofrom.
!$omp target
if (ia1 /= 2) stop 1
if (ia2 /= 2) stop 2
if (ia3 /= 2) stop 3
if (ip1 /= 2) stop 4
if (ip2 /= 2) stop 5
if (ip3 /= 2) stop 6
if (iat1 /= 2) stop 7
if (iat2 /= 2) stop 8
if (iat3 /= 2) stop 9
if (it1 /= 2) stop 10
if (it2 /= 2) stop 11
if (it3 /= 2) stop 12
if (ii1 /= 2) stop 13
if (ii2 /= 2) stop 14
if (ii3 /= 2) stop 15
ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
ii1 = 1; ii2 = 1; ii3 = 1
!$omp end target
! (target,allocatable,pointer) -> tofrom
if (ia1 /= 1) stop 16
if (ia2 /= 1) stop 17
if (ia3 /= 1) stop 18
if (ip1 /= 1) stop 19
if (ip2 /= 1) stop 20
if (ip3 /= 1) stop 21
if (iat1 /= 1) stop 22
if (iat2 /= 1) stop 23
if (iat3 /= 1) stop 24
if (it1 /= 1) stop 25
if (it2 /= 1) stop 26
if (it3 /= 1) stop 27
! non-(target,allocatable,pointer) -> firstprivate
!if (ii1 /= 2) stop 28 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
if (ii2 /= 2) stop 29
if (ii3 /= 2) stop 30
deallocate(ia3, iat3, ip3)
end
! Implicit mapping likewise even though there is defaultmap
subroutine foo2 (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
implicit none
integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
pointer :: ip1, ip2, ip3
target :: iat1, iat2, iat3, it1, it2, it3
optional :: ia1, ip1, iat1, it1, ii1
allocate(ia3, iat3, ip3)
ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
ii1 = 2; ii2 = 2; ii3 = 2
! Implicitly, scalars are 'firstprivate' except
! if target, allocatable, pointer they are always tofrom.
!$omp target defaultmap(default)
if (ia1 /= 2) stop 31
if (ia2 /= 2) stop 32
if (ia3 /= 2) stop 33
if (ip1 /= 2) stop 34
if (ip2 /= 2) stop 35
if (ip3 /= 2) stop 36
if (iat1 /= 2) stop 37
if (iat2 /= 2) stop 38
if (iat3 /= 2) stop 39
if (it1 /= 2) stop 40
if (it2 /= 2) stop 41
if (it3 /= 2) stop 42
if (ii1 /= 2) stop 43
if (ii2 /= 2) stop 44
if (ii3 /= 2) stop 45
ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
ii1 = 1; ii2 = 1; ii3 = 1
!$omp end target
! (target,allocatable,pointer) -> tofrom
if (ia1 /= 1) stop 46
if (ia2 /= 1) stop 47
if (ia3 /= 1) stop 48
if (ip1 /= 1) stop 49
if (ip2 /= 1) stop 50
if (ip3 /= 1) stop 51
if (iat1 /= 1) stop 52
if (iat2 /= 1) stop 53
if (iat3 /= 1) stop 54
if (it1 /= 1) stop 55
if (it2 /= 1) stop 56
if (it3 /= 1) stop 57
! non-(target,allocatable,pointer) -> firstprivate
!if (ii1 /= 2) stop 58 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
if (ii2 /= 2) stop 59
if (ii3 /= 2) stop 60
deallocate(ia3, iat3, ip3)
end
! Implicit mapping likewise even though there is defaultmap
subroutine foo3 (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
implicit none
integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
pointer :: ip1, ip2, ip3
target :: iat1, iat2, iat3, it1, it2, it3
optional :: ia1, ip1, iat1, it1, ii1
allocate(ia3, iat3, ip3)
ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
ii1 = 2; ii2 = 2; ii3 = 2
! Implicitly, scalars are 'firstprivate' except
! if target, allocatable, pointer they are always tofrom.
!$omp target defaultmap(none:aggregate)
if (ia1 /= 2) stop 61
if (ia2 /= 2) stop 62
if (ia3 /= 2) stop 63
if (ip1 /= 2) stop 64
if (ip2 /= 2) stop 65
if (ip3 /= 2) stop 66
if (iat1 /= 2) stop 67
if (iat2 /= 2) stop 68
if (iat3 /= 2) stop 69
if (it1 /= 2) stop 70
if (it2 /= 2) stop 71
if (it3 /= 2) stop 72
if (ii1 /= 2) stop 73
if (ii2 /= 2) stop 74
if (ii3 /= 2) stop 75
ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
ii1 = 1; ii2 = 1; ii3 = 1
!$omp end target
! (target,allocatable,pointer) -> tofrom
if (ia1 /= 1) stop 76
if (ia2 /= 1) stop 77
if (ia3 /= 1) stop 78
if (ip1 /= 1) stop 79
if (ip2 /= 1) stop 80
if (ip3 /= 1) stop 81
if (iat1 /= 1) stop 82
if (iat2 /= 1) stop 83
if (iat3 /= 1) stop 84
if (it1 /= 1) stop 85
if (it2 /= 1) stop 86
if (it3 /= 1) stop 87
! non-(target,allocatable,pointer) -> firstprivate
!if (ii1 /= 2) stop 88 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
if (ii2 /= 2) stop 89
if (ii3 /= 2) stop 90
deallocate(ia3, iat3, ip3)
end
subroutine bar (ea1, ea2, ep1, ep2, eat1, eat2, et1, et2, ei1, ei2)
implicit none
integer :: ea1, ea2, ea3, ep1, ep2, ep3, eat1, eat2, eat3, et1, et2, et3, ei1, ei2, ei3
allocatable :: ea1, ea2, ea3, eat1, eat2, eat3
pointer :: ep1, ep2, ep3
target :: eat1, eat2, eat3, et1, et2, et3
optional :: ea1, ep1, eat1, et1, ei1
logical :: shared_memory
allocate(ea3, eat3, ep3)
ea1 = 2; ea2 = 2; ea3 = 2; ep1 = 2; ep2 = 2; ep3 = 2;
eat1 = 2; eat2 = 2; eat3 = 2; et1 = 2; et2 = 2; et3 = 2
ei1 = 2; ei2 = 2; ei3 = 2
shared_memory = .false.
!$omp target map(to: shared_memory)
shared_memory = .true.
!$omp end target
! While here 'scalar' implies nonallocatable/nonpointer and
! the target attribute plays no role.
!$omp target defaultmap(tofrom:scalar) defaultmap(firstprivate:allocatable) &
!$omp& defaultmap(none:aggregate) defaultmap(firstprivate:pointer) &
!$omp& map(always, to: shared_memory)
if (shared_memory) then
! Due to fortran/90742 this fails when doing non-shared memory offloading
if (ea1 /= 2) stop 91
if (ea2 /= 2) stop 92
if (ea3 /= 2) stop 93
if (ep1 /= 2) stop 94
if (ep2 /= 2) stop 95
if (ep3 /= 2) stop 96
if (eat1 /= 2) stop 97
if (eat2 /= 2) stop 98
if (eat3 /= 2) stop 99
end if
if (et1 /= 2) stop 100
if (et2 /= 2) stop 101
if (et3 /= 2) stop 102
if (ei1 /= 2) stop 103
if (ei2 /= 2) stop 104
if (ei3 /= 2) stop 105
ep1 => null(); ep2 => null(); ep3 => null()
if (shared_memory) then
! Due to fortran/90742 this fails when doing non-shared memory offloading
ea1 = 1; ea2 = 1; ea3 = 1
eat1 = 1; eat2 = 1; eat3 = 1
end if
et1 = 1; et2 = 1; et3 = 1
ei1 = 1; ei2 = 1; ei3 = 1
!$omp end target
! (allocatable,pointer) -> firstprivate
! FIXME: allocatables not properly privatized, cf. PR fortran/90742
! if (ea1 /= 2) stop 106
! if (ea2 /= 2) stop 107
! if (ea3 /= 2) stop 108
! if (eat1 /= 2) stop 112
! if (eat2 /= 2) stop 113
! if (eat3 /= 2) stop 114
if (ep1 /= 2) stop 109
if (ep2 /= 2) stop 110
if (ep3 /= 2) stop 111
! (scalar) -> tofrom
!if (et1 /= 1) stop 115 ! FIXME: optional scalar wrongly mapped as 'firstprivate', PR fortran/100991
if (et2 /= 1) stop 116
if (et3 /= 1) stop 117
!if (ei1 /= 1) stop 118 ! FIXME: optional scalar wrongly mapped as 'firstprivate', PR fortran/100991
if (ei2 /= 1) stop 119
if (ei3 /= 1) stop 120
deallocate(ea3, eat3, ep3)
end
end
! FIXME/xfail: Optional scalars wrongly classified, PR fortran/100991
! { dg-final { scan-tree-dump-times "firstprivate\\(ii1\\)" 3 "gimple" { xfail *-*-* } } }
! { dg-final { scan-tree-dump-not "firstprivate\\(et1\\)" "gimple" { xfail *-*-* } } }
! { dg-final { scan-tree-dump-not "firstprivate\\(ei1\\)" "gimple" { xfail *-*-* } } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ea1\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ea2\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ea3\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(eat1\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(eat2\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(eat3\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ep1\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ep2\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "firstprivate\\(ep3\\)" 1 "gimple" } }