From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 216D93858413; Wed, 19 Jul 2023 10:48:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 216D93858413 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="6.01,216,1684828800"; d="scan'208";a="12229049" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 19 Jul 2023 02:48:33 -0800 IronPort-SDR: HlspYqF4fC6ed2L+BsTRTlNQlF7IqvdSa2lxZfC5wrUXljo3Gqf3e0zvEwcrdK1NJgJxLq4B4o 8IbokaHiCrRcNs5p01tynu5bfdqWuR1kJsJBYk7mkh6+1+sabqABfGuq6yCADbNq7jfxhat3uu vMnjYFUirTZL5KDzHHxuWRXdNRMiExd2bCAdlK+RVd8gUha4yrNnZTrMpRIthbTQwG0EmeNn4I cVnGaB3Gg+mjYZrKm2LJlKbWTAPrqkaoK/xKV2eHR5tiHFFI/veKX7wBi1FTQrps1SSsKCt4VA Gco= From: Thomas Schwinge To: Tobias Burnus CC: , , Jakub Jelinek , Frederik Harwath Subject: Re: [committed] - Re: [patch] OpenMP/Fortran: Non-rectangular loops with constant steps other than 1 or -1 [PR107424] In-Reply-To: References: User-Agent: Notmuch/0.29.3+94~g74c3f1b (https://notmuchmail.org) Emacs/28.2 (x86_64-pc-linux-gnu) Date: Wed, 19 Jul 2023 12:48:24 +0200 Message-ID: <87v8egyy6f.fsf@euler.schwinge.homeip.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_ASCII_DIVIDERS,KAM_DMARC_STATUS,KAM_SHORT,SCC_10_SHORT_WORD_LINES,SCC_5_SHORT_WORD_LINES,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hi Tobias! On 2023-07-19T10:26:12+0200, Tobias Burnus wrote: > Now committed as Rev. r14-2634-g85da0b40538fb0 On devel/omp/gcc-13 branch, the corresponding commit b003e6511754dce475f7f5b0c5cd887a177e41b3 "OpenMP/Fortran: Non-rectangular loops with constant steps other than 1 or = -1 [PR107424]" introduces a regression: PASS: libgomp.fortran/loop-transforms/unroll-2.f90 -O0 (test for exc= ess errors) [-PASS:-]{+FAIL:+} libgomp.fortran/loop-transforms/unroll-2.f90 -O0 = execution test Etc. spawn [open ...] 4 8 10 11 Program aborted. Backtrace: #0 0x400f9c in test at [...]/libgomp.fortran/loop-transforms/unroll-2.f90:85 #1 0x400fd3 in main at [...]/libgomp.fortran/loop-transforms/unroll-2.f90:59 Gr=C3=BC=C3=9Fe Thomas > Changes: > > * I missed to updated another 'sorry' (msg wording change) - now fixed; > I also added it to the sorry-testcase file non-rectangular-loop-5.f90. > > * I decided to retire the PR as several issues have been fixed and the > original title did not fit any more. The remaining issue is now tracked > in PR110735 (i.e. handling step !=3D const, both the generic and possibly > a simpler special case). > > * I added a link to the PR to libgomp.texi such that one can find out > what is only partially supported for Fortran. > > Thanks, > > Tobias > > PS: Otherwise, the following still applies: > > On 18.07.23 14:11, Tobias Burnus wrote: >> Comments regarding the validity of the Fortran assumptions are welcome! >> >> This patch now uses a 'simple' loop for OpenMP loops with >> a constant loop-step size. Before, it only did so for step =3D =C2=B11. >> (Otherwise, a count variable is used from which the original >> loop index variable is calculated from.) >> >> For details, see the attached patch or >> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D107424#c12 >> (comment 12 + 14 plus the email linked in comment 12). >> >> Comments? Remarks? If there are none, I will relatively soonish >> commit the attached patch to mainline, only. > commit 85da0b40538fb0d17d89de1e7905984668e3dfef > Author: Tobias Burnus > Date: Wed Jul 19 10:18:49 2023 +0200 > > OpenMP/Fortran: Non-rectangular loops with constant steps other than = 1 or -1 [PR107424] > > Before this commit, gfortran produced with OpenMP for 'do i =3D 1,10,= 2' > the code > for (count.0 =3D 0; count.0 < 5; count.0 =3D count.0 + 1) > i =3D count.0 * 2 + 1; > > While such an inner loop can be collapsed, a non-rectangular could no= t. > With this commit and for all constant loop steps, a simple loop such > as 'for (i =3D 1; i <=3D 10; i =3D i + 2)' is created. (Before only f= or the > constant steps of 1 and -1.) > > The constant step permits to know the direction (increasing/decreasin= g) > that is required for the loop condition. > > The new code is only valid if one assumes no overflow of the loop var= iable. > However, the Fortran standard can be read that this must be ensured b= y > the user. Namely, the Fortran standard requires (F2023, 10.1.5.2.4): > "The execution of any numeric operation whose result is not defined b= y > the arithmetic used by the processor is prohibited." > > And, for DO loops, F2023's "11.1.7.4.3 The execution cycle" has the > following: The number of loop iterations handled by an iteration coun= t, > which would permit code like 'do i =3D huge(i)-5, huge(i),4'. However= , > in step (3), this count is not only decremented by one but also: > "... The DO variable, if any, is incremented by the value of the > incrementation parameter m3." > And for the example above, 'i' would be 'huge(i)+3' in the last > execution cycle, which exceeds the largest model number and should > render the example as invalid. > > PR fortran/107424 > > gcc/fortran/ChangeLog: > > * trans-openmp.cc (gfc_nonrect_loop_expr): Accept all > constant loop steps. > (gfc_trans_omp_do): Likewise; use sign to determine > loop direction. > > libgomp/ChangeLog: > > * libgomp.texi (Impl. Status 5.0): Add link to new PR110735. > * testsuite/libgomp.fortran/non-rectangular-loop-1.f90: Enabl= e > commented tests. > * testsuite/libgomp.fortran/non-rectangular-loop-1a.f90: Remo= ve > test file; tests are in non-rectangular-loop-1.f90. > * testsuite/libgomp.fortran/non-rectangular-loop-5.f90: Chang= e > testcase to use a non-constant step to retain the 'sorry' tes= t. > * testsuite/libgomp.fortran/non-rectangular-loop-6.f90: New t= est. > > gcc/testsuite/ChangeLog: > > * gfortran.dg/gomp/linear-2.f90: Update dump to remove > the additional count variable. > --- > gcc/fortran/trans-openmp.cc | 18 +- > gcc/testsuite/gfortran.dg/gomp/linear-2.f90 | 4 +- > libgomp/libgomp.texi | 4 +- > .../libgomp.fortran/non-rectangular-loop-1.f90 | 537 ++++++++++-----= ------ > .../libgomp.fortran/non-rectangular-loop-1a.f90 | 374 -------------- > .../libgomp.fortran/non-rectangular-loop-5.f90 | 22 +- > .../libgomp.fortran/non-rectangular-loop-6.f90 | 196 ++++++++ > 7 files changed, 494 insertions(+), 661 deletions(-) > > diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc > index c88ee3c7656..cf741cebf91 100644 > --- a/gcc/fortran/trans-openmp.cc > +++ b/gcc/fortran/trans-openmp.cc > @@ -5374,10 +5374,10 @@ gfc_nonrect_loop_expr (stmtblock_t *pblock, gfc_s= e *sep, int loop_n, > > if (!simple) > { > - /* FIXME: Handle non-unit iter steps, cf. PR fortran/107424. */ > + /* FIXME: Handle non-const iter steps, cf. PR fortran/110735. */ > sorry_at (gfc_get_location (&curr_loop_var->where), > - "non-rectangular loop nest with step other than constant 1 = " > - "or -1 for %qs", curr_loop_var->symtree->n.sym->name); > + "non-rectangular loop nest with non-constant step for %qs", > + curr_loop_var->symtree->n.sym->name); > return false; > } > > @@ -5394,10 +5394,10 @@ gfc_nonrect_loop_expr (stmtblock_t *pblock, gfc_s= e *sep, int loop_n, > } > else > { > - /* FIXME: Handle non-unit iter steps, cf. PR fortran/107424. *= / > + /* FIXME: Handle non-const iter steps, cf. PR fortran/110735. = */ > sorry_at (gfc_get_location (&code->loc), > - "non-rectangular loop nest with step other than const= ant " > - "1 or -1 for %qs", var->name); > + "non-rectangular loop nest with non-constant step " > + "for %qs", var->name); > inform (gfc_get_location (&expr->where), "Used here"); > return false; > } > @@ -5578,10 +5578,8 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, = stmtblock_t *pblock, > gfc_add_block_to_block (pblock, &se.pre); > step =3D gfc_evaluate_now (se.expr, pblock); > > - if (integer_onep (step)) > - simple =3D 1; > - else if (tree_int_cst_equal (step, integer_minus_one_node)) > - simple =3D -1; > + if (TREE_CODE (step) =3D=3D INTEGER_CST) > + simple =3D tree_int_cst_sgn (step); > > gfc_init_se (&se, NULL); > if (!clauses->non_rectangular > diff --git a/gcc/testsuite/gfortran.dg/gomp/linear-2.f90 b/gcc/testsuite/= gfortran.dg/gomp/linear-2.f90 > index 05f007fd5c2..88df96e9b8f 100644 > --- a/gcc/testsuite/gfortran.dg/gomp/linear-2.f90 > +++ b/gcc/testsuite/gfortran.dg/gomp/linear-2.f90 > @@ -105,8 +105,8 @@ end module > ! { dg-final { scan-tree-dump-times "#pragma omp for nowait" 6 "original= " } } > ! { dg-final { scan-tree-dump-times "#pragma omp for linear\\(x:D\\.\[0-= 9\]+\\) nowait" 1 "original" } } > ! { dg-final { scan-tree-dump-times "#pragma omp for linear\\(x:val,step= \\(D\\.\[0-9\]+\\)\\) nowait" 1 "original" } } > -! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(count\\.\= [0-9\]:1\\) linear\\(i:3\\)" 2 "original" } } > -! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(count\\.\= [0-9\]:1\\) linear\\(i:val,step\\(3\\)\\)" 2 "original" } } > +! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:3\\)" 2= "original" } } > +! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:val,ste= p\\(3\\)\\)" 2 "original" } } > ! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) li= near\\(x:D\\.\[0-9\]+\\)" 2 "original" } } > ! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) li= near\\(x:val,step\\(D\\.\[0-9\]+\\)\\)" 2 "original" } } > ! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:D\\.\[0= -9\]+\\)" 2 "original" } } > diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi > index 639dd05eb7b..a8582b50177 100644 > --- a/libgomp/libgomp.texi > +++ b/libgomp/libgomp.texi > @@ -194,7 +194,9 @@ The OpenMP 4.5 specification is fully supported. > @item @code{requires} directive @tab P > @tab complete but no non-host device provides @code{unified_shared= _memory} > @item @code{teams} construct outside an enclosing target region @tab Y @= tab > -@item Non-rectangular loop nests @tab P @tab Full support for C/C++, par= tial for Fortran > +@item Non-rectangular loop nests @tab P > + @tab Full support for C/C++, partial for Fortran > + (@uref{https://gcc.gnu.org/PR110735,PR110735}) > @item @code{!=3D} as relational-op in canonical loop form for C/C++ @tab= Y @tab > @item @code{nonmonotonic} as default loop schedule modifier for workshar= ing-loop > constructs @tab Y @tab > diff --git a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1.f90= b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1.f90 > index dbbd18a1444..d074d4de5a0 100644 > --- a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1.f90 > +++ b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1.f90 > @@ -6,9 +6,6 @@ > > ! Nonrectangular loop nests checks > > -! See PR or non-rectangular-loop-1a.f90 for the commented tests > -! Hint: Those use step for loop vars part of nonrectangular loop nests > - > module m > implicit none (type, external) > contains > @@ -26,32 +23,32 @@ subroutine lastprivate_check_simd_1 > ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > ! Then same, except use non-unit step for 'k' > > -! !$omp simd collapse(3) lastprivate(k) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > - > -! !$omp simd collapse(3) lastprivate(k) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp simd collapse(3) lastprivate(k) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp simd collapse(3) lastprivate(k) > do i =3D 1, n, 2 > do j =3D 1, m > do k =3D j - 41, p > if (k < 1 - 41 .or. k > p) then > - print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)" > + ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p= )" > error stop > end if > end do > @@ -66,7 +63,7 @@ subroutine lastprivate_check_simd_1 > do j =3D 1, m > do k =3D j - 41, p > if (k < 1 - 41 .or. k > p) then > - print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)" > + ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p= )" > error stop > end if > end do > @@ -102,25 +99,25 @@ subroutine lastprivate_check_simd_1 > > ! Same but 'private' for all (i,j) vars > > -! !$omp simd collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! > -! !$omp simd collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp simd collapse(3) lastprivate(k) private(i,j) > do i =3D 1, n, 2 > @@ -144,27 +141,27 @@ subroutine lastprivate_check_simd_1 > > ! Same - but with lastprivate(i,j) > > -! !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > -! !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 2 .or. j /=3D m + 1) error stop > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 1 .or. j /=3D m + 2) error stop > + > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 2 .or. j /=3D m + 1) error stop > > !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > do i =3D 1, n, 2 > @@ -201,25 +198,25 @@ subroutine lastprivate_check_do_simd_1 > ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > ! Then same, except use non-unit step for 'k' > > -! !$omp parallel do simd collapse(3) lastprivate(k) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > - > -! !$omp parallel do simd collapse(3) lastprivate(k) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp parallel do simd collapse(3) lastprivate(k) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp parallel do simd collapse(3) lastprivate(k) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp parallel do simd collapse(3) lastprivate(k) > do i =3D 1, n, 2 > @@ -243,25 +240,25 @@ subroutine lastprivate_check_do_simd_1 > > ! Same but 'private' for all (i,j) vars > > -! !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > - > -! !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > do i =3D 1, n, 2 > @@ -285,27 +282,27 @@ subroutine lastprivate_check_do_simd_1 > > ! Same - but with lastprivate(i,j) > > -! !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > -! !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 2 .or. j /=3D m + 1) error stop > + !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 1 .or. j /=3D m + 2) error stop > + > + !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 2 .or. j /=3D m + 1) error stop > > !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > do i =3D 1, n, 2 > @@ -343,25 +340,25 @@ subroutine lastprivate_check_do_1 > ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > ! Then same, except use non-unit step for 'k' > > -! !$omp parallel do collapse(3) lastprivate(k) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > - > -! !$omp parallel do collapse(3) lastprivate(k) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp parallel do collapse(3) lastprivate(k) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp parallel do collapse(3) lastprivate(k) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp parallel do collapse(3) lastprivate(k) > do i =3D 1, n, 2 > @@ -385,25 +382,25 @@ subroutine lastprivate_check_do_1 > > ! Same but 'private' for all (i,j) vars > > -! !$omp parallel do collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > - > -! !$omp parallel do collapse(3) lastprivate(k) private(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > + !$omp parallel do collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + > + !$omp parallel do collapse(3) lastprivate(k) private(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > > !$omp parallel do collapse(3) lastprivate(k) private(i,j) > do i =3D 1, n, 2 > @@ -427,27 +424,27 @@ subroutine lastprivate_check_do_1 > > ! Same - but with lastprivate(i,j) > > -! !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n > -! do j =3D 1, m, 2 > -! do k =3D j - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > -! !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > -! do i =3D 1, n, 2 > -! do j =3D 1, m > -! do k =3D i - 41, p > -! if (k < 1 - 41 .or. k > p) error stop > -! end do > -! end do > -! end do > -! if (k /=3D p + 1) error stop > -! if (i /=3D n + 2 .or. j /=3D m + 1) error stop > + !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n > + do j =3D 1, m, 2 > + do k =3D j - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 1 .or. j /=3D m + 2) error stop > + > + !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D 1, n, 2 > + do j =3D 1, m > + do k =3D i - 41, p > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D p + 1) error stop > + if (i /=3D n + 2 .or. j /=3D m + 1) error stop > > !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > do i =3D 1, n, 2 > @@ -481,42 +478,42 @@ subroutine lastprivate_check_2 > m =3D 23 > p =3D 27 > > -! !$omp parallel do simd collapse(3) lastprivate(p) > -! do i =3D 1, n > -! do j =3D 1, m,2 > -! do k =3D 1, j + 41 > -! do ll =3D 1, p, 2 > -! if (k > 23 + 41 .or. k < 1) error stop > -! end do > -! end do > -! end do > -! end do > -! if (ll /=3D 29) error stop > - > -! !$omp simd collapse(3) lastprivate(p) > -! do i =3D 1, n > -! do j =3D 1, m,2 > -! do k =3D 1, j + 41 > -! do ll =3D 1, p, 2 > -! if (k > 23 + 41 .or. k < 1) error stop > -! end do > -! end do > -! end do > -! end do > -! if (ll /=3D 29) error stop > - > -! !$omp simd collapse(3) lastprivate(k) > -! do i =3D 1, n,2 > -! do j =3D 1, m > -! do k =3D 1, i + 41 > -! if (k > 11 + 41 .or. k < 1) error stop > -! end do > -! end do > -! end do > -!if (k /=3D 53) then > -! print *, k, 53 > -! error stop > -!endif > + !$omp parallel do simd collapse(3) lastprivate(ll) > + do i =3D 1, n > + do j =3D 1, m,2 > + do k =3D 1, j + 41 > + do ll =3D 1, p, 2 > + if (k > 23 + 41 .or. k < 1) error stop > + end do > + end do > + end do > + end do > + if (ll /=3D 29) error stop > + > + !$omp simd collapse(3) lastprivate(ll) > + do i =3D 1, n > + do j =3D 1, m,2 > + do k =3D 1, j + 41 > + do ll =3D 1, p, 2 > + if (k > 23 + 41 .or. k < 1) error stop > + end do > + end do > + end do > + end do > + if (ll /=3D 29) error stop > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D 1, n,2 > + do j =3D 1, m > + do k =3D 1, i + 41 > + if (k > 11 + 41 .or. k < 1) error stop > + end do > + end do > + end do > +if (k /=3D 53) then > + print *, k, 53 > + error stop > +endif > > !$omp simd collapse(3) lastprivate(k) > do i =3D 1, n,2 > @@ -546,32 +543,32 @@ if (k /=3D 53) then > endif > > ! - Same but without 'private': > -!!$omp simd collapse(3) lastprivate(k) > -!do i =3D 1, n > -! do j =3D 1, m,2 > -! do k =3D 1, j + 41 > -! if (k > 23 + 41 .or. k < 1) error stop > -! end do > -! end do > -!end do > -!if (k /=3D 65) then > -! print *, k, 65 > -! error stop > -!endif > - > - > -!!$omp simd collapse(3) lastprivate(k) > -!do i =3D 1, n,2 > -! do j =3D 1, m > -! do k =3D 1, i + 41 > -! if (k > 11 + 41 .or. k < 1) error stop > -! end do > -! end do > -!end do > -!if (k /=3D 53) then > -! print *, k, 53 > -! error stop > -!endif > +!$omp simd collapse(3) lastprivate(k) > +do i =3D 1, n > + do j =3D 1, m,2 > + do k =3D 1, j + 41 > + if (k > 23 + 41 .or. k < 1) error stop > + end do > + end do > +end do > +if (k /=3D 65) then > + print *, k, 65 > + error stop > +endif > + > + > +!$omp simd collapse(3) lastprivate(k) > +do i =3D 1, n,2 > + do j =3D 1, m > + do k =3D 1, i + 41 > + if (k > 11 + 41 .or. k < 1) error stop > + end do > + end do > +end do > +if (k /=3D 53) then > + print *, k, 53 > + error stop > +endif > > !$omp simd collapse(3) lastprivate(k) > do i =3D 1, n,2 > @@ -601,32 +598,32 @@ if (k /=3D 53) then > endif > > ! - all with lastprivate > -!!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > -!do i =3D 1, n > -! do j =3D 1, m,2 > -! do k =3D 1, j + 41 > -! if (k > 23 + 41 .or. k < 1) error stop > -! end do > -! end do > -!end do > -!if (k /=3D 65) then > -! print *, k, 65 > -! error stop > -!endif > - > - > -!!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > -!do i =3D 1, n,2 > -! do j =3D 1, m > -! do k =3D 1, i + 41 > -! if (k > 11 + 41 .or. k < 1) error stop > -! end do > -! end do > -!end do > -!if (k /=3D 53) then > -! print *, k, 53 > -! error stop > -!endif > +!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > +do i =3D 1, n > + do j =3D 1, m,2 > + do k =3D 1, j + 41 > + if (k > 23 + 41 .or. k < 1) error stop > + end do > + end do > +end do > +if (k /=3D 65) then > + print *, k, 65 > + error stop > +endif > + > + > +!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > +do i =3D 1, n,2 > + do j =3D 1, m > + do k =3D 1, i + 41 > + if (k > 11 + 41 .or. k < 1) error stop > + end do > + end do > +end do > +if (k /=3D 53) then > + print *, k, 53 > + error stop > +endif > > !$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > do i =3D 1, n,2 > diff --git a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1a.f9= 0 b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1a.f90 > deleted file mode 100644 > index 77aa887942e..00000000000 > --- a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-1a.f90 > +++ /dev/null > @@ -1,374 +0,0 @@ > -! { dg-do compile } > -! { dg-additional-options "-msse2" { target sse2_runtime } } > -! { dg-additional-options "-mavx" { target avx_runtime } } > - > -! PR fortran/107424 > - > -! Nonrectangular loop nests checks > - > -! =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D > -! NOTE: The testcases are from non-rectangular-loop-1.f90, > -! but commented there. Feel free to remove this > -! file + uncomment them in non-rectangular-loop-1.f90 > -! Otherwise, you need to change it to 'dg-do run'! > -! =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D > - > -module m > - implicit none (type, external) > -contains > - > -! The 'k' loop uses i or j as start value > -! but a constant end value such that 'lastprivate' > -! should be well-defined > -subroutine lastprivate_check_simd_1 > - integer :: n,m,p, i,j,k > - > - n =3D 11 > - m =3D 23 > - p =3D 27 > - > - ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > - ! Then same, except use non-unit step for 'k' > - > - !$omp simd collapse(3) lastprivate(k) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp simd collapse(3) lastprivate(k) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same but 'private' for all (i,j) vars > - > - !$omp simd collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp simd collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same - but with lastprivate(i,j) > - > - !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > - !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 2 .or. j /=3D m + 1) error stop > - > -end subroutine lastprivate_check_simd_1 > - > - > -! Same but with do simd > -subroutine lastprivate_check_do_simd_1 > - integer :: n,m,p, i,j,k > - > - n =3D 11 > - m =3D 23 > - p =3D 27 > - > - ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > - ! Then same, except use non-unit step for 'k' > - > - !$omp parallel do simd collapse(3) lastprivate(k) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp parallel do simd collapse(3) lastprivate(k) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same but 'private' for all (i,j) vars > - > - !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp parallel do simd collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same - but with lastprivate(i,j) > - > - !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > - !$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 2 .or. j /=3D m + 1) error stop > - > -end subroutine lastprivate_check_do_simd_1 > - > - > - > -! Same but with do > -subroutine lastprivate_check_do_1 > - integer :: n,m,p, i,j,k > - > - n =3D 11 > - m =3D 23 > - p =3D 27 > - > - ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > - ! Then same, except use non-unit step for 'k' > - > - !$omp parallel do collapse(3) lastprivate(k) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp parallel do collapse(3) lastprivate(k) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same but 'private' for all (i,j) vars > - > - !$omp parallel do collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - !$omp parallel do collapse(3) lastprivate(k) private(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - > - ! Same - but with lastprivate(i,j) > - > - !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n > - do j =3D 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D j - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 1 .or. j /=3D m + 2) error stop > - > - !$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j) > - do i =3D 1, n, 2 ! { dg-message "sorry, unimplemented: non-rectangula= r loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D i - 41, p ! { dg-note "Used here" } > - if (k < 1 - 41 .or. k > p) error stop > - end do > - end do > - end do > - if (k /=3D p + 1) error stop > - if (i /=3D n + 2 .or. j /=3D m + 1) error stop > - > -end subroutine lastprivate_check_do_1 > - > - > - > -subroutine lastprivate_check_2 > - integer :: n,m,p, i,j,k,ll > - > - n =3D 11 > - m =3D 23 > - p =3D 27 > - > - !$omp parallel do simd collapse(3) lastprivate(p) > - do i =3D 1, n > - do j =3D 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangul= ar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D 1, j + 41 ! { dg-note "Used here" } > - do ll =3D 1, p, 2 > - if (k > 23 + 41 .or. k < 1) error stop > - end do > - end do > - end do > - end do > - if (ll /=3D 29) error stop > - > - !$omp simd collapse(3) lastprivate(p) > - do i =3D 1, n > - do j =3D 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangul= ar loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D 1, j + 41 ! { dg-note "Used here" } > - do ll =3D 1, p, 2 > - if (k > 23 + 41 .or. k < 1) error stop > - end do > - end do > - end do > - end do > - if (ll /=3D 29) error stop > - > - !$omp simd collapse(3) lastprivate(k) > - do i =3D 1, n,2 ! { dg-message "sorry, unimplemented: non-rectangular= loop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D 1, i + 41 ! { dg-note "Used here" } > - if (k > 11 + 41 .or. k < 1) error stop > - end do > - end do > - end do > -if (k /=3D 53) then > - print *, k, 53 > - error stop > -endif > - > -! - Same but without 'private': > -!$omp simd collapse(3) lastprivate(k) > -do i =3D 1, n > - do j =3D 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangular= loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D 1, j + 41 ! { dg-note "Used here" } > - if (k > 23 + 41 .or. k < 1) error stop > - end do > - end do > -end do > -if (k /=3D 65) then > - print *, k, 65 > - error stop > -endif > - > - > -!$omp simd collapse(3) lastprivate(k) > -do i =3D 1, n,2 ! { dg-message "sorry, unimplemented: non-rectangular l= oop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D 1, i + 41 ! { dg-note "Used here" } > - if (k > 11 + 41 .or. k < 1) error stop > - end do > - end do > -end do > -if (k /=3D 53) then > - print *, k, 53 > - error stop > -endif > - > -! - all with lastprivate > -!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > -do i =3D 1, n > - do j =3D 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangular= loop nest with step other than constant 1 or -1 for 'j'" } > - do k =3D 1, j + 41 ! { dg-note "Used here" } > - if (k > 23 + 41 .or. k < 1) error stop > - end do > - end do > -end do > -if (k /=3D 65) then > - print *, k, 65 > - error stop > -endif > - > - > -!$omp simd collapse(3) lastprivate(k) lastprivate(i, j) > -do i =3D 1, n,2 ! { dg-message "sorry, unimplemented: non-rectangular l= oop nest with step other than constant 1 or -1 for 'i'" } > - do j =3D 1, m > - do k =3D 1, i + 41 ! { dg-note "Used here" } > - if (k > 11 + 41 .or. k < 1) error stop > - end do > - end do > -end do > -if (k /=3D 53) then > - print *, k, 53 > - error stop > -endif > - > -end > -end module m > - > -program main > - use m > - implicit none (type, external) > - call lastprivate_check_simd_1 > - call lastprivate_check_do_simd_1 > - call lastprivate_check_do_1 > - call lastprivate_check_2 > -end > diff --git a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-5.f90= b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-5.f90 > index 643ab796a84..0e251f263c8 100644 > --- a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-5.f90 > +++ b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-5.f90 > @@ -2,27 +2,41 @@ > ! { dg-additional-options "-msse2" { target sse2_runtime } } > ! { dg-additional-options "-mavx" { target avx_runtime } } > > -! PR fortran/107424 > +! PR fortran/107424 - original PR > +! PR fortran/110735 - PR to implement the feature below > > ! Nonrectangular loop nests checks > > +integer :: step > +step =3D -1 > !$omp simd collapse(2) > do i =3D 1, 10 > - do j =3D i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangul= ar loop nest with step other than constant 1 or -1 for 'j'" } > + do j =3D i, 10, step ! { dg-message "sorry, unimplemented: non-rectan= gular loop nest with non-constant step for 'j'" } > end do > end do > > +step =3D 3 > !$omp do collapse(2) lastprivate(j) ! { dg-error "lastprivate variable = 'j' is private in outer context" } > do i =3D 1, 10 > - do j =3D i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangul= ar loop nest with step other than constant 1 or -1 for 'j'" } > + do j =3D i, 10, step ! { dg-message "sorry, unimplemented: non-rectan= gular loop nest with non-constant step for 'j'" } > end do > end do > if (i /=3D 11) stop 1 > > +step =3D -5 > !$omp simd collapse(2) lastprivate(j) > do i =3D 1, 10 > - do j =3D i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangul= ar loop nest with step other than constant 1 or -1 for 'j'" } > + do j =3D i, 10, step ! { dg-message "sorry, unimplemented: non-rectan= gular loop nest with non-constant step for 'j'" } > end do > end do > if (i /=3D 11) stop 1 > + > +step =3D -5 > +!$omp simd collapse(2) > +do i =3D 1, 10, step ! { dg-message "sorry, unimplemented: non-rectangu= lar loop nest with non-constant step for 'i'" } > + do j =3D i, i ! { dg-note "Used here" } > + end do > +end do > +if (i /=3D 11) stop 1 > + > end > diff --git a/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-6.f90= b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-6.f90 > new file mode 100644 > index 00000000000..ae885af9623 > --- /dev/null > +++ b/libgomp/testsuite/libgomp.fortran/non-rectangular-loop-6.f90 > @@ -0,0 +1,196 @@ > +! { dg-do run } > +! { dg-additional-options "-msse2" { target sse2_runtime } } > +! { dg-additional-options "-mavx" { target avx_runtime } } > + > +! PR fortran/107424 > + > +! Nonrectangular loop nests checks > +! This testcase uses negative step sizes > + > +module m > + implicit none (type, external) > +contains > + > +! The 'k' loop uses i or j as start value > +! but a constant end value such that 'lastprivate' > +! should be well-defined > +subroutine lastprivate_check_simd_1 > + integer :: n,m,p, i,j,k, one > + > + n =3D 11 > + m =3D 23 > + p =3D 27 > + one =3D 1 > + > + ! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops > + ! Then same, except use non-unit step for 'k' > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p + j, p - 41, -1 > + if (k < p - 41 .or. k > p+m) error stop > + end do > + end do > + end do > + if (k /=3D p - 41 - 1) error stop > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D n, 1, -2 > + do j =3D m, 1, -1 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D n, one, -2 > + do j =3D m, one, -1 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) then > + ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p= )" > + error stop > + end if > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + k =3D -43 > + m =3D 0 > + !$omp simd collapse(3) lastprivate(k) > + do i =3D m, one, -2 > + do j =3D m, one, -1 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) then > + ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p= )" > + error stop > + end if > + end do > + end do > + end do > + if (k /=3D -43) error stop > + > + m =3D 23 > + > + !$omp simd collapse(3) lastprivate(k) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + n =3D -5 > + k =3D - 70 > + !$omp simd collapse(3) lastprivate(k) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -70) error stop > + > + n =3D 11 > + > + ! Same but 'private' for all (i,j) vars > + > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D n, one, -2 > + do j =3D m, one, -1 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D n, one, -2 > + do j =3D m, one, -1 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + !$omp simd collapse(3) lastprivate(k) private(i,j) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + > + ! Same - but with lastprivate(i,j) > + > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + if (i /=3D 0 .or. j /=3D -1) error stop > + > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D n, 1, -2 > + do j =3D m, one, -1 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + if (i /=3D -1 .or. j /=3D 0) error stop > + > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D n, 1, -2 > + do j =3D m, 1, -1 > + do k =3D p, j - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + if (i /=3D -1 .or. j /=3D 0) error stop > + > + !$omp simd collapse(3) lastprivate(k) lastprivate(i,j) > + do i =3D n, one, -1 > + do j =3D m, one, -2 > + do k =3D p, i - 41, -1 > + if (k < 1 - 41 .or. k > p) error stop > + end do > + end do > + end do > + if (k /=3D -41) error stop > + if (i /=3D 0 .or. j /=3D -1) error stop > +end subroutine lastprivate_check_simd_1 > +end module m > + > +program main > + use m > + implicit none (type, external) > + call lastprivate_check_simd_1 > +end ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955