From: Tobias Burnus Date: Wed, 9 Sep 2020 09:54:43 +0000 (+0200) Subject: Fortran: Fixes for OpenMP loop-iter privatization (PRs 95109 + 94690) X-Git-Tag: releases/gcc-10.3.0~943 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f93eba8c5fde83100bf0854607848b6f50c8bbb2;p=thirdparty%2Fgcc.git Fortran: Fixes for OpenMP loop-iter privatization (PRs 95109 + 94690) This commit also fixes a gfortran.dg/gomp/target1.f90 regression; target1.f90 tests the resolve.c and openmp.c changes. gcc/fortran/ChangeLog: PR fortran/95109 PR fortran/94690 * resolve.c (gfc_resolve_code): Also call gfc_resolve_omp_parallel_blocks for 'distribute parallel do (simd)'. * openmp.c (gfc_resolve_omp_parallel_blocks): Handle it. * trans-openmp.c (gfc_trans_omp_target): For TARGET_PARALLEL_DO_SIMD, call simd not do processing function. gcc/testsuite/ChangeLog: PR fortran/95109 PR fortran/94690 * gfortran.dg/gomp/openmp-simd-5.f90: New test. (cherry picked from commit 61c2d476a52bb108bd05d0226c5522bf0c4b24b5) --- diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 930bca541b98..4f472dbc9365 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5597,6 +5597,8 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns) switch (code->op) { + case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: + case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: case EXEC_OMP_PARALLEL_DO: case EXEC_OMP_PARALLEL_DO_SIMD: case EXEC_OMP_TARGET_PARALLEL_DO: diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 533738b0b38b..c650096df6d6 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -11690,6 +11690,8 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns) omp_workshare_flag = 1; gfc_resolve_omp_parallel_blocks (code, ns); break; + case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: + case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: case EXEC_OMP_PARALLEL: case EXEC_OMP_PARALLEL_DO: case EXEC_OMP_PARALLEL_DO_SIMD: diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index d99672742df6..c01c4d792195 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -5341,13 +5341,19 @@ gfc_trans_omp_target (gfc_code *code) } break; case EXEC_OMP_TARGET_PARALLEL_DO: - case EXEC_OMP_TARGET_PARALLEL_DO_SIMD: stmt = gfc_trans_omp_parallel_do (code, &block, clausesa); if (TREE_CODE (stmt) != BIND_EXPR) stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); else poplevel (0, 0); break; + case EXEC_OMP_TARGET_PARALLEL_DO_SIMD: + stmt = gfc_trans_omp_parallel_do_simd (code, &block, clausesa); + if (TREE_CODE (stmt) != BIND_EXPR) + stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); + else + poplevel (0, 0); + break; case EXEC_OMP_TARGET_SIMD: stmt = gfc_trans_omp_do (code, EXEC_OMP_SIMD, &block, &clausesa[GFC_OMP_SPLIT_SIMD], NULL_TREE); diff --git a/gcc/testsuite/gfortran.dg/gomp/openmp-simd-5.f90 b/gcc/testsuite/gfortran.dg/gomp/openmp-simd-5.f90 new file mode 100644 index 000000000000..b6d4cfa70800 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/openmp-simd-5.f90 @@ -0,0 +1,24 @@ +! { dg-additional-options "-fdump-tree-original" } +! +! Related: +! PR fortran/95109 +! PR fortran/94690 +! +implicit none +integer :: i, j, k, ll +integer :: a +!$omp target parallel do simd collapse(1) + do i = 1, 5 + do j = 1, 5 + do k = 1, 5 + a = a + 1 + end do + do ll = 1, 5 + a = a + 1 + end do + end do + end do +!$omp end target parallel do simd +end + +! { dg-final { scan-tree-dump-times "omp simd linear\\(i:1\\) private\\(j\\) private\\(ll\\) private\\(k\\) collapse\\(1\\)" 1 "original" } }