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

            Bug ID: 87255
           Summary: Different semantics of OpenMP combined construct and
                    nested constructs
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ben at rockshrub dot de
  Target Milestone: ---

This was reported on the OpenMP Forum as a difference between gfortran and the
Intel Fortran compiler here
http://forum.openmp.org/forum/viewtopic.php?f=3&t=2055

However, I think gfortran incorrectly compiles the OpenMP combined "parallel
do" construct, evaluating the loop bounds outside of the parallel context. An
OpenMP "do" construct directly nested inside an OpenMP "parallel" construct
seems to evaluate the loop bounds inside the parallel context as one would
expect. The OpenMP API 4.5 states in section 2.11 that the two (combined
construct and nested constructs) should have identical semantics.

GCC version, configure/build options, system type:
$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/8.2.0/libexec/gcc/x86_64-apple-darwin17.7.0/8.2.0/lto-wrapper
Target: x86_64-apple-darwin17.7.0
Configured with: ../configure --build=x86_64-apple-darwin17.7.0
--prefix=/usr/local/Cellar/gcc/8.2.0
--libdir=/usr/local/Cellar/gcc/8.2.0/lib/gcc/8
--enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-8
--with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr
--with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl
--with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC
8.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues
--disable-nls
Thread model: posix
gcc version 8.2.0 (Homebrew GCC 8.2.0) 

Command line that triggers the bug:
$ gfortran -Wall -Wextra -fopenmp num_threads_as_loop_bounds.f90
(no compiler output/error messages)

Contents of num_threads_as_loop_bounds.f90:
program test
  use omp_lib
  implicit none

  integer :: i

  print *, "Combined construct:"
  !$omp parallel do
  do i = 1, omp_get_num_threads()
    print *, i
  end do
  !$omp end parallel do

  print *, "Nested constructs:"
  !$omp parallel
  !$omp do
  do i = 1, omp_get_num_threads()
    print *, i
  end do
  !$omp end do
  !$omp end parallel
end program

Expected program output:
 Combined construct:
           1
           3
           4
           2
 Nested constructs:
           2
           3
           4
           1

Actual program output:
 Combined construct:
           1
 Nested constructs:
           2
           3
           4
           1

Reply via email to