293 lines
9.4 KiB
Fortran
293 lines
9.4 KiB
Fortran
|
! { 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" } }
|