]> git.ipfire.org Git - thirdparty/gcc.git/commit
openmp: Add Fortran support for loop transformations on inner loops
authorFrederik Harwath <frederik@codesourcery.com>
Fri, 24 Mar 2023 17:29:51 +0000 (18:29 +0100)
committerFrederik Harwath <frederik@codesourcery.com>
Mon, 27 Mar 2023 10:44:12 +0000 (12:44 +0200)
commit8e2248956953741ac458bf0bd1927e25d3a7fcda
tree7008df047a38a486bb0fccf0286f2b5a772c914e
parent505f7dcb4a4c529dcd7e2b3254054df50f9db05f
openmp: Add Fortran support for loop transformations on inner loops

So far the implementation of the "omp tile" and "omp unroll"
directives restricted their use to the outermost loop of a loop-nest.
This commit changes the Fortran front end to parse and verify the
directives on inner loops.  The transformation clauses are extended to
carry the information about the level of the loop-nest at which a
transformation should be applied.  The middle end transformation pass
is adjusted to apply the transformations at the right level of a loop
nest and to take their effect on the loop nest depth into account.

gcc/fortran/ChangeLog:

* openmp.cc (omp_unroll_removes_loop_nest): Move down in file.
(resolve_loop_transform_generic): Remove, and ...
(resolve_omp_unroll): ... inline and adapt here. Move function.
Move functin.
(find_nested_loop_in_block): New function.
(find_nested_loop_in_chain): New function, used ...
(is_outer_iteration_variable): ... here, and ...
(expr_is_invariant): ... here.
(resolve_omp_do): Adjust code for resolving loop transformations.
(resolve_omp_tile): Likewise.
* trans-openmp.cc (gfc_trans_omp_clauses): Set OMP_TRANSFROM_LEVEL
on new clause.
(compute_transformed_depth): New function to compute the depth
("collapse") of a transformed loop nest, used
(gfc_trans_omp_do): ... here.

gcc/ChangeLog:

* omp-transform-loops.cc (gimple_assign_rhs_to_tree): Fix type
in comment.
(gomp_for_uncollapse): Adjust "collapse" value after uncollapse.
(partial_unroll): Add argument for the loop nest level to be transformed.
(tile): Likewise.
(transform_gomp_for): Pass level to transformatoin functions.
(optimize_transformation_clauses): Handle transformation clauses for all
levels recursively.
* tree-pretty-print.cc (dump_omp_clause): Print
OMP_CLAUSE_TRANSFORM_LEVEL for OMP_CLAUSE_UNROLL_FULL,
OMP_CLAUSE_UNROLL_PARTIAL, and OMP_CLAUSE_TILE.
* tree.cc: Increase number of operands of OMP_CLAUSE_UNROLL_FULL,
OMP_CLAUSE_UNROLL_PARTIAL, and OMP_CLAUSE_TILE.
* tree.h (OMP_CLAUSE_TRANSFORM_LEVEL): New macro to access
clause operand 0.
(OMP_CLAUSE_UNROLL_PARTIAL_EXPR): Use operand 1 instead of 0.
(OMP_CLAUSE_TILE_SIZES): Likewise.

gcc/cp/ChangeLog

* parser.cc (cp_parser_omp_clause_unroll_full): Set new
OMP_CLAUSE_TRANSFORM_LEVEL operand to default value.
(cp_parser_omp_clause_unroll_partial): Likewise.
(cp_parser_omp_tile_sizes): Likewise.
(cp_parser_omp_loop_transform_clause): Likewise.
(cp_parser_omp_nested_loop_transform_clauses): Likewise.
(cp_parser_omp_unroll): Likewise.
* pt.cc (tsubst_omp_clauses): Adjust OMP_CLAUSE_UNROLL_PARTIAL
and OMP_CLAUSE_TILE handling to changed number of operands.

gcc/c/ChangeLog

* c-parser.cc (c_parser_omp_clause_unroll_full): Set new
OMP_CLAUSE_TRANSFORM_LEVEL operand to default value.
(c_parser_omp_clause_unroll_partial): Likewise.
(c_parser_omp_tile_sizes): Likewise.
(c_parser_omp_loop_transform_clause): Likewise.
(c_parser_omp_nested_loop_transform_clauses): Likewise.
(c_parser_omp_unroll): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/loop-transforms/unroll-8.f90: Adjust.
* gfortran.dg/gomp/loop-transforms/unroll-9.f90: Adjust.
* gfortran.dg/gomp/loop-transforms/unroll-tile-1.f90: Adjust.
* gfortran.dg/gomp/loop-transforms/unroll-tile-2.f90: Adjust.
* gfortran.dg/gomp/loop-transforms/inner-loops.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-imperfect-nest.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-1.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-2.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-3.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-3a.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-4.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-4a.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-inner-loops-5.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-inner-loop.f90: New test.
* gfortran.dg/gomp/loop-transforms/unroll-tile-inner-1.f90: New test.
* gfortran.dg/gomp/loop-transforms/tile-3.f90: Adapt to
changed diagnostic messages.

libgomp/ChangeLog:
* testsuite/libgomp.fortran/loop-transforms/inner-1.f90: New test.
29 files changed:
gcc/c/c-parser.cc
gcc/cp/parser.cc
gcc/cp/pt.cc
gcc/fortran/openmp.cc
gcc/fortran/trans-openmp.cc
gcc/omp-transform-loops.cc
gcc/testsuite/gfortran.dg/gomp/loop-transforms/inner-loops.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-3.f90
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-imperfect-nest.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-3a.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-4a.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-inner-loops-5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-non-rectangular-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/tile-non-rectangular-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-8.f90
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-9.f90
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-inner-loop.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-non-rect-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-tile-1.f90
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-tile-2.f90
gcc/testsuite/gfortran.dg/gomp/loop-transforms/unroll-tile-inner-1.f90 [new file with mode: 0644]
gcc/tree-pretty-print.cc
gcc/tree.cc
gcc/tree.h
libgomp/testsuite/libgomp.fortran/loop-transforms/inner-1.f90 [new file with mode: 0644]