aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-09-09 09:33:51 +0200
committerTobias Burnus <tobias@codesourcery.com>2020-09-09 09:33:51 +0200
commit61c2d476a52bb108bd05d0226c5522bf0c4b24b5 (patch)
tree77831ed52a09f74543818b2c7404420fb07d29e3 /gcc
parentf56f1a5a755e4f2080ff709ad7bf4088b84faefe (diff)
downloadgcc-61c2d476a52bb108bd05d0226c5522bf0c4b24b5.zip
gcc-61c2d476a52bb108bd05d0226c5522bf0c4b24b5.tar.gz
gcc-61c2d476a52bb108bd05d0226c5522bf0c4b24b5.tar.bz2
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. (gfc_resolve_do_iterator): Remove special code for SIMD, which is not needed. * 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/combined-if.f90: Update scan-tree-dump-times for 'omp simd.*if'. * gfortran.dg/gomp/openmp-simd-5.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/openmp.c27
-rw-r--r--gcc/fortran/resolve.c2
-rw-r--r--gcc/fortran/trans-openmp.c8
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/combined-if.f902
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/openmp-simd-5.f9024
5 files changed, 36 insertions, 27 deletions
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index d0e516c..1efce33 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5962,6 +5962,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:
@@ -6047,31 +6049,6 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym, bool add_clause)
if (omp_current_ctx->sharing_clauses->contains (sym))
return;
- if (omp_current_ctx->is_openmp && omp_current_ctx->code->block)
- {
- /* SIMD is handled differently and, hence, ignored here. */
- gfc_code *omp_code = omp_current_ctx->code->block;
- for ( ; omp_code->next; omp_code = omp_code->next)
- switch (omp_code->op)
- {
- case EXEC_OMP_SIMD:
- case EXEC_OMP_DO_SIMD:
- case EXEC_OMP_PARALLEL_DO_SIMD:
- case EXEC_OMP_DISTRIBUTE_SIMD:
- case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
- case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
- case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
- case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
- case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
- case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
- case EXEC_OMP_TARGET_SIMD:
- case EXEC_OMP_TASKLOOP_SIMD:
- return;
- default:
- break;
- }
- }
-
if (! omp_current_ctx->private_iterators->add (sym) && add_clause)
{
gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses;
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index ebf89a9..f4ce49f 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11722,6 +11722,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 7d3365f..0e1da04 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -5591,13 +5591,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/combined-if.f90 b/gcc/testsuite/gfortran.dg/gomp/combined-if.f90
index 0bb6c28..d9e4a26 100644
--- a/gcc/testsuite/gfortran.dg/gomp/combined-if.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/combined-if.f90
@@ -104,6 +104,6 @@ contains
end module
! { dg-final { scan-tree-dump-times "(?n)#pragma omp target.* if\\(" 9 "omplower" } }
-! { dg-final { scan-tree-dump-times "(?n)#pragma omp simd.* if\\(" 4 "omplower" { target { ! offload_nvptx } } } }
+! { dg-final { scan-tree-dump-times "(?n)#pragma omp simd.* if\\(" 5 "omplower" { target { ! offload_nvptx } } } }
! { dg-final { scan-tree-dump-times "(?n)#pragma omp simd.* if\\(" 7 "omplower" { target { offload_nvptx } } } }
! { dg-final { scan-tree-dump-times "(?n)#pragma omp parallel.* if\\(" 6 "omplower" } }
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 0000000..b6d4cfa
--- /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" } }