From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id E2B26385803C; Fri, 12 Feb 2021 15:47:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E2B26385803C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Julian_Brown@mentor.com IronPort-SDR: SJNaAdJzFMaj1uJtANTrlclfSc6+N0R7HmThfwccG835ke9uqPuWq6djOOxbgOiDpP973WZaS7 ++NgLEz0utiAL/Hz0UENFrJqsBqpo+w/7Nct8arytcjauDFWWWSHynj5HnO6roEWuXe9Qoeimw Pt+Bb3cVT8f8J2xpK1kfiJEuophQvqB8ubjCYGow4HGlCV2Ew87MAWF31lkQxbhzLmEpHgAOBv vg7wIktyirCbOWuYEPfycMDT/2GH8SOH7YSrTVgspoq5/pV/pTT1yECrrALYdtVGhMzNxASvFw KyA= X-IronPort-AV: E=Sophos;i="5.81,174,1610438400"; d="scan'208";a="60365606" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 12 Feb 2021 07:47:09 -0800 IronPort-SDR: +lYINU+/1JwCiGo119btYDzAn+AOjjymzzBWwciOaIgTfog3qP7ggVYGl0nIxBPojZnp7lsfNl 2gqO9WTz6oOiMRIodfm0CcSW0b81rdpd8kgh1KlIYeOHufvvC1eq5FiH5FYQPoHUtdcIeEENRZ LSx9uyMQLHdSaJDn2Ae3SBvOurR9nwEIUyrRO5KJTJY6y1eUtPPmp1ZOjaemfF3K8KWIk7153r fRujham6Mxri/nSOgZSO0GHlTIAZB1buAAYl3s3HkzQP2fFUbyUzo30gOKVXbAP/8urBalBEwc YBg= From: Julian Brown To: CC: , Jakub Jelinek , Tobias Burnus , Thomas Schwinge Subject: [PATCH 2/2] openacc: Strided array sections and components of derived-type arrays Date: Fri, 12 Feb 2021 07:46:49 -0800 Message-ID: <20210212154649.96393-3-julian@codesourcery.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210212154649.96393-1-julian@codesourcery.com> References: <20210212154649.96393-1-julian@codesourcery.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-06.mgc.mentorg.com (139.181.222.6) To SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Feb 2021 15:47:13 -0000 This patch disallows selecting components of array sections in update directives for OpenACC, as specified in OpenACC 3.0, "2.14.4. Update Directive", "Restrictions": "In Fortran, members of variables of derived type may appear, including a subarray of a member. Members of subarrays of derived type may not appear." The diagnostic for attempting to use the same construct on other directives has also been improved. OK for mainline? Thanks, Julian gcc/fortran/ * openmp.c (resolve_omp_clauses): Disallow selecting components of arrays of derived type. gcc/testsuite/ * gfortran.dg/goacc/array-with-dt-2.f90: Remove expected errors. * gfortran.dg/goacc/array-with-dt-6.f90: New test. * gfortran.dg/goacc/mapping-tests-2.f90: Update expected error. libgomp/ * testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90: Remove expected errors. --- gcc/fortran/openmp.c | 55 +++++++++++-------- .../gfortran.dg/goacc/array-with-dt-2.f90 | 5 +- .../gfortran.dg/goacc/array-with-dt-6.f90 | 10 ++++ .../gfortran.dg/goacc/mapping-tests-2.f90 | 4 +- .../array-stride-dt-1.f90 | 5 +- 5 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/goacc/array-with-dt-6.f90 diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index aab17f0589f..9bcb1bf62ca 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5174,17 +5174,29 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, "are allowed on ORDERED directive at %L", &n->where); } - gfc_ref *array_ref = NULL; + gfc_ref *lastref = NULL, *lastslice = NULL; bool resolved = false; if (n->expr) { - array_ref = n->expr->ref; + lastref = n->expr->ref; resolved = gfc_resolve_expr (n->expr); /* Look through component refs to find last array reference. */ if (resolved) { + for (gfc_ref *ref = n->expr->ref; ref; ref = ref->next) + if (ref->type == REF_COMPONENT) + lastref = ref; + else if (ref->type == REF_ARRAY) + { + for (int i = 0; i < ref->u.ar.dimen; i++) + if (ref->u.ar.dimen_type[i] == DIMEN_RANGE) + lastslice = ref; + + lastref = ref; + } + /* The "!$acc cache" directive allows rectangular subarrays to be specified, with some restrictions on the form of bounds (not implemented). @@ -5192,45 +5204,42 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, array isn't contiguous. An expression such as arr(-n:n,-n:n) could be contiguous even if it looks like it may not be. */ - if (list != OMP_LIST_CACHE + if (code->op != EXEC_OACC_UPDATE + && list != OMP_LIST_CACHE && list != OMP_LIST_DEPEND && !gfc_is_simply_contiguous (n->expr, false, true) - && gfc_is_not_contiguous (n->expr)) + && gfc_is_not_contiguous (n->expr) + && !(lastslice + && (lastslice->next + || lastslice->type != REF_ARRAY))) gfc_error ("Array is not contiguous at %L", &n->where); - - while (array_ref - && (array_ref->type == REF_COMPONENT - || (array_ref->type == REF_ARRAY - && array_ref->next - && (array_ref->next->type - == REF_COMPONENT)))) - array_ref = array_ref->next; } } - if (array_ref + if (lastref || (n->expr && (!resolved || n->expr->expr_type != EXPR_VARIABLE))) { - if (array_ref - && (array_ref->type == REF_SUBSTRING - || (array_ref->next - && array_ref->next->type == REF_SUBSTRING))) + if (lastref + && (lastref->type == REF_SUBSTRING + || (lastref->next + && lastref->next->type == REF_SUBSTRING))) gfc_error ("Unexpected substring reference in %s clause " "at %L", name, &n->where); else if (!resolved - || n->expr->expr_type != EXPR_VARIABLE - || array_ref->next - || array_ref->type != REF_ARRAY) + || n->expr->expr_type != EXPR_VARIABLE + || (lastslice + && (lastslice->next + || lastslice->type != REF_ARRAY))) gfc_error ("%qs in %s clause at %L is not a proper " "array section", n->sym->name, name, &n->where); - else + else if (lastslice) { int i; - gfc_array_ref *ar = &array_ref->u.ar; + gfc_array_ref *ar = &lastslice->u.ar; for (i = 0; i < ar->dimen; i++) - if (ar->stride[i]) + if (ar->stride[i] && code->op != EXEC_OACC_UPDATE) { gfc_error ("Stride should not be specified for " "array section in %s clause at %L", diff --git a/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 index e4a6f319772..807580d75a9 100644 --- a/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 @@ -4,8 +4,7 @@ end type t type(t), allocatable :: b(:) -! TODO: Remove expected errors when this is supported. -!$acc update host(b(::2)) ! { dg-error "Stride should not be specified for array section in MAP clause" } -!$acc update host(b(1)%A(::3,::4)) ! { dg-error "Stride should not be specified for array section in MAP clause" } +!$acc update host(b(::2)) +!$acc update host(b(1)%A(::3,::4)) end diff --git a/gcc/testsuite/gfortran.dg/goacc/array-with-dt-6.f90 b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-6.f90 new file mode 100644 index 00000000000..adac8e3945e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-6.f90 @@ -0,0 +1,10 @@ +type t + integer :: i, j +end type t +type t2 + type(t) :: b(4) +end type +type(t2) :: var(10) +!$acc update host(var(3)%b(:)%j) ! { dg-error "not a proper array section" } +!$acc update host(var(3)%b%j) ! { dg-error "not a proper array section" } +end diff --git a/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90 b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90 index 1372f6af53e..6b414fb8524 100644 --- a/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90 @@ -24,9 +24,9 @@ subroutine foo ! Bad - we cannot do a strided access of 'x' ! No C/C++ equivalent !$acc enter data copyin(y(:)%i) -! { dg-error "Array is not contiguous" "" { target "*-*-*" } 26 } +! { dg-error "not a proper array section" "" { target "*-*-*" } 26 } ! Bad - again, a strided access !$acc enter data copyin(z(1)%cc(:)%i) -! { dg-error "Array is not contiguous" "" { target "*-*-*" } 30 } +! { dg-error "not a proper array section" "" { target "*-*-*" } 30 } end diff --git a/libgomp/testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90 index 61250708197..f04d76d583a 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90 @@ -24,9 +24,8 @@ end do b(1)%A(:,:) = 5 -! TODO: Remove expected errors once this is supported. -!$acc update device(b(::2)) ! { dg-error "Stride should not be specified for array section in MAP clause" } -!$acc update device(b(1)%A(::3,::4)) ! { dg-error "Stride should not be specified for array section in MAP clause" } +!$acc update device(b(::2)) +!$acc update device(b(1)%A(::3,::4)) do i=1,20 !$acc exit data copyout(b(i)%A) -- 2.29.2