[Patch] (general Fortran + OpenMP) [Fortran] Fix/modify present() handling for assumed-shape optional (PR 94672)
Tobias Burnus
tobias@codesourcery.com
Thu May 7 13:11:41 GMT 2020
The main purpose of this patch is to fix OpenMP, but it modifies
the general Fortran handling of assumed-shape optional arguments.
For assumed shape, gfortran generates an "arg.0 = arg->data"
artificial variable – and with optional one has something like
if (arg != NULL && arg->data != NULL)
{
arg.0 = arg->data;
lbound.0 = ...
}
And an "if (present(arg))" becomes
"if (arg != NULL && arg->data != NULL)".
The proposed change changes the init to:
if (arg != NULL && arg->data != NULL)
{
arg.0 = arg->data;
lbound.0 = ...
}
else
arg.0 = NULL; // <-- new
Such that an "if (present(arg))" becomes "if (arg.0 != NULL)".
I think for Fortran code itself, it does not really make any
difference. However, for OpenMP (and OpenACC) it does.
Currently,
!$omp …
if (present(arg)) stop 1
!$omp end …
has decl = "arg.0" and SAVED_DESCRIPTOR(decl) == "arg" such
that inside the omp block everything is "arg.0" – except for
"if (present(arg))" which is converted to the "!arg && !arg->data".
This causes the problems shown in the PR (PR94672).
For optional & 'omp target' where one has to map the variable and
has to check it inside the target function, I even ended up setting
"arg.0 = NULL" explicitly as this was much simpler than adding more
checking in gcc/omp-low.c.
Thus: I think either variant (checking arg directly vs. checking arg.0
plus setting it to NULL) works equally well with normal Fortran code;
one can probably design code where one or the other is slightly faster,
but at the end it should not matter.
And for OpenMP/OpenACC, the new variant avoids several problems.
Hence:
OK for the trunk – and GCC 10 (regression, rejects valid code)?
Tobias
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix-omp-optional-v3.diff
Type: text/x-patch
Size: 12359 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20200507/bffc00de/attachment-0001.bin>
More information about the Gcc-patches
mailing list