[Patch] Fortran/OpenMP: Add support for OpenMP 5.1 masked construct (was: Re: [committed] openmp: Add support for OpenMP 5.1 masked construct)

2021-08-13 Thread Tobias Burnus

Hi all, hi Jakub,

On 12.08.21 22:48, Jakub Jelinek via Gcc-patches wrote:

This construct has been introduced as a replacement for master
construct, but unlike that construct is slightly more general,
has an optional clause which allows to choose which thread
will be the one running the region, it can be some other thread
than the master (primary) thread with number 0, or it could be no
threads or multiple threads (then of course one needs to be careful
about data races).


And the attached patch extends this to Fortran.

When converting the C/C++ runtime testcase to Fortran, I did run into a bug:

https://gcc.gnu.org/PR101899 (see PR or testcase; related to 'omp
taskloop'.)

Tobias

-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955
Fortran/OpenMP: Add support for OpenMP 5.1 masked construct

Commit r12-2891-gd0befed793b94f3f407be44e6f69f81a02f5f073 added C/C++
support for the masked construct. This patch extends it to
Fortran.

gcc/fortran/ChangeLog:

	* dump-parse-tree.c (show_omp_clauses): Handle 'filter' clause.
	(show_omp_node, show_code_node): Handle (combined) omp masked construct.
	* frontend-passes.c (gfc_code_walker): Likewise.
	* gfortran.h (enum gfc_statement): Add ST_OMP_*_MASKED*.
	(enum gfc_exec_op): Add EXEC_OMP_*_MASKED*.
	* match.h (gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
	gfc_match_omp_masked_taskloop_simd, gfc_match_omp_parallel_masked,
	gfc_match_omp_parallel_masked_taskloop,
	gfc_match_omp_parallel_masked_taskloop_simd): New prototypes.
	* openmp.c (enum omp_mask1): Add OMP_CLAUSE_FILTER.
	(gfc_match_omp_clauses): Match it.
	(OMP_MASKED_CLAUSES, gfc_match_omp_parallel_masked,
	gfc_match_omp_parallel_masked_taskloop,
	gfc_match_omp_parallel_masked_taskloop_simd,
	gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
	gfc_match_omp_masked_taskloop_simd): New.
	(resolve_omp_clauses): Resolve filter clause. 
	(gfc_resolve_omp_parallel_blocks, resolve_omp_do,
	omp_code_to_statement, gfc_resolve_omp_directive): Handle
	omp masked constructs.
	* parse.c (decode_omp_directive, case_exec_markers,
	gfc_ascii_statement, parse_omp_do, parse_omp_structured_block,
	parse_executable): Likewise.
	* resolve.c (gfc_resolve_blocks, gfc_resolve_code): Likewise.
	* st.c (gfc_free_statement): Likewise.
	* trans-openmp.c (gfc_trans_omp_clauses): Handle filter clause.
	(GFC_OMP_SPLIT_MASKED, GFC_OMP_MASK_MASKED): New enum values.
	(gfc_trans_omp_masked): New.
	(gfc_split_omp_clauses): Handle combined masked directives.
	(gfc_trans_omp_master_taskloop): Rename to ...
	(gfc_trans_omp_master_masked_taskloop): ... this; handle also
	combined masked directives.
	(gfc_trans_omp_parallel_master): Rename to ...
	(gfc_trans_omp_parallel_master_masked): ... this; handle
	combined masked directives.
	(gfc_trans_omp_directive): Handle EXEC_OMP_*_MASKED*.
	* trans.c (trans_code): Likewise.

libgomp/ChangeLog:

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

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/masked-1.f90: New test.
	* gfortran.dg/gomp/masked-2.f90: New test.
	* gfortran.dg/gomp/masked-3.f90: New test.
	* gfortran.dg/gomp/masked-combined-1.f90: New test.
	* gfortran.dg/gomp/masked-combined-2.f90: New test.

 gcc/fortran/dump-parse-tree.c  |  24 +++
 gcc/fortran/frontend-passes.c  |   3 +
 gcc/fortran/gfortran.h |  14 +-
 gcc/fortran/match.h|   6 +
 gcc/fortran/openmp.c   |  98 
 gcc/fortran/parse.c|  91 ++-
 gcc/fortran/resolve.c  |  15 ++
 gcc/fortran/st.c   |   6 +
 gcc/fortran/trans-openmp.c | 176 +
 gcc/fortran/trans.c|   6 +
 gcc/testsuite/gfortran.dg/gomp/masked-1.f90|  94 +++
 gcc/testsuite/gfortran.dg/gomp/masked-2.f90|  46 ++
 gcc/testsuite/gfortran.dg/gomp/masked-3.f90|  12 ++
 .../gfortran.dg/gomp/masked-combined-1.f90 |  65 
 .../gfortran.dg/gomp/masked-combined-2.f90 |  24 +++
 libgomp/testsuite/libgomp.fortran/masked-1.f90 | 141 +
 16 files changed, 788 insertions(+), 33 deletions(-)

diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 360abf18a6a..53c49fe4d6f 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -1808,6 +1808,12 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
   show_expr (omp_clauses->grainsize);
   fputc (')', dumpfile);
 }
