Based on the thread at http://gcc.gnu.org/ml/fortran/2011-07/msg00194.html OpenMP 3.1 has in "2.5.4 workshare Construct" (normative text): "An implementation of the workshare construct must insert any synchronization that is required to maintain standard Fortran semantics. For example, the effects of one statement within the structured block must appear to occur before the execution of succeeding statements, and the evaluation of the right hand side of an assignment must appear to complete prior to the effects of assigning to the left hand side." That seems to fail for: !$omp parallel workshare a(:) = a(n:1:-1) !$omp end parallel workshare which cannot be run in parallel as the element access on the RHS cannot be done in arbitrary order. Possible solution: Make use of gfortran's dependency.c machinery but only look for GFC_DEP_EQUAL and GFC_DEP_NODEP - and ignore, e.g., GFC_DEP_BACKWARD or GFC_DEP_FORWARD, which indicate that the loop order is important.
Author: jakub Date: Fri Aug 19 13:25:22 2011 New Revision: 177898 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=177898 Log: PR fortran/49792 * trans-expr.c (gfc_trans_assignment_1): Set OMPWS_SCALARIZER_WS bit in ompws_flags only if loop.temp_ss is NULL, and clear it if lhs needs reallocation. * trans-openmp.c (gfc_trans_omp_workshare): Don't return early if code is NULL, emit a barrier if workshare emitted no code at all and NOWAIT clause isn't present. * testsuite/libgomp.fortran/pr49792-1.f90: New test. * testsuite/libgomp.fortran/pr49792-2.f90: New test. Added: trunk/libgomp/testsuite/libgomp.fortran/pr49792-1.f90 trunk/libgomp/testsuite/libgomp.fortran/pr49792-2.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-expr.c trunk/gcc/fortran/trans-openmp.c trunk/libgomp/ChangeLog
Author: jakub Date: Fri Aug 19 13:26:50 2011 New Revision: 177900 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=177900 Log: PR fortran/49792 * trans-expr.c (gfc_trans_assignment_1): Set OMPWS_SCALARIZER_WS bit in ompws_flags only if loop.temp_ss is NULL, and clear it if lhs needs reallocation. * trans-openmp.c (gfc_trans_omp_workshare): Don't return early if code is NULL, emit a barrier if workshare emitted no code at all and NOWAIT clause isn't present. * testsuite/libgomp.fortran/pr49792-1.f90: New test. * testsuite/libgomp.fortran/pr49792-2.f90: New test. Added: branches/gcc-4_6-branch/libgomp/testsuite/libgomp.fortran/pr49792-1.f90 branches/gcc-4_6-branch/libgomp/testsuite/libgomp.fortran/pr49792-2.f90 Modified: branches/gcc-4_6-branch/gcc/fortran/ChangeLog branches/gcc-4_6-branch/gcc/fortran/trans-expr.c branches/gcc-4_6-branch/gcc/fortran/trans-openmp.c branches/gcc-4_6-branch/libgomp/ChangeLog
Fixed for 4.6+ so far.
> Fixed for 4.6+ so far. Any reason why this PR is not closed as FIXED?
.