| ! { 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 |