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

            Bug ID: 106662
           Summary: [OpenMP] 'for simd firstprivate(j) lastprivate(j)'
                    with 'parallel shared(j)' gives unexpected result
           Product: gcc
           Version: 13.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, sandra at gcc dot gnu.org
  Target Milestone: ---

[Lightly related to PR106504 - but that one uses 'parallel private' not
shared.]

The following program, converted to C++ from libgomp.fortran/pr27416-1.f90
and with 'simd' added to the workshare-loop construct,
yields:

* 22 with 'for' - i.e. the existing Fortran testcase, but C++-ified.
and independent of 'num_threads(1)'
* 22 with clang++-12
* 22 with icc 19
while
* 16 is obtained with GCC
  (as if 0 and not 6 is firstprivatized)


int
main()  
{       
  int j = 6;
  #pragma omp parallel num_threads (4) shared(j)
  {     
    int i;
    #pragma omp for simd firstprivate (j) lastprivate (j) // private(i)
    for (i = 1; i <= 16; ++i)
      if (i == 16)
        j = j + i;
  }     
  __builtin_printf("j = %i =?= %i\n", j, 6+16);
  if (j != 6+16)
    __builtin_abort();
  return 0;
}

Likewise with a combined construct:
  ...
  #pragma omp parallel for simd num_threads (4) firstprivate (j) lastprivate
(j)
    for (int i = 1; i <= 16; ++i)
  ...

And likewise with the equivalent Fortran code.

Reply via email to