aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2022-05-18 12:04:21 +0200
committerTobias Burnus <tobias@codesourcery.com>2022-05-18 12:04:21 +0200
commitba8563693fb4eb1317fcbd54883516c3873782f4 (patch)
tree15a3b0d62a6b9cb46f3b46cdea95740d26754f26 /gcc
parent9f068ad0f2f1d65349ac564178cddbe9aec39f3a (diff)
downloadgcc-ba8563693fb4eb1317fcbd54883516c3873782f4.zip
gcc-ba8563693fb4eb1317fcbd54883516c3873782f4.tar.gz
gcc-ba8563693fb4eb1317fcbd54883516c3873782f4.tar.bz2
OpenMP: Add Fortran support for inoutset depend-kind
Fortran additions to the C/C++ + ME/libgomp commit r13-556-g2c16eb3157f86ae561468c540caf8eb326106b5f gcc/fortran/ChangeLog: * gfortran.h (enum gfc_omp_depend_op): Add OMP_DEPEND_INOUTSET. (gfc_omp_clauses): Enlarge ENUM_BITFIELD. * dump-parse-tree.cc (show_omp_namelist, show_omp_clauses): Handle 'inoutset' depend modifier. * openmp.cc (gfc_match_omp_clauses, gfc_match_omp_depobj): Likewise. * trans-openmp.cc (gfc_trans_omp_clauses, gfc_trans_omp_depobj): Likewise. libgomp/ChangeLog: * libgomp.texi (OpenMP 5.1): Set 'inoutset' to Y. (OpenMP Context Selectors): Add missing comma. * testsuite/libgomp.fortran/depend-5.f90: Add inoutset test. * testsuite/libgomp.fortran/depend-6.f90: Likewise. * testsuite/libgomp.fortran/depend-7.f90: Likewise. * testsuite/libgomp.fortran/depend-inoutset-1.f90: New test. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/all-memory-1.f90: Add inoutset test. * gfortran.dg/gomp/all-memory-2.f90: Likewise. * gfortran.dg/gomp/depobj-1.f90: Likewise. * gfortran.dg/gomp/depobj-2.f90: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/dump-parse-tree.cc2
-rw-r--r--gcc/fortran/gfortran.h3
-rw-r--r--gcc/fortran/openmp.cc12
-rw-r--r--gcc/fortran/trans-openmp.cc4
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/all-memory-1.f903
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/all-memory-2.f903
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/depobj-1.f903
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/depobj-2.f906
8 files changed, 28 insertions, 8 deletions
diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc
index a329920..4e8986b 100644
--- a/gcc/fortran/dump-parse-tree.cc
+++ b/gcc/fortran/dump-parse-tree.cc
@@ -1379,6 +1379,7 @@ show_omp_namelist (int list_type, gfc_omp_namelist *n)
case OMP_DEPEND_IN: fputs ("in:", dumpfile); break;
case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break;
case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break;
+ case OMP_DEPEND_INOUTSET: fputs ("inoutset:", dumpfile); break;
case OMP_DEPEND_DEPOBJ: fputs ("depobj:", dumpfile); break;
case OMP_DEPEND_MUTEXINOUTSET:
fputs ("mutexinoutset:", dumpfile);
@@ -1898,6 +1899,7 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
case OMP_DEPEND_IN: deptype = "IN"; break;
case OMP_DEPEND_OUT: deptype = "OUT"; break;
case OMP_DEPEND_INOUT: deptype = "INOUT"; break;
+ case OMP_DEPEND_INOUTSET: deptype = "INOUTSET"; break;
case OMP_DEPEND_MUTEXINOUTSET: deptype = "MUTEXINOUTSET"; break;
default: gcc_unreachable ();
}
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 1bce283..5d970bc 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1271,6 +1271,7 @@ enum gfc_omp_depend_op
OMP_DEPEND_IN,
OMP_DEPEND_OUT,
OMP_DEPEND_INOUT,
+ OMP_DEPEND_INOUTSET,
OMP_DEPEND_MUTEXINOUTSET,
OMP_DEPEND_DEPOBJ,
OMP_DEPEND_SINK_FIRST,
@@ -1540,7 +1541,7 @@ typedef struct gfc_omp_clauses
ENUM_BITFIELD (gfc_omp_memorder) fail:3;
ENUM_BITFIELD (gfc_omp_cancel_kind) cancel:3;
ENUM_BITFIELD (gfc_omp_proc_bind_kind) proc_bind:3;
- ENUM_BITFIELD (gfc_omp_depend_op) depobj_update:3;
+ ENUM_BITFIELD (gfc_omp_depend_op) depobj_update:4;
ENUM_BITFIELD (gfc_omp_bind_type) bind:2;
ENUM_BITFIELD (gfc_omp_at_type) at:2;
ENUM_BITFIELD (gfc_omp_severity_type) severity:2;
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 3061e52..63fd4dd 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -1915,7 +1915,9 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
break;
m = MATCH_YES;
gfc_omp_depend_op depend_op = OMP_DEPEND_OUT;
- if (gfc_match ("inout") == MATCH_YES)
+ if (gfc_match ("inoutset") == MATCH_YES)
+ depend_op = OMP_DEPEND_INOUTSET;
+ else if (gfc_match ("inout") == MATCH_YES)
depend_op = OMP_DEPEND_INOUT;
else if (gfc_match ("in") == MATCH_YES)
depend_op = OMP_DEPEND_IN;
@@ -3805,7 +3807,9 @@ gfc_match_omp_depobj (void)
if (gfc_match ("update ( ") == MATCH_YES)
{
c = gfc_get_omp_clauses ();
- if (gfc_match ("inout )") == MATCH_YES)
+ if (gfc_match ("inoutset )") == MATCH_YES)
+ c->depobj_update = OMP_DEPEND_INOUTSET;
+ else if (gfc_match ("inout )") == MATCH_YES)
c->depobj_update = OMP_DEPEND_INOUT;
else if (gfc_match ("in )") == MATCH_YES)
c->depobj_update = OMP_DEPEND_IN;
@@ -3815,8 +3819,8 @@ gfc_match_omp_depobj (void)
c->depobj_update = OMP_DEPEND_MUTEXINOUTSET;
else
{
- gfc_error ("Expected IN, OUT, INOUT, MUTEXINOUTSET followed by "
- "%<)%> at %C");
+ gfc_error ("Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET "
+ "followed by %<)%> at %C");
goto error;
}
}
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 7633aee..e1907a4 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -2937,6 +2937,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
case OMP_DEPEND_INOUT:
OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUT;
break;
+ case OMP_DEPEND_INOUTSET:
+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUTSET;
+ break;
case OMP_DEPEND_MUTEXINOUTSET:
OMP_CLAUSE_DEPEND_KIND (node)
= OMP_CLAUSE_DEPEND_MUTEXINOUTSET;
@@ -5593,6 +5596,7 @@ gfc_trans_omp_depobj (gfc_code *code)
case OMP_DEPEND_IN: k = GOMP_DEPEND_IN; break;
case OMP_DEPEND_OUT: k = GOMP_DEPEND_OUT; break;
case OMP_DEPEND_INOUT: k = GOMP_DEPEND_INOUT; break;
+ case OMP_DEPEND_INOUTSET: k = GOMP_DEPEND_INOUTSET; break;
case OMP_DEPEND_MUTEXINOUTSET: k = GOMP_DEPEND_MUTEXINOUTSET; break;
default: gcc_unreachable ();
}
diff --git a/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 b/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90
index 6d56473..f8f34f0 100644
--- a/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90
@@ -44,6 +44,9 @@ subroutine f6
!$omp target depend(mutexinoutset : omp_all_memory ) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" }
! !$omp end target
+ !$omp target depend(inoutset : omp_all_memory ) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" }
+ ! !$omp end target
+
!$omp target depend ( depobj : omp_all_memory) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" }
!!$omp end target
diff --git a/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 b/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90
index f7ee34f..e7d51be 100644
--- a/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90
@@ -45,6 +45,9 @@ subroutine f6
!$omp target depend(mutexinoutset : omp_all_memory )
! !$omp end target
+ !$omp target depend(inoutset : omp_all_memory )
+ ! !$omp end target
+
!$omp target depend ( depobj : omp_all_memory)
!$omp end target
diff --git a/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 b/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90
index 66cfb61..73734bb 100644
--- a/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90
@@ -22,4 +22,7 @@ subroutine f1
!$omp task depend(mutexinoutset: a)
!$omp end task
!$omp depobj(depobj2) destroy
+ !$omp depobj(depobj1) depend(inoutset: a)
+ !$omp depobj(depobj1) update(mutexinoutset)
+ !$omp depobj(depobj1) update(inoutset)
end subroutine f1
diff --git a/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 b/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90
index 3ffd3d5..cb67c3c 100644
--- a/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90
@@ -23,9 +23,9 @@ subroutine f1
!$omp depobj(depobj) depend(mutexinoutset : a) ! OK
!$omp depobj(depobj) depend(source) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" }
!$omp depobj(depobj) depend(sink : i + 1) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" }
- !$omp depobj(depobj) update(source) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" }
- !$omp depobj(depobj) update(sink) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" }
- !$omp depobj(depobj) update(depobj) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" }
+ !$omp depobj(depobj) update(source) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" }
+ !$omp depobj(depobj) update(sink) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" }
+ !$omp depobj(depobj) update(depobj) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" }
! Valid in OpenMP 5.1:
!$omp depobj(depobj5) depend(depobj: depobj3) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" }