]> git.ipfire.org Git - thirdparty/gcc.git/commit
openmp: Add Fortran support for "omp unroll" directive
authorFrederik Harwath <frederik@codesourcery.com>
Fri, 24 Mar 2023 17:11:57 +0000 (18:11 +0100)
committerFrederik Harwath <frederik@codesourcery.com>
Mon, 27 Mar 2023 10:44:09 +0000 (12:44 +0200)
commit1091d03bbc04b7c4ec386041b48c6e0144f4bc72
tree2111bb0d1cab5dc153d3aaa97f9e2de0c92cf7f9
parentae2dca26602678f8b70e22da1bce8302c0751b75
openmp: Add Fortran support for "omp unroll" directive

This commit implements the OpenMP 5.1 "omp unroll" directive for
Fortran. The Fortran front end changes encompass the parsing and the
verification of nesting restrictions etc. The actual loop
transformation is implemented in a new language-independent
"omp_transform_loops" pass which runs before omp lowering.  No attempt
is made to re-use existing unrolling optimizations because a separate
implementation allows for better control of the unrolling. The new
pass will also serve as a foundation for the implementation of further
OpenMP loop transformations. This commit only implements the support
for "omp unroll" on the outermost loop of a loop nest.  The support
for inner loops will be added later.

gcc/ChangeLog:

* Makefile.in: Add omp_transform_loops.o.
* gimple-pretty-print.cc (dump_gimple_omp_for): Handle "full"
and "partial" clauses.
* gimple.h (enum gf_mask): Add GF_OMP_FOR_KIND_TRANSFORM_LOOP.
* gimplify.cc (is_gimple_stmt): Handle OMP_UNROLL.
(gimplify_scan_omp_clauses): Handle OMP_UNROLL_FULL,
OMP_UNROLL_NONE, and OMP_UNROLL_PARTIAL.
(gimplify_adjust_omp_clauses): Handle OMP_UNROLL_FULL,
OMP_UNROLL_NONE, and OMP_UNROLL_PARTIAL.
(gimplify_omp_for): Handle OMP_UNROLL.
(gimplify_expr): Likewise.
* params.opt: Add omp-unroll-full-max-iteration and
omp-unroll-default-factor.
* passes.def: Add pass_omp_transform_loop before
pass_lower_omp.
* tree-core.h (enum omp_clause_code): Add
OMP_CLAUSE_UNROLL_NONE, OMP_CLAUSE_UNROLL_FULL, and
OMP_CLAUSE_UNROLL_PARTIAL.
* tree-pass.h (make_pass_omp_transform_loops): Declare
pmake_pass_omp_transform_loops.
* tree-pretty-print.cc (dump_omp_clause): Handle
OMP_CLAUSE_UNROLL_NONE, OMP_CLAUSE_UNROLL_FULL, and
OMP_CLAUSE_UNROLL_PARTIAL.
(dump_generic_node): Handle OMP_UNROLL.
* tree.cc (omp_clause_num_ops): Add number of operators
for OMP_CLAUSE_UNROLL_FULL, OMP_CLAUSE_UNROLL_NONE, and
OMP_CLAUSE_UNROLL_PARTIAl.
(omp_clause_code_names): Add name strings for
OMP_CLAUSE_UNROLL_FULL, OMP_CLAUSE_UNROLL_NONE, and
OMP_CLAUSE_UNROLL_PARTIAL.
* tree.def (OMP_UNROLL): Define.
* tree.h (OMP_CLAUSE_UNROLL_PARTIAL_EXPR): Define.
* omp-transform-loops.cc: New file.
* omp-general.cc (omp_loop_transform_clause_p): New function.
* omp-general.h (omp_loop_transform_clause_p): New declaration.

gcc/fortran/ChangeLog:

* dump-parse-tree.cc (show_omp_clauses): Handle "unroll full"
and "unroll partial".
(show_omp_node): Handle OMP_UNROLL.
(show_code_node): Handle EXEC_OMP_UNROLL.
* gfortran.h (enum gfc_statement): Add ST_OMP_UNROLL, ST_OMP_END_UNROLL.
(enum gfc_exec_op): Add EXEC_OMP_UNROLL.
* match.h (gfc_match_omp_unroll): Declare.
* openmp.cc (enum omp_mask2): Add OMP_CLAUSE_UNROLL_FULL,
OMP_CLAUSE_UNROLL_NONE, OMP_CLAUSE_UNROLL_PARTIAL.
(gfc_match_omp_clauses): Handle "omp unroll partial".
(OMP_UNROLL_CLAUSES): New macro definition.
(gfc_match_omp_unroll): Match "full" clause.
(omp_unroll_removes_loop_nest): New function.
(resolve_omp_unroll): New function.
(resolve_omp_do): Accept and verify "omp unroll"
directives between directive and loop.
(omp_code_to_statement): Handle EXEC_OMP_UNROLL.
(gfc_resolve_omp_directive): Likewise.
* parse.cc (decode_omp_directive): Handle "undroll" and "end unroll".
(next_statement): Handle ST_OMP_UNROLL.
(gfc_ascii_statement): Handle ST_OMP_UNROLL and ST_OMP_END_UNROLL.
(parse_omp_do): Accept ST_OMP_UNROLL and ST_OMP_END_UNROLL
before/after loop.
(parse_executable): Handle ST_OMP_UNROLL.
* resolve.cc (gfc_resolve_blocks): Handle EXEC_OMP_UNROLL.
(gfc_resolve_code): Likewise.
* st.cc (gfc_free_statement): Likewise.
* trans-openmp.cc (gfc_trans_omp_clauses): Handle unroll clauses.
(gfc_trans_omp_do): Handle OMP_CLAUSE_UNROLL_FULL,
OMP_CLAUSE_UNROLL_PARTIAL, OMP_CLAUSE_UNROLL_NONE creation.
(gfc_trans_omp_directive): Handle EXEC_OMP_UNROLL.
* trans.cc (trans_code): Likewise.

libgomp/ChangeLog:
* testsuite/libgomp.fortran/loop-transforms/unroll-1.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-2.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-3.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-4.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-5.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-6.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-7.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-7a.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-7b.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-7c.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-8.f90: New test.
* testsuite/libgomp.fortran/loop-transforms/unroll-simd-1.f90: New test.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/loop-transforms/unroll-1.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-2.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-3.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-4.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-5.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-6.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-7.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-9.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-no-clause-1.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-no-clause-2.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-no-clause-3.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-simd-1.f90: New test.
53 files changed:
gcc/Makefile.in
gcc/fortran/dump-parse-tree.cc
gcc/fortran/gfortran.h
gcc/fortran/match.h
gcc/fortran/openmp.cc
gcc/fortran/parse.cc
gcc/fortran/resolve.cc
gcc/fortran/st.cc
gcc/fortran/trans-openmp.cc
gcc/fortran/trans.cc
gcc/gimple-pretty-print.cc
gcc/gimple.h
gcc/gimplify.cc
gcc/omp-general.cc
gcc/omp-general.h
gcc/omp-transform-loops.cc [new file with mode: 0644]
gcc/params.opt
gcc/passes.def
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-10.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-11.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-12.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-6.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-7.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-8.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-9.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-no-clause-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-no-clause-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-no-clause-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-simd-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-simd-2.f90 [new file with mode: 0644]
gcc/tree-core.h
gcc/tree-pass.h
gcc/tree-pretty-print.cc
gcc/tree.cc
gcc/tree.def
gcc/tree.h
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-1.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-2.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-3.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-4.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-5.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-6.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-7.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-7a.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-7b.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-7c.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-8.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/loop-transforms/unroll-simd-1.f90 [new file with mode: 0644]