https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90067

            Bug ID: 90067
           Summary: Loop variables in Fortran 'do' statements within a
                    compute construct must be predetermined private
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: openacc
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
  Target Milestone: ---

Found while working on PR90048.

OpenACC 2.6 (same in 2.7), in section 2.6.1. "Variables with Predetermined Data
Attributes" states that "The loop variable in a C 'for' statement or Fortran
'do' statement that is associated with a loop directive is predetermined to be
private to each thread that will execute each iteration of the loop.  Loop
variables in Fortran 'do' statements within a compute construct are
predetermined to be private to the thread that executes the loop".

Regarding the latter, for Fortran 'do' statements that are not directly
associated with a 'loop' directive, when these 'do' statements are (somewhere)
nested inside a 'loop' construct, we implement this in the front end by adding
a 'private' clause to the containing 'loop' construct, but when these 'do'
statements are not (somewhere) nested inside a 'loop' construct, we do not add
a 'private' clause to the containing compute construct.  For example, for:

      integer :: i
      !$acc parallel
      do i = 1, 100
      end do
      !$acc end parallel

..., we do not in the front end add a 'private(i)' clause to the 'parallel'
construct.

By the rules as presented in section 2.5. "Compute Constructs", the gimplifier
will then fix this up by adding a 'firstprivate' clause, in the common case of
the 'parallel' construct (same for the 'serial' construct, but a 'copy' clause
for the 'kernels' construct!).

While it might generally be beneficial to have a pass promoting
'firstprivate(x)' with a dominating write operation on 'x' to 'private(x)',
here it would be better (and much simpler) to handle this in the front end.

Reply via email to