From: Sandra Loosemore Date: Wed, 19 Jan 2022 20:50:49 +0000 (-0800) Subject: Fortran: Fix scope for OMP AFFINITY clause iterator variables [PR103695] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dd63b832feaa0b1c213fe2debd3412dedc81894;p=thirdparty%2Fgcc.git 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 PR fortran/103695 PR fortran/102621 Backport from mainline: 2022-01-20 Sandra Loosemore 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 --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index d909d6e3ddfb..ff5d774d17db 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,20 @@ +2022-01-23 Sandra Loosemore + + PR fortran/103695 + PR fortran/102621 + + Backport from mainline: + + 2022-01-20 Sandra Loosemore + + * 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 * 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 d99a51705539..03e69c9f91d2 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 7046c257cc43..6285505875d5 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 50264ffc8a3b..0a30da39828f 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 5a9754007b5e..f495f4a9e9e2 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 ea16e27ff39e..e4e116e39598 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 3be99da018d9..391c0d207913 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,16 @@ +2022-01-23 Sandra Loosemore + + PR fortran/103695 + PR fortran/102621 + + Backport from mainline: + + 2022-01-20 Sandra Loosemore + + * 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 * 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 3fd39fe6b8be..eebe4dddafcf 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 000000000000..ca1e2d44d20b --- /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 000000000000..cc9764e07a56 --- /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