+  if (omp_clauses->filter)
+{
+  fputs (" FILTER(", dumpfile);
+  show_expr (omp_clauses->filter);
+  fputc (')', dumpfile);
+}
   if (omp_clauses->

Re: [Patch] Fortran/OpenMP: Add support for OpenMP 5.1 masked construct (was: Re: [committed] openmp: Add support for OpenMP 5.1 masked construct)

2021-08-13 Thread Tobias Burnus

On 13.08.21 16:37, Tobias Burnus wrote:


When converting the C/C++ runtime testcase to Fortran, I did run into
a bug:
https://gcc.gnu.org/PR101899 (see PR or testcase; related to 'omp
taskloop'.)

I am any more sure whether it is a bug or not or what is the bug (see
PR) – however, for this patch it is sufficient to add a 'shared(a)':

+!$omp masked taskloop simd filter (x) grainsize (12) simdlen (4)

Corrected version attached (only change is this testcase, which now works).

Tobias

-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955
Fortran/OpenMP: Add support for OpenMP 5.1 masked construct

Commit r12-2891-gd0befed793b94f3f407be44e6f69f81a02f5f073 added C/C++
support for the masked construct. This patch extends it to
Fortran.

gcc/fortran/ChangeLog:

	* dump-parse-tree.c (show_omp_clauses): Handle 'filter' clause.
	(show_omp_node, show_code_node): Handle (combined) omp masked construct.
	* frontend-passes.c (gfc_code_walker): Likewise.
	* gfortran.h (enum gfc_statement): Add ST_OMP_*_MASKED*.
	(enum gfc_exec_op): Add EXEC_OMP_*_MASKED*.
	* match.h (gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
	gfc_match_omp_masked_taskloop_simd, gfc_match_omp_parallel_masked,
	gfc_match_omp_parallel_masked_taskloop,
	gfc_match_omp_parallel_masked_taskloop_simd): New prototypes.
	* openmp.c (enum omp_mask1): Add OMP_CLAUSE_FILTER.
	(gfc_match_omp_clauses): Match it.
	(OMP_MASKED_CLAUSES, gfc_match_omp_parallel_masked,
	gfc_match_omp_parallel_masked_taskloop,
	gfc_match_omp_parallel_masked_taskloop_simd,
	gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
	gfc_match_omp_masked_taskloop_simd): New.
	(resolve_omp_clauses): Resolve filter clause. 
	(gfc_resolve_omp_parallel_blocks, resolve_omp_do,
	omp_code_to_statement, gfc_resolve_omp_directive): Handle
	omp masked constructs.
	* parse.c (decode_omp_directive, case_exec_markers,
	gfc_ascii_statement, parse_omp_do, parse_omp_structured_block,
	parse_executable): Likewise.
	* resolve.c (gfc_resolve_blocks, gfc_resolve_code): Likewise.
	* st.c (gfc_free_statement): Likewise.
	* trans-openmp.c (gfc_trans_omp_clauses): Handle filter clause.
	(GFC_OMP_SPLIT_MASKED, GFC_OMP_MASK_MASKED): New enum values.
	(gfc_trans_omp_masked): New.
	(gfc_split_omp_clauses): Handle combined masked directives.
	(gfc_trans_omp_master_taskloop): Rename to ...
	(gfc_trans_omp_master_masked_taskloop): ... this; handle also
	combined masked directives.
	(gfc_trans_omp_parallel_master): Rename to ...
	(gfc_trans_omp_parallel_master_masked): ... this; handle
	combined masked directives.
	(gfc_trans_omp_directive): Handle EXEC_OMP_*_MASKED*.
	* trans.c (trans_code): Likewise.

libgomp/ChangeLog:

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

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/masked-1.f90: New test.
	* gfortran.dg/gomp/masked-2.f90: New test.
	* gfortran.dg/gomp/masked-3.f90: New test.
	* gfortran.dg/gomp/masked-combined-1.f90: New test.
	* gfortran.dg/gomp/masked-combined-2.f90: New test.

 gcc/fortran/dump-parse-tree.c  |  24 +++
 gcc/fortran/frontend-passes.c  |   3 +
 gcc/fortran/gfortran.h |  14 +-
 gcc/fortran/match.h|   6 +
 gcc/fortran/openmp.c   |  98 
 gcc/fortran/parse.c|  91 ++-
 gcc/fortran/resolve.c  |  15 ++
 gcc/fortran/st.c   |   6 +
 gcc/fortran/trans-openmp.c | 176 +
 gcc/fortran/trans.c|   6 +
 gcc/testsuite/gfortran.dg/gomp/masked-1.f90|  94 +++
 gcc/testsuite/gfortran.dg/gomp/masked-2.f90|  46 ++
 gcc/testsuite/gfortran.dg/gomp/masked-3.f90|  12 ++
 .../gfortran.dg/gomp/masked-combined-1.f90 |  65 
 .../gfortran.dg/gomp/masked-combined-2.f90 |  24 +++
 libgomp/testsuite/libgomp.fortran/masked-1.f90 | 119 ++
 16 files changed, 766 insertions(+), 33 deletions(-)

diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 360abf18a6a..53c49fe4d6f 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -1808,6 +1808,12 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
   show_expr (omp_clauses->grainsize);
   fputc (')', dumpfile);
 }
+  if (omp_clauses->filter)
+{
+  fputs (" FILTER(", dumpfile);
+  show_expr (omp_clauses->filter);
+  fputc (')', dumpfile);
+}
   if (omp_clauses->hint)
 {
   fputs (" HINT(", dumpfile);
@@ -1946,6 +1952,9 @@ show_omp_node (int level, gfc_code *c)
 case EXEC_OMP_DO_SIMD: name = "DO SIMD"; break;
 case EXEC_OMP_LOOP: name = "LOOP"; b