[Patch][GCC12] Fortran/OpenMP: Add 'omp depobj' and 'depend(mutexinoutset:'

2021-03-17 Thread Tobias Burnus

This adds 'omp depobj' and updates the depend clause to handle
'depobj' and 'mutexinoutset'.

interator(...) is not yet implemented in the Fortran FE and, hence,
I also did not add it to depobj in this patchset.

OK for GCC 12 mainline?

Tobias

-
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank 
Thürauf
Fortran/OpenMP: Add 'omp depobj' and 'depend(mutexinoutset:'

gcc/fortran/ChangeLog:

	* dump-parse-tree.c (show_omp_namelist): Handle depobj + mutexinoutset
	in the depend clause.
	(show_omp_clauses, show_omp_node, show_code_node): Handle depobj.
	* gfortran.h (enum gfc_statement): Add ST_OMP_DEPOBJ.
	(enum gfc_omp_depend_op): Add OMP_DEPEND_UNSET,
	OMP_DEPEND_MUTEXINOUTSET and OMP_DEPEND_DEPOBJ.
	(gfc_omp_clauses): Add destroy, depobj_update and depobj.
	(enum gfc_exec_op): Add EXEC_OMP_DEPOBJ
	* match.h (gfc_match_omp_depobj): Match 'omp depobj'.
	* openmp.c (gfc_match_omp_clauses): Add depobj + mutexinoutset
to depend clause.
	(gfc_match_omp_depobj, resolve_omp_clauses, gfc_resolve_omp_directive):
	Handle 'omp depobj'.
	* parse.c (decode_omp_directive, next_statement, gfc_ascii_statement):
	Likewise.
	* resolve.c (gfc_resolve_code): Likewise.
	* st.c (gfc_free_statement): Likewise.
	* trans-openmp.c (gfc_trans_omp_clauses): Handle depobj + mutexinoutset
in the depend clause.
	(gfc_trans_omp_depobj, gfc_trans_omp_directive): Handle EXEC_OMP_DEPOBJ.
	* trans.c (trans_code): Likewise.

libgomp/ChangeLog:

	* testsuite/libgomp.fortran/depobj-1.f90: New test.

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/depobj-1.f90: New test.
	* gfortran.dg/gomp/depobj-2.f90: New test.

 gcc/fortran/dump-parse-tree.c  |  33 
 gcc/fortran/gfortran.h |  12 ++-
 gcc/fortran/match.h|   1 +
 gcc/fortran/openmp.c   | 110 
 gcc/fortran/parse.c|   6 +-
 gcc/fortran/resolve.c  |   1 +
 gcc/fortran/st.c   |   1 +
 gcc/fortran/trans-openmp.c |  68 +++
 gcc/fortran/trans.c|   1 +
 gcc/testsuite/gfortran.dg/gomp/depobj-1.f90|  26 ++
 gcc/testsuite/gfortran.dg/gomp/depobj-2.f90|  29 +++
 libgomp/testsuite/libgomp.fortran/depobj-1.f90 | 113 +
 12 files changed, 396 insertions(+), 5 deletions(-)

diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 059d8421bb5..f7f1ebcfc5e 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -1332,6 +1332,10 @@ 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_DEPOBJ: fputs ("depobj:", dumpfile); break;
+	  case OMP_DEPEND_MUTEXINOUTSET:
+	fputs ("mutexinoutset:", dumpfile);
+	break;
 	  case OMP_DEPEND_SINK_FIRST:
 	fputs ("sink:", dumpfile);
 	while (1)
@@ -1754,10 +1758,27 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
   show_expr (omp_clauses->if_exprs[i]);
   fputc (')', dumpfile);
 }
+  if (omp_clauses->destroy)
+fputs (" DESTROY", dumpfile);
   if (omp_clauses->depend_source)
 fputs (" DEPEND(source)", dumpfile);
   if (omp_clauses->capture)
 fputs (" CAPTURE", dumpfile);
+  if (omp_clauses->depobj_update != OMP_DEPEND_UNSET)
+{
+  const char *deptype;
+  fputs (" UPDATE(", dumpfile);
+  switch (omp_clauses->depobj_update)
+	{
+	case OMP_DEPEND_IN: deptype = "IN"; break;
+	case OMP_DEPEND_OUT: deptype = "OUT"; break;
+	case OMP_DEPEND_INOUT: deptype = "INOUT"; break;
+	case OMP_DEPEND_MUTEXINOUTSET: deptype = "MUTEXINOUTSET"; break;
+	default: gcc_unreachable ();
+	}
+  fputs (deptype, dumpfile);
+  fputc (')', dumpfile);
+}
   if (omp_clauses->atomic_op != GFC_OMP_ATOMIC_UNSET)
 {
   const char *atomic_op;
@@ -1831,6 +1852,7 @@ show_omp_node (int level, gfc_code *c)
 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
 case EXEC_OMP_MASTER: name = "MASTER"; break;
 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
+case EXEC_OMP_DEPOBJ: name = "DEPBOBJ"; break;
 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
 case EXEC_OMP_PARALLEL_DO_SIMD: name = "PARALLEL DO SIMD"; break;
@@ -1941,6 +1963,15 @@ show_omp_node (int level, gfc_code *c)
   if (omp_clauses)
 	fprintf (dumpfile, " (%s)", c->ext.omp_clauses->critical_name);
   break;
+case EXEC_OMP_DEPOBJ:
+  omp_clauses = c->ext.omp_clauses;
+  if (omp_clauses)
+	{
+	  fputc ('(', dumpfile);
+	  show_expr (c->ext.omp_clauses->depobj);
+	  fputc (')', dumpfile);
+	}
+  break;
 case EXEC_OM

Re: [Patch][GCC12] Fortran/OpenMP: Add 'omp depobj' and 'depend(mutexinoutset:'

2021-03-17 Thread Jakub Jelinek via Fortran
On Wed, Mar 17, 2021 at 07:19:29PM +0100, Tobias Burnus wrote:
> @@ -1831,6 +1852,7 @@ show_omp_node (int level, gfc_code *c)
>  case EXEC_OMP_FLUSH: name = "FLUSH"; break;
>  case EXEC_OMP_MASTER: name = "MASTER"; break;
>  case EXEC_OMP_ORDERED: name = "ORDERED"; break;
> +case EXEC_OMP_DEPOBJ: name = "DEPBOBJ"; break;

s/DEPBOBJ/DEPOBJ/

> +   || omp_clauses->depobj->ts.kind != 2*gfc_index_integer_kind

Formatting (several times), I think we should use 2 * gfc_index_integer_kind

> --- a/gcc/fortran/trans-openmp.c
> +++ b/gcc/fortran/trans-openmp.c
> @@ -2545,6 +2545,8 @@ gfc_trans_omp_clauses (stmtblock_t *block, 
> gfc_omp_clauses *clauses,
> tree decl = gfc_trans_omp_variable (n->sym, false);
> if (gfc_omp_privatize_by_reference (decl))
>   decl = build_fold_indirect_ref (decl);
> +   if (POINTER_TYPE_P (TREE_TYPE (decl)))
> + decl = build_fold_indirect_ref (decl);

I'm a little bit worried about this, are you sure it won't affect anything
but depobj?

> +  int k = -1; /* omp_clauses->destroy */
> +  if (!code->ext.omp_clauses->destroy)
> +switch (code->ext.omp_clauses->depobj_update != OMP_DEPEND_UNSET
> + ? code->ext.omp_clauses->depobj_update : n->u.depend_op)
> +  {
> +  case OMP_DEPEND_IN: k = GOMP_DEPEND_IN; break;
> +  case OMP_DEPEND_OUT: k = GOMP_DEPEND_IN; break;
> +  case OMP_DEPEND_INOUT: k = GOMP_DEPEND_IN; break;
> +  case OMP_DEPEND_MUTEXINOUTSET: k = GOMP_DEPEND_MUTEXINOUTSET; break;
> +  case OMP_DEPEND_DEPOBJ: k = GOMP_DEPEND_MUTEXINOUTSET; break;

Can depobj_update be OMP_DEPEND_DEPOBJ ?

Otherwise LGTM.

Jakub