public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6780] Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695]
@ 2022-01-20 21:30 Sandra Loosemore
  0 siblings, 0 replies; only message in thread
From: Sandra Loosemore @ 2022-01-20 21:30 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d2ad748eeef0dd260f3993b8dcbffbded3240a0a

commit r12-6780-gd2ad748eeef0dd260f3993b8dcbffbded3240a0a
Author: Sandra Loosemore <sandra@codesourcery.com>
Date:   Thu Jan 20 13:29:48 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-20  Sandra Loosemore  <sandra@codesourcery.com>
    
            PR fortran/103695
            PR fortran/102621
    
            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/pr102621.f90: New.
            * gfortran.dg/gomp/pr103695.f90: New.

Diff:
---
 gcc/fortran/dump-parse-tree.cc                       |  4 ++--
 gcc/fortran/gfortran.h                               |  3 +++
 gcc/fortran/openmp.cc                                |  6 +++---
 gcc/fortran/trans-decl.cc                            |  3 +++
 gcc/fortran/trans-openmp.cc                          |  2 +-
 gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90 |  2 +-
 gcc/testsuite/gfortran.dg/gomp/pr102621.f90          | 12 ++++++++++++
 gcc/testsuite/gfortran.dg/gomp/pr103695.f90          | 18 ++++++++++++++++++
 8 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc
index a618ae20d30..3112caec053 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 00a558ac90e..993879feda4 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 9b73b9fdfe0..073e5a16da5 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 1112ca95d08..6493cc2f6b1 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 9eabf68a93d..d5a6b2d6ee3 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 3fd39fe6b8b..eebe4dddafc 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/pr102621.f90 b/gcc/testsuite/gfortran.dg/gomp/pr102621.f90
new file mode 100644
index 00000000000..ca1e2d44d20
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/pr102621.f90
@@ -0,0 +1,12 @@
+! This program used to ICE in convert_nonlocal_reference_op due to
+! incorrect scoping of AFFINITY clause iterator variables.
+
+program p
+   integer :: a(8)
+   !$omp task affinity (iterator(j=1:8) : a(j))
+   !$omp end task
+contains
+   integer function f(x)
+      class(*) :: x
+   end
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr103695.f90 b/gcc/testsuite/gfortran.dg/gomp/pr103695.f90
new file mode 100644
index 00000000000..cc9764e07a5
--- /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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-20 21:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-20 21:30 [gcc r12-6780] Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695] Sandra Loosemore

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).