[PATCH] [gfortran] Add support for allocate clause (OpenMP 5.0).
Hafiz Abid Qadeer
abid_qadeer@mentor.com
Thu Nov 18 19:30:36 GMT 2021
On 02/11/2021 16:27, Jakub Jelinek wrote:
> On Fri, Oct 22, 2021 at 02:05:02PM +0100, Hafiz Abid Qadeer wrote:
>> This patch adds support for OpenMP 5.0 allocate clause for fortran. It does not
>> yet support the allocator-modifier as specified in OpenMP 5.1. The allocate
>> clause is already supported in C/C++.
>>
>> gcc/fortran/ChangeLog:
>>
>> * dump-parse-tree.c (show_omp_clauses): Handle OMP_LIST_ALLOCATE.
>> * gfortran.h (OMP_LIST_ALLOCATE): New enum value.
>> (allocate): New member in gfc_symbol.
>> * openmp.c (enum omp_mask1): Add OMP_CLAUSE_ALLOCATE.
>> (gfc_match_omp_clauses): Handle OMP_CLAUSE_ALLOCATE
>
> Missing . at the end.
Done.
>
>> (OMP_PARALLEL_CLAUSES, OMP_DO_CLAUSES, OMP_SECTIONS_CLAUSES)
>> (OMP_TASK_CLAUSES, OMP_TASKLOOP_CLAUSES, OMP_TARGET_CLAUSES)
>> (OMP_TEAMS_CLAUSES, OMP_DISTRIBUTE_CLAUSES)
>> (OMP_SINGLE_CLAUSES): Add OMP_CLAUSE_ALLOCATE.
>> (OMP_TASKGROUP_CLAUSES): New
>
> Likewise.
Done.
>
>> (gfc_match_omp_taskgroup): Use 'OMP_TASKGROUP_CLAUSES' instead of
>> 'OMP_CLAUSE_TASK_REDUCTION'
>
> Likewise. Please also drop the ' characters.
Done.
>
>> @@ -1880,6 +1881,10 @@ typedef struct gfc_symbol
>> according to the Fortran standard. */
>> unsigned pass_as_value:1;
>>
>> + /* Used to check if a variable used in allocate clause has also been
>> + used in privatization clause. */
>> + unsigned allocate:1;
>
> I think it would be desirable to use omp_allocate here instead
> of allocate and mention OpenMP in the comment too.
> Fortran has allocate statement in the language, so not pointing to
> OpenMP would only cause confusion.
Done.
>
>> @@ -1540,6 +1541,40 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
>> }
>> continue;
>> }
>> + if ((mask & OMP_CLAUSE_ALLOCATE)
>> + && gfc_match ("allocate ( ") == MATCH_YES)
>> + {
>> + gfc_expr *allocator = NULL;
>> + old_loc = gfc_current_locus;
>> + m = gfc_match_expr (&allocator);
>> + if (m != MATCH_YES)
>> + {
>> + gfc_error ("Expected allocator or variable list at %C");
>> + goto error;
>> + }
>> + if (gfc_match (" : ") != MATCH_YES)
>> + {
>> + /* If no ":" then there is no allocator, we backtrack
>> + and read the variable list. */
>> + allocator = NULL;
>
> Isn't this a memory leak? I believe Fortran FE expressions are not GC
> allocated...
> So, shouldn't there be gfc_free_expr or something similar before clearing it?
Done. Also added a call to gfc_free_expr at the end to free it as n->expr points
to a copy.
>
>> + /* Check for 2 things here.
>> + 1. There is no duplication of variable in allocate clause.
>> + 2. Variable in allocate clause are also present in some
>> + privatization clase. */
>> + for (n = omp_clauses->lists[OMP_LIST_ALLOCATE]; n; n = n->next)
>> + n->sym->allocate = 0;
>> +
>> + gfc_omp_namelist *prev = NULL;
>> + for (n = omp_clauses->lists[OMP_LIST_ALLOCATE]; n;)
>> + {
>> + if (n->sym->allocate == 1)
>> + {
>> + gfc_warning (0, "%qs appears more than once in %<allocate%> "
>> + "clauses at %L" , n->sym->name, &n->where);
>> + /* We have already seen this variable so it is a duplicate.
>> + Remove it. */
>> + if (prev != NULL && prev->next == n)
>> + {
>> + prev->next = n->next;
>> + n->next = NULL;
>> + gfc_free_omp_namelist (n, 0);
>> + n = prev->next;
>> + }
>> +
>> + continue;
>> + }
>> + n->sym->allocate = 1;
>> + prev = n;
>> + n = n->next;
>> + }
>> +
>> + for (list = 0; list < OMP_LIST_NUM; list++)
>> + switch (list)
>> + {
>> + case OMP_LIST_PRIVATE:
>> + case OMP_LIST_FIRSTPRIVATE:
>> + case OMP_LIST_LASTPRIVATE:
>> + case OMP_LIST_REDUCTION:
>> + case OMP_LIST_REDUCTION_INSCAN:
>> + case OMP_LIST_REDUCTION_TASK:
>> + case OMP_LIST_IN_REDUCTION:
>> + case OMP_LIST_TASK_REDUCTION:
>> + case OMP_LIST_LINEAR:
>> + for (n = omp_clauses->lists[list]; n; n = n->next)
>> + n->sym->allocate = 0;
>> + break;
>> + default:
>> + break;
>> + }
>> +
>> + for (n = omp_clauses->lists[OMP_LIST_ALLOCATE]; n; n = n->next)
>> + if (n->sym->allocate == 1)
>> + gfc_error ("%qs specified in 'allocate' clause at %L but not in an "
>> + "explicit privatization clause", n->sym->name, &n->where);
>
> I'm not sure this is what the standard says, certainly C/C++ FE do this
> quite differently for combined/composite constructs.
> In particular, we first split the clauses to the individual leaf constructs
> in c_omp_split_clauses, which for allocate clause is even more complicated
> because as clarified in 5.2:
> "The effect of the allocate clause is as if it is applied to all leaf constructs that permit the clause
> and to which a data-sharing attribute clause that may create a private copy of the same list item is
> applied."
> so there is the has_dup_allocate stuff, we first duplicate it to all leaf
> constructs that allow the allocate clause and set has_dup_allocate if it is
> put on more than one construct, and then if has_dup_allocate is set, do
> more detailed processing. And finally then {,c_}finish_omp_clauses
> diagnoses what you are trying above, but only on each leaf construct
> separately.
>
> Now, Fortran is performing the splitting of clauses only much later in
> trans-openmp.c, I wonder if it doesn't have other issues on
> combined/composite constructs if it performs other checks only on the
> clauses on the whole combined/composite construct and not just each leaf
> separately. I'd say we should move that diagnostics and perhaps other
> similar later on into a separate routine that is invoked only after the
> clauses are split or for non-combined/composite construct clauses.
Updated patch keeps the old code but restricts it to non-composite case. For composite constructs, I
have added code at the end of gfc_split_omp_clauses to copy allocate clause to all leaf constructs
which allow it and have a privatization clause. A new testcase checks for error in this case.
Thanks
--
Hafiz Abid Qadeer
Mentor, a Siemens Business
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gfortran-Add-support-for-allocate-clause-OpenMP-5.0.patch
Type: text/x-patch
Size: 68642 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20211118/63dece27/attachment-0001.bin>
More information about the Gcc-patches
mailing list