blob: 1948e782653a8ea2b4526e29c93dad80e2b456dc [file] [log] [blame]
! { dg-additional-options "-fdump-tree-original" }
!
! PR fortran/108512
! The problem was that the context wasn't reset for the 'LOOP'
! such that the clauses of the loops weren't seen when adding
! PRIVATE clauses.
!
! In the following, only the loop variable of the non-OpenMP loop
! in 'subroutine four' should get a front-end addded PRIVATE clause
implicit none
integer :: x, a(10), b(10), n
n = 10
a = -42
b = [(2*x, x=1,10)]
! { dg-final { scan-tree-dump-times "#pragma omp target map\\(tofrom:a\\) map\\(tofrom:b\\) map\\(tofrom:x\\)\[\r\n\]" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel\[\r\n\]" 2 "original" } }
! ^- shows up twice; checked only here.
! { dg-final { scan-tree-dump-times "#pragma omp loop lastprivate\\(x\\)\[\r\n\]" 1 "original" } }
!$omp target parallel map(tofrom: a, b, x)
!$omp loop lastprivate(x)
DO x = 1, n
a(x) = a(x) + b(x)
END DO
!$omp end loop
!$omp end target parallel
if (x /= 11) error stop
if (any (a /= [(2*x - 42, x=1,10)])) error stop
call two()
call three()
call four()
end
subroutine two
implicit none
integer :: ii, mm, arr(10)
mm = 10
arr = 0
! { dg-final { scan-tree-dump-times "#pragma omp target map\\(tofrom:arr\\) map\\(tofrom:ii\\)\[\r\n\]" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel shared\\(ii\\)\[\r\n\]" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp loop lastprivate\\(ii\\)\[\r\n\]" 1 "original" } }
!$omp target parallel loop map(tofrom: arr) lastprivate(ii)
DO ii = 1, mm
arr(ii) = arr(ii) + ii
END DO
end
subroutine three
implicit none
integer :: kk, zz, var(10)
zz = 10
var = 0
! { dg-final { scan-tree-dump-times "#pragma omp target map\\(tofrom:var\\)\[\r\n\]" 1 "original" } }
! "#pragma omp parallel\[\r\n\]" - shows up twice, dump checked above
! { dg-final { scan-tree-dump-times "#pragma omp loop\[\r\n\]" 1 "original" } }
!$omp target parallel loop map(tofrom: var)
DO kk = 1, zz
var(kk) = var(kk) + kk
END DO
end
subroutine four
implicit none
integer :: jj, qq, dist(10)
qq = 10
dist = 0
! { dg-final { scan-tree-dump-times "#pragma omp target map\\(tofrom:dist\\)\[\r\n\]" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(jj\\)\[\r\n\]" 1 "original" } }
!$omp target parallel map(tofrom: dist)
! *no* '!$omp do/loop/simd'
DO jj = 1, qq
dist(qq) = dist(qq) + qq
END DO
!$omp end target parallel
end