[gcc/devel/omp/gcc-11] Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695]
Sandra Loosemore
sandra@gcc.gnu.org
Sun Jan 23 20:57:26 GMT 2022
https://gcc.gnu.org/g:8dd63b832feaa0b1c213fe2debd3412dedc81894
commit 8dd63b832feaa0b1c213fe2debd3412dedc81894
Author: Sandra Loosemore <sandra@codesourcery.com>
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-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.
Diff:
---
gcc/fortran/ChangeLog.omp | 17 +++++++++++++++++
gcc/fortran/dump-parse-tree.c | 4 ++--
gcc/fortran/gfortran.h | 3 +++
gcc/fortran/openmp.c | 6 +++---
gcc/fortran/trans-decl.c | 3 +++
gcc/fortran/trans-openmp.c | 2 +-
gcc/testsuite/ChangeLog.omp | 13 +++++++++++++
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 ++++++++++++++++++
10 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index d909d6e3ddf..ff5d774d17d 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -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.
diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index d99a5170553..03e69c9f91d 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -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);
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 7046c257cc4..6285505875d 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -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;
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 50264ffc8a3..0a30da39828 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -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);
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 5a9754007b5..f495f4a9e9e 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -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);
}
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index ea16e27ff39..e4e116e3959 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 3be99da018d..391c0d20791 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -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
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
More information about the Gcc-cvs
mailing list