From: Tobias Burnus Date: Wed, 13 May 2020 08:06:45 +0000 (+0200) Subject: [Fortran] OpenMP - permit lastprivate in distribute + SIMD fixes (PR94690) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f884bef21cccc05d748fd7869cd641cbb4f6b6bb;p=gcc.git [Fortran] OpenMP - permit lastprivate in distribute + SIMD fixes (PR94690) gcc/fortran/ 2020-05-13 Tobias Burnus PR fortran/94690 * openmp.c (OMP_DISTRIBUTE_CLAUSES): Add OMP_CLAUSE_LASTPRIVATE. (gfc_resolve_do_iterator): Skip the private handling for SIMD as that is handled by ME code. * trans-openmp.c (gfc_trans_omp_do): Don't add private/lastprivate for dovar_found == 0, unless !simple. libgomp/ 2020-05-13 Tobias Burnus PR fortran/94690 * testsuite/libgomp.fortran/pr66199-3.f90: New. * testsuite/libgomp.fortran/pr66199-4.f90: New. * testsuite/libgomp.fortran/pr66199-5.f90: New. * testsuite/libgomp.fortran/pr66199-6.f90: New. * testsuite/libgomp.fortran/pr66199-7.f90: New. * testsuite/libgomp.fortran/pr66199-8.f90: New. * testsuite/libgomp.fortran/pr66199-9.f90: New. --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9f7b60e2ef9..9ce70f7b461 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2020-05-13 Tobias Burnus + + PR fortran/94690 + * openmp.c (OMP_DISTRIBUTE_CLAUSES): Add OMP_CLAUSE_LASTPRIVATE. + (gfc_resolve_do_iterator): Skip the private handling for SIMD as + that is handled by ME code. + * trans-openmp.c (gfc_trans_omp_do): Don't add private/lastprivate + for dovar_found == 0, unless !simple. + 2020-05-11 Harald Anlauf PR fortran/95053 diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 930bca541b9..310d4e030d2 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -2595,7 +2595,7 @@ cleanup: | OMP_CLAUSE_SHARED | OMP_CLAUSE_REDUCTION) #define OMP_DISTRIBUTE_CLAUSES \ (omp_mask (OMP_CLAUSE_PRIVATE) | OMP_CLAUSE_FIRSTPRIVATE \ - | OMP_CLAUSE_COLLAPSE | OMP_CLAUSE_DIST_SCHEDULE) + | OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_COLLAPSE | OMP_CLAUSE_DIST_SCHEDULE) #define OMP_SINGLE_CLAUSES \ (omp_mask (OMP_CLAUSE_PRIVATE) | OMP_CLAUSE_FIRSTPRIVATE) #define OMP_ORDERED_CLAUSES \ @@ -5682,6 +5682,31 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym, bool add_clause) if (omp_current_ctx->sharing_clauses->contains (sym)) return; + if (omp_current_ctx->is_openmp && omp_current_ctx->code->block) + { + /* SIMD is handled differently and, hence, ignored here. */ + gfc_code *omp_code = omp_current_ctx->code->block; + for ( ; omp_code->next; omp_code = omp_code->next) + switch (omp_code->op) + { + case EXEC_OMP_SIMD: + case EXEC_OMP_DO_SIMD: + case EXEC_OMP_PARALLEL_DO_SIMD: + case EXEC_OMP_DISTRIBUTE_SIMD: + case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: + case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: + case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: + case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: + case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: + case EXEC_OMP_TARGET_PARALLEL_DO_SIMD: + case EXEC_OMP_TARGET_SIMD: + case EXEC_OMP_TASKLOOP_SIMD: + return; + default: + break; + } + } + if (! omp_current_ctx->private_iterators->add (sym) && add_clause) { gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses; diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 42ecd0a9cbb..8cf851eb6e3 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -4262,23 +4262,22 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock, break; } } - if (!dovar_found) + if (!dovar_found && op == EXEC_OMP_SIMD) { - if (op == EXEC_OMP_SIMD) + if (collapse == 1) { - if (collapse == 1) - { - tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); - OMP_CLAUSE_LINEAR_STEP (tmp) = step; - OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; - } - else - tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE); - if (!simple) - dovar_found = 2; + tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); + OMP_CLAUSE_LINEAR_STEP (tmp) = step; + OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; + OMP_CLAUSE_DECL (tmp) = dovar_decl; + omp_clauses = gfc_trans_add_clause (tmp, omp_clauses); } - else - tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); + if (!simple) + dovar_found = 2; + } + else if (!dovar_found && !simple) + { + tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); OMP_CLAUSE_DECL (tmp) = dovar_decl; omp_clauses = gfc_trans_add_clause (tmp, omp_clauses); } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 1265640a2c3..104c527f9c7 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,14 @@ +2020-05-13 Tobias Burnus + + PR fortran/94690 + * testsuite/libgomp.fortran/pr66199-3.f90: New. + * testsuite/libgomp.fortran/pr66199-4.f90: New. + * testsuite/libgomp.fortran/pr66199-5.f90: New. + * testsuite/libgomp.fortran/pr66199-6.f90: New. + * testsuite/libgomp.fortran/pr66199-7.f90: New. + * testsuite/libgomp.fortran/pr66199-8.f90: New. + * testsuite/libgomp.fortran/pr66199-9.f90: New. + 2020-05-12 Jakub Jelinek * testsuite/libgomp.c/target-39.c: New test. diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-3.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-3.f90 new file mode 100644 index 00000000000..7c596dc1739 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-3.f90 @@ -0,0 +1,53 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + integer u(0:1024-1), v(0:1024-1), w(0:1024-1) +contains + +integer(8) function f1 (a, b) + implicit none + integer, value :: a, b + integer(8) :: d + !$omp parallel do lastprivate (d) default(none) firstprivate (a, b) shared(u, v, w) + do d = a, b-1 + u(d) = v(d) + w(d) + end do + f1 = d +end + +integer(8) function f2 (a, b, c) + implicit none + integer, value :: a, b, c + integer(8) :: d, e + !$omp parallel do lastprivate (d) default(none) firstprivate (a, b) shared(u, v, w) linear(c:5) lastprivate(e) + do d = a, b-1 + u(d) = v(d) + w(d) + c = c + 5 + e = c + end do + f2 = d + c + e +end + +integer(8) function f3 (a1, b1, a2, b2) + implicit none + integer, value :: a1, b1, a2, b2 + integer(8) d1, d2 + !$omp parallel do default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + f3 = d1 + d2 +end +end module m + +program main + use m + if (f1 (0, 1024) /= 1024) stop 1 + if (f2 (0, 1024, 17) /= 1024 + 2 * (17 + 5 * 1024)) stop 2 + if (f3 (0, 32, 0, 32) /= 64) stop 3 +end program main diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-4.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-4.f90 new file mode 100644 index 00000000000..17b62a6bb95 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-4.f90 @@ -0,0 +1,60 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer u(0:1023), v(0:1023), w(0:1023) + !$omp declare target (u, v, w) + +contains + +subroutine f1 (a, b) + integer a, b, d + !$omp target teams distribute parallel do default(none) firstprivate (a, b) shared(u, v, w) + do d = a, b-1 + u(d) = v(d) + w(d) + end do +end + +subroutine f2 (a, b, c) + integer a, b, c, d, e + !$omp target teams distribute parallel do default(none) firstprivate (a, b, c) shared(u, v, w) lastprivate(d, e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do +end + +subroutine f3 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target teams distribute parallel do default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) & + !$omp& lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do +end + +subroutine f4 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target teams distribute parallel do default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) & + !$omp& collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do +end +end module m + +program main + use m + implicit none + call f1 (0, 1024) + call f2 (0, 1024, 17) + call f3 (0, 32, 0, 32) + call f4 (0, 32, 0, 32) +end diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-5.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-5.f90 new file mode 100644 index 00000000000..9482f08fc02 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-5.f90 @@ -0,0 +1,71 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer u(0:1023), v(0:1023), w(0:1023) + !$omp declare target (u, v, w) + +contains + +integer function f1 (a, b) + integer :: a, b, d + !$omp target map(from: d) + !$omp teams distribute parallel do simd default(none) firstprivate (a, b) shared(u, v, w) + do d = a, b-1 + u(d) = v(d) + w(d) + end do + !$omp end target + f1 = d +end + +integer function f2 (a, b, c) + integer :: a, b, c, d, e + !$omp target map(from: d, e) + !$omp teams distribute parallel do simd default(none) firstprivate (a, b, c) shared(u, v, w) linear(d) lastprivate(e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do + !$omp end target + f2 = d + e +end + +integer function f3 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams distribute parallel do simd default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) lastprivate(d1, d2) & + !$omp& collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end target + f3 = d1 + d2 +end + +integer function f4 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams distribute parallel do simd default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end target + f4 = d1 + d2 +end +end module + +program main + use m + implicit none + if (f1 (0, 1024) /= 1024) stop 1 + if (f2 (0, 1024, 17) /= 1024 + (17 + 5 * 1023)) stop 2 + if (f3 (0, 32, 0, 32) /= 64) stop 3 + if (f4 (0, 32, 0, 32) /= 64) stop 3 +end diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-6.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-6.f90 new file mode 100644 index 00000000000..f73f6833bb5 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-6.f90 @@ -0,0 +1,42 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer :: u(0:1023), v(0:1023), w(0:1023) + !$omp declare target (u, v, w) + +contains + +integer function f2 (a, b, c) + integer :: a, b, c, d, e + !$omp target map(from: d, e) + !$omp teams distribute parallel do default(none) firstprivate (a, b, c) shared(u, v, w) lastprivate(d, e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do + !$omp end target + f2 = d + e +end + +integer function f3 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams distribute parallel do default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end target + f3 = d1 + d2 +end +end module m + +use m + if (f2 (0, 1024, 17) /= 1024 + (17 + 5 * 1023)) stop 1 + if (f3 (0, 32, 0, 32) /= 64) stop 2 +end diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-7.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-7.f90 new file mode 100644 index 00000000000..2bd94683163 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-7.f90 @@ -0,0 +1,72 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer u(1024), v(1024), w(1024) + !$omp declare target (v, u, w) + +contains + +integer function f1 (a, b) + integer :: a, b, d + !$omp target map(from: d) + !$omp teams distribute simd default(none) firstprivate (a, b) shared(u, v, w) + do d = a, b-1 + u(d) = v(d) + w(d) + end do + !$omp end teams distribute simd + !$omp end target + f1 = d +end + +integer function f2 (a, b, c) + integer a, b, c, d, e + !$omp target map(from: d, e) + !$omp teams distribute simd default(none) firstprivate (a, b, c) shared(u, v, w) linear(d) lastprivate(e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do + !$omp end teams distribute simd + !$omp end target + f2 = d + e +end + +integer function f3 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams distribute simd default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end teams distribute simd + !$omp end target + f3 = d1 + d2 +end + +integer function f4 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams distribute simd default(none) firstprivate (a1, b1, a2, b2) shared(u, v, w) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end teams distribute simd + !$omp end target + f4 = d1 + d2 +end +end module + +use m + if (f1 (0, 1024) /= 1024) stop 1 + if (f2 (0, 1024, 17) /= 1024 + (17 + 5 * 1023)) stop 2 + if (f3 (0, 32, 0, 32) /= 64) stop 3 + if (f4 (0, 32, 0, 32) /= 64) stop 4 +end diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-8.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-8.f90 new file mode 100644 index 00000000000..8a21c6f2b2a --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-8.f90 @@ -0,0 +1,76 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer u(0:1023), v(0:1023), w(0:1023) + !$omp declare target (u, v, w) + +contains + +integer function f1 (a, b) + integer :: a, b, d + !$omp target map(from: d) + !$omp teams default(none) shared(a, b, d, u, v, w) + !$omp distribute simd firstprivate (a, b) + do d = a, b-1 + u(d) = v(d) + w(d) + end do + !$omp end teams + !$omp end target + f1 = d +end + +integer function f2 (a, b, c) + integer a, b, c, d, e + !$omp target map(from: d, e) + !$omp teams default(none) firstprivate (a, b, c) shared(d, e, u, v, w) + !$omp distribute simd linear(d) lastprivate(e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do + !$omp end teams + !$omp end target + f2 = d + e +end + +integer function f3 (a1, b1, a2, b2) + integer a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams default(none) shared(a1, b1, a2, b2, d1, d2, u, v, w) + !$omp distribute simd firstprivate (a1, b1, a2, b2) lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end teams + !$omp end target + f3 = d1 + d2 +end + +integer function f4 (a1, b1, a2, b2) + integer a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams default(none) firstprivate (a1, b1, a2, b2) shared(d1, d2, u, v, w) + !$omp distribute simd collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end teams + !$omp end target + f4 = d1 + d2 +end +end module m + +use m + if (f1 (0, 1024) /= 1024) stop 1 + if (f2 (0, 1024, 17) /= 1024 + (17 + 5 * 1023)) stop 2 + if (f3 (0, 32, 0, 32) /= 64) stop 3 + if (f4 (0, 32, 0, 32) /= 64) stop 4 +end diff --git a/libgomp/testsuite/libgomp.fortran/pr66199-9.f90 b/libgomp/testsuite/libgomp.fortran/pr66199-9.f90 new file mode 100644 index 00000000000..5dde7f83116 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr66199-9.f90 @@ -0,0 +1,46 @@ +! { dg-do run } +! +! PR fortran/94690 +! PR middle-end/66199 + +module m + implicit none + integer u(1024), v(1024), w(1024) + !$omp declare target (u, v, w) + +contains + +integer function f2 (a, b, c) + integer :: a, b, c, d, e + !$omp target map(from: d, e) + !$omp teams default(none) firstprivate (a, b, c) shared(d, e, u, v, w) + !$omp distribute lastprivate(d, e) + do d = a, b-1 + u(d) = v(d) + w(d) + e = c + d * 5 + end do + !$omp end teams + !$omp end target + f2 = d + e +end + +integer function f3 (a1, b1, a2, b2) + integer :: a1, b1, a2, b2, d1, d2 + !$omp target map(from: d1, d2) + !$omp teams default(none) shared(a1, b1, a2, b2, d1, d2, u, v, w) + !$omp distribute firstprivate (a1, b1, a2, b2) lastprivate(d1, d2) collapse(2) + do d1 = a1, b1-1 + do d2 = a2, b2-1 + u(d1 * 32 + d2) = v(d1 * 32 + d2) + w(d1 * 32 + d2) + end do + end do + !$omp end teams + !$omp end target + f3 = d1 + d2 +end +end module + +use m + if (f2 (0, 1024, 17) /= 1024 + (17 + 5 * 1023)) stop 1 + if (f3 (0, 32, 0, 32) /= 64) stop 2 +end