From patchwork Wed Jan 19 21:53:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sandra Loosemore X-Patchwork-Id: 50251 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 47531385AC0A for ; Wed, 19 Jan 2022 21:53:55 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id F2850385841D; Wed, 19 Jan 2022 21:53:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org F2850385841D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com IronPort-SDR: US7cHSqeL9hay7e6CmFx1Vt6HbognNGcsbmzOYnAZZ3qpvjOUGlrEQMjANrRbZTHqRUgIKfYpc GkyC+m4kffE9/8YhGOaUA/2WPIQ+SxZLfiM4bHfPHswiHyKuHJJWDEiOxxjhq57jNXyu7Z6QGY 1jai1DqXPiA9GeE9SXEWt0MVKwQbRpUmLRochURp6Ajim9l3yASsYjZKIiadK90fgt8SE6m4GG grW8r5sX1/2d1e7e9EJ8UBh3OnZqXJuKNj56ca/LnSAO8nm2VkYLOcCmELpnqeA8DVzrGfeT+3 aev0mtbwdbhwTlpo8hNMMVV/ X-IronPort-AV: E=Sophos;i="5.88,300,1635235200"; d="scan'208";a="70960029" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 19 Jan 2022 13:53:36 -0800 IronPort-SDR: 3RSK+kAIh+RViEmIBvl2J45IZrDr6HSgCYO/SPihH6zOeEgGFsXM6nkDEql9orEbei7JoJzNt1 8UemvBziJZelv/t1pbxaER7/9KtcueQFyGr1RTEo9KwITz0HlHGKW80eDLOE015crkb7hZEVQ8 ErtO7Odz91fMUMNwXDP+G+Ov6GlbVMh1y908YtqImZrnwWyIqmLzuRV90XpAZv9pyMugXdD7dB krLSldFjO8kgd9VKjDWKCJG4OxHmY/Ghjsq/pEFaQzwdBaiJyqZzt68C9EQA4P3sIFbEBcKGHV Iuw= To: "fortran@gcc.gnu.org" From: Sandra Loosemore Subject: [PATCH] Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695] Message-ID: Date: Wed, 19 Jan 2022 14:53:33 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 Content-Language: en-US X-ClientProxiedBy: svr-orw-mbx-08.mgc.mentorg.com (147.34.90.208) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) X-Spam-Status: No, score=-10.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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "gcc-patches@gcc.gnu.org" Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This patch is for PR103695, marked as a P1 regression. OK to check in? -Sandra commit 21f8ac540b73e3838b63924e3c7e6c2ad25568ee Author: Sandra Loosemore Date: Wed Jan 19 12:50:49 2022 -0800 Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695] gfc_finish_var_decl was confused by the undocumented overloading of the proc_name field in struct gfc_namespace to contain iterator variables for the OpenMP AFFINITY clause, causing it to insert the decls in the wrong scope. This patch adds a new distinct field to hold these variables. 2022-01-19 Sandra Loosemore PR fortran/103695 gcc/fortran * gfortran.h (struct gfc_namespace) Add omp_affinity_iterator field. * dump-parse-tree.cc (show_iterator): Use it. * openmp.cc (gfc_match_iterator): Likewise. (resolve_omp_clauses): Likewise. * trans-decl.cc (gfc_finish_var_decl): Likewise. * trans-openmp.cc (handle_iterator): Likewise. gcc/testsuite/ * gfortran.dg/gomp/affinity-clause-3.f90: Adjust pattern. * gfortran.dg/gomp/pr103695.f90: New. diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc index a618ae2..3112cae 100644 --- a/gcc/fortran/dump-parse-tree.cc +++ b/gcc/fortran/dump-parse-tree.cc @@ -1302,10 +1302,10 @@ show_code (int level, gfc_code *c) static void show_iterator (gfc_namespace *ns) { - for (gfc_symbol *sym = ns->proc_name; sym; sym = sym->tlink) + for (gfc_symbol *sym = ns->omp_affinity_iterators; sym; sym = sym->tlink) { gfc_constructor *c; - if (sym != ns->proc_name) + if (sym != ns->omp_affinity_iterators) fputc (',', dumpfile); fputs (sym->name, dumpfile); fputc ('=', dumpfile); diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 00a558a..993879f 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -2107,6 +2107,9 @@ typedef struct gfc_namespace /* !$ACC ROUTINE clauses. */ gfc_omp_clauses *oacc_routine_clauses; + /* !$ACC TASK AFFINITY iterator symbols. */ + gfc_symbol *omp_affinity_iterators; + /* !$ACC ROUTINE names. */ gfc_oacc_routine_name *oacc_routine_names; diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 9b73b9f..073e5a1 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -1123,7 +1123,7 @@ gfc_match_iterator (gfc_namespace **ns, bool permit_var) if (last) last->tlink = sym; else - (*ns)->proc_name = sym; + (*ns)->omp_affinity_iterators = sym; last = sym; sym->declared_at = prev_loc; sym->ts = ts; @@ -6832,8 +6832,8 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, && n->u2.ns && !n->u2.ns->resolved) { n->u2.ns->resolved = 1; - for (gfc_symbol *sym = n->u2.ns->proc_name; sym; - sym = sym->tlink) + for (gfc_symbol *sym = n->u2.ns->omp_affinity_iterators; + sym; sym = sym->tlink) { gfc_constructor *c; c = gfc_constructor_first (sym->value->value.constructor); diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index 1112ca9..6493cc2 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -647,6 +647,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) && sym->ns->proc_name->attr.flavor == FL_LABEL) /* This is a BLOCK construct. */ add_decl_as_local (decl); + else if (sym->ns->omp_affinity_iterators) + /* This is a block-local iterator. */ + add_decl_as_local (decl); else gfc_add_decl_to_parent_function (decl); } diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 9eabf68..d5a6b2d 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -2483,7 +2483,7 @@ static tree handle_iterator (gfc_namespace *ns, stmtblock_t *iter_block, tree block) { tree list = NULL_TREE; - for (gfc_symbol *sym = ns->proc_name; sym; sym = sym->tlink) + for (gfc_symbol *sym = ns->omp_affinity_iterators; sym; sym = sym->tlink) { gfc_constructor *c; gfc_se se; diff --git a/gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90 b/gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90 index 3fd39fe..eebe4dd 100644 --- a/gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90 @@ -11,4 +11,4 @@ subroutine foo !$omp end task end ! { dg-final { scan-tree-dump-times "= ibar \\(&C\\." 3 "gimple" } } -! { dg-final { scan-tree-dump-times "= ibar \\(j\\." 1 "gimple" } } +! { dg-final { scan-tree-dump-times "= ibar \\(&j" 1 "gimple" } } diff --git a/gcc/testsuite/gfortran.dg/gomp/pr103695.f90 b/gcc/testsuite/gfortran.dg/gomp/pr103695.f90 new file mode 100644 index 0000000..cc9764e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr103695.f90 @@ -0,0 +1,18 @@ +! This test case used to ICE in verify_ssa due to the iterator variable j +! incorrectly being inserted into program scope. + +program p + integer :: i + do i = 1, 3 + call sub (s(i)) + end do +contains + function s(n) result(z) + integer, target, intent(in) :: n + integer, pointer :: z + integer :: a(8), b(8), c(8) + !$omp task affinity (iterator(j=1:8) : a(j), b(j), c(j)) + !$omp end task + z => n + end +end