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

            Bug ID: 121453
           Summary: [OpenMP] 'omp simd' with 'collapse' – variable
                    '.count' uninitialized, but used as 'if (.iter.14 ==
                    .count.15)'
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Keywords: openmp, wrong-code
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

This shows up with the SPEC ACCEL testcase '455.seismic' by failing with nvptx
offload as:
  libgomp: cuCtxSynchronize error: an illegal memory access was encountered
or in the debugger:
  CUDA Exception: Warp Out-of-range Address

THis seems to be due to what is diagnosed by '-Wall':
  warning: ‘.count.1179’ may be used uninitialized


Simplified example – compile with '-fopenmp' (and for the warning, add some
optimization level; depending on the code, -O3 or -O1 is enough).

Dump with '-fopenmp -O0':

                    unsigned int .count.34;
                                  unsigned int .count.22;
                    if (.iter.33 == .count.34) goto <D.4885>; else goto
<D.4884>;

That is: '.count.34' is used in a condition but never actually
assigned any value.

* * *

Both .iter and .count are generated in 'omp_extract_for_data'.

BTW: I tried gfortran-7 – and is shows the same issue according to the omplower
tree dump.

* * *

! Simplified example

implicit none
double precision, allocatable, dimension(:,:,:) :: vv
integer :: NX, NY, NZ 
integer :: k, j, i

NX = 5; NY = 5; NZ = 5

allocate (vv(NX,NY,NZ))

!$omp target teams distribute parallel do simd collapse(3)
! - simpler version:   !$omp target simd  collapse(3)
! - simplest version:  !$omp simd  collapse(3)
  do k=1, NZ
     do j=1, NY
        do i=1, NX
           vv(i,j,k) = 0.d0
        enddo
     enddo
  enddo
end

Reply via email to