]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695]
authorSandra Loosemore <sandra@codesourcery.com>
Wed, 19 Jan 2022 20:50:49 +0000 (12:50 -0800)
committerSandra Loosemore <sandra@codesourcery.com>
Sun, 23 Jan 2022 20:49:34 +0000 (12:49 -0800)
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-23  Sandra Loosemore  <sandra@codesourcery.com>

PR fortran/103695
PR fortran/102621

Backport from mainline:

2022-01-20  Sandra Loosemore  <sandra@codesourcery.com>

gcc/fortran
* gfortran.h (struct gfc_namespace) Add omp_affinity_iterator
field.
* dump-parse-tree.c (show_iterator): Use it.
* openmp.c (gfc_match_iterator): Likewise.
(resolve_omp_clauses): Likewise.
* trans-decl.c (gfc_finish_var_decl): Likewise.
* trans-openmp.c (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.

gcc/fortran/ChangeLog.omp
gcc/fortran/dump-parse-tree.c
gcc/fortran/gfortran.h
gcc/fortran/openmp.c
gcc/fortran/trans-decl.c
gcc/fortran/trans-openmp.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/gfortran.dg/gomp/affinity-clause-3.f90
gcc/testsuite/gfortran.dg/gomp/pr102621.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/pr103695.f90 [new file with mode: 0644]

index d909d6e3ddfb8f2efbf11078c7c603bfbb08e25c..ff5d774d17dbd7c1e1e4a318454682759563abd0 100644 (file)
@@ -1,3 +1,20 @@
+2022-01-23  Sandra Loosemore  <sandra@codesourcery.com>
+
+       PR fortran/103695
+       PR fortran/102621
+
+       Backport from mainline:
+
+       2022-01-20  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * gfortran.h (struct gfc_namespace) Add omp_affinity_iterator
+       field.
+       * dump-parse-tree.c (show_iterator): Use it.
+       * openmp.c (gfc_match_iterator): Likewise.
+       (resolve_omp_clauses): Likewise.
+       * trans-decl.c (gfc_finish_var_decl): Likewise.
+       * trans-openmp.c (handle_iterator): Likewise.
+
 2021-12-22  Andrew Stubbs  <ams@codesourcery.com>
 
        * openmp.c (gfc_match_omp_requires): Don't "sorry" dynamic_allocators.
index d99a51705539717eb2658cc893ac81591b38fdc6..03e69c9f91d266da2e3d8d1767ab8bef36c00730 100644 (file)
@@ -1300,10 +1300,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);
index 7046c257cc435b329d1216b2a02d74dca0da146f..6285505875d58097296635e51798c6051b24ce5d 100644 (file)
@@ -2101,6 +2101,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;
 
index 50264ffc8a3ba2b4e6c61275ad689296879c79a2..0a30da39828fbf2edeec6c4559445d2d0b86ef1a 100644 (file)
@@ -1119,7 +1119,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;
@@ -6632,8 +6632,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);
index 5a9754007b5e5db045193ca9fa6201a1daacfb86..f495f4a9e9e269465fb10ea27d23d1a3a9af95ce 100644 (file)
@@ -648,6 +648,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);
     }
index ea16e27ff39e78874005d7e8a521b128f7f9dda7..e4e116e39598ccb91aeb790746079636da3063d7 100644 (file)
@@ -2498,7 +2498,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;
index 3be99da018d905bb35a17430970e4098b4e17a5d..391c0d207913cd11dc4179cb98279fd5a54045c4 100644 (file)
@@ -1,3 +1,16 @@
+2022-01-23  Sandra Loosemore  <sandra@codesourcery.com>
+
+       PR fortran/103695
+       PR fortran/102621
+
+       Backport from mainline:
+
+       2022-01-20  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * gfortran.dg/gomp/affinity-clause-3.f90: Adjust pattern.
+       * gfortran.dg/gomp/pr102621.f90: New.
+       * gfortran.dg/gomp/pr103695.f90: New.
+
 2021-12-22  Andrew Stubbs  <ams@codesourcery.com>
 
        * gfortran.dg/gomp/requires-8.f90: Reinstate dynamic allocators
index 3fd39fe6b8be363d74e318aa603ec8bddb8c9752..eebe4dddafcfa31085d514abdbf547974d0ece7b 100644 (file)
@@ -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 (file)
index 0000000..ca1e2d4
--- /dev/null
@@ -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 (file)
index 0000000..cc9764e
--- /dev/null
@@ -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