[flang] [OpenMP] Predetermined rules for loop index variables (flang-compiler/f18...
authorJinxin (Brian) Yang <jinxiny@nvidia.com>
Wed, 5 Feb 2020 18:13:43 +0000 (10:13 -0800)
committerGitHub <noreply@github.com>
Wed, 5 Feb 2020 18:13:43 +0000 (10:13 -0800)
commitf90404e59c785f9ed6b456e9ff33f4fa90c9a88f
tree114789618315ccf8de60083306eefc0fd87b8fee
parentbff1d7c39e995d5e0b6745ab8d20386c3768b93b
[flang] [OpenMP] Predetermined rules for loop index variables (flang-compiler/f18#962)

This refers to three rules in OpenMP 4.5 Spec 2.15.1.1:
  * The loop iteration variable(s) in the associated do-loop(s) of a do,
    parallel do, taskloop, or distribute construct is (are) private.
  * The loop iteration variable in the associated do-loop of a simd
    construct with just one associated do-loop is linear with a linear-step
    that is the increment of the associated do-loop.
  * The loop iteration variables in the associated do-loops of a simd
    construct with multiple associated do-loops are lastprivate.

A simple example:
```
implicit none
  integer :: N = 1024
  integer i, j, k
  !$omp parallel do collapse(3)
  do i=1, N  <- i is private
     do j=1, N  <- j is private
        do k=1, N  <- k is private
        enddo
     enddo
  enddo
end
```

If `collapse` clause is not present, the associated do-loop for construct
`parallel do` is only `i` loop. With `collapse(n)`, `i`, `j`, and `k` are
all associated do-loops and the loop index variables are private to the
OpenMP construct:

```
implicit none
 !DEF: /MainProgram1/n ObjectEntity INTEGER(4)
 integer :: n = 1024
 !DEF: /MainProgram1/i ObjectEntity INTEGER(4)
 !DEF: /MainProgram1/j ObjectEntity INTEGER(4)
 !DEF: /MainProgram1/k ObjectEntity INTEGER(4)
 integer i, j, k
!$omp parallel do  collapse(3)
 !DEF: /MainProgram1/Block1/i (OmpPrivate) HostAssoc INTEGER(4)
 !REF: /MainProgram1/n
 do i=1,n
  !DEF: /MainProgram1/Block1/j (OmpPrivate) HostAssoc INTEGER(4)
  !REF: /MainProgram1/n
  do j=1,n
   !DEF: /MainProgram1/Block1/k (OmpPrivate) HostAssoc INTEGER(4)
   !REF: /MainProgram1/n
   do k=1,n
   end do
  end do
 end do
end program
```

This implementation assumes that the structural checks for do-loops
are done at this point, for example the `n` in `collapse(n)` should
be no more than the number of actual perfectly nested do-loops, etc..

Original-commit: flang-compiler/f18@572a57d3d0d785bb3f2aad9e890ef498c1214309
Reviewed-on: https://github.com/flang-compiler/f18/pull/962
flang/lib/semantics/check-omp-structure.cpp
flang/lib/semantics/check-omp-structure.h
flang/lib/semantics/resolve-names.cpp
flang/test/semantics/CMakeLists.txt
flang/test/semantics/omp-clause-validity01.f90
flang/test/semantics/omp-device-constructs.f90
flang/test/semantics/omp-symbol01.f90
flang/test/semantics/omp-symbol04.f90
flang/test/semantics/omp-symbol06.f90
flang/test/semantics/omp-symbol08.f90 [new file with mode: 0644]