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

            Bug ID: 70545
           Summary: [openacc] gfortran.dg/goacc/kernels-loop-n.f95 not
                    parallelized
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

Consider this testcase (gfortran.dg/goacc/kernels-loop-n.f95):
...
module test
contains
  subroutine foo(n)
    implicit none
    integer :: n
    integer, dimension (0:n-1) :: a, b, c
    integer                    :: i, ii
    do i = 0, n - 1
       a(i) = i * 2
    end do

    do i = 0, n -1
       b(i) = i * 4
    end do

    !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))                
    do ii = 0, n - 1
       c(ii) = a(ii) + b(ii)
    end do
    !$acc end kernels                                                           

    do i = 0, n - 1
       if (c(i) .ne. a(i) + b(i)) call abort
    end do

  end subroutine foo
end module test
...

Note that the n parameter of foo translates to a restrict reference:
...
foo (integer(kind=4) & restrict n)
...

Parallelization fails because these statement cannot be disambiguated:
...
Stmt *_9 = 0;
conflicts with entry/exit stmt: _7 = *_6;
entry/exit not ok: FAILED
...

Looking at the first basic block, we can see the stmts:
...
  <bb 2>:
  # VUSE <.MEM_3(D)>
  _5 = *.omp_data_i_4(D).n;
  # VUSE <.MEM_3(D)>
  _6 = *_5;
  # VUSE <.MEM_3(D)>
  _7 = *_6;
  _8 = _7 + -1;
  # VUSE <.MEM_3(D)>
  _9 = *.omp_data_i_4(D).ii;
  # .MEM_10 = VDEF <.MEM_3(D)>
  *_9 = 0;
  if (_8 >= 0)
    goto <bb 4>;
  else
    goto <bb 3>;
...

The '*_9 = 0' is a store to the iteration counter ii, and '_7 = *_6' is a load
of 'n'.

AFAIU, They are not disambiguated because fipa-pta ignores restrict (see
PR68787 - fipa-pta to interpret restrict).

The store has the expected points-to information in pta:
...
_9 = { D.3639 }
...

But the load does not translate back to the load from restrict reference:
...
_7 = { ESCAPED NONLOCAL }
...

Reply via email to