[PATCH 1/4] openacc: Remove dereference for non-pointer derived-type members

Tobias Burnus tobias@codesourcery.com
Tue Feb 2 16:32:03 GMT 2021


(added fortran@ at it is about Fortran)

I note that some lines in the testcase are commented (polymorphic
arrays), but I note further that Patch 3/4 enables them.

On 02.02.21 14:28, Julian Brown wrote:
> Derived-type members that are themselves derived types are not always
> represented as pointers, so it is not always correct to dereference
> them. The attached test case fails during gimplification without this
> patch.
> Tested with offloading to AMD GCN. OK for mainline?
>
> 2020-02-02  Julian Brown  <julian@codesourcery.com>
>
> gcc/fortran/
>       * trans-openmp.c (gfc_trans_omp_clauses): Handle non-pointer type.
>
> gcc/testsuite/
>       * gfortran.dg/goacc/derived-classtypes-1.f95: New test.
> ---
>   gcc/fortran/trans-openmp.c                    |   7 +-
>   .../goacc/derived-classtypes-1.f95            | 129 ++++++++++++++++++
>   2 files changed, 134 insertions(+), 2 deletions(-)
>   create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95
>
> diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
> index 00358ca4d39..8d8da4593c3 100644
> --- a/gcc/fortran/trans-openmp.c
> +++ b/gcc/fortran/trans-openmp.c
> @@ -3013,7 +3013,8 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
>                           }
>
>                         OMP_CLAUSE_DECL (node)
> -                         = build_fold_indirect_ref (data);
> +                         = (POINTER_TYPE_P (TREE_TYPE (data))
> +                            ? build_fold_indirect_ref (data) : data);
>                         OMP_CLAUSE_SIZE (node) = size;
>                         node2 = build_omp_clause (input_location,
>                                                   OMP_CLAUSE_MAP);

I am a bit surprised given that:
                       if (sym_attr.pointer || (openacc && sym_attr.allocatable))

I wonder whether we have a size problem:
                               data = inner;
                               size = TYPE_SIZE_UNIT (TREE_TYPE (inner));

Testing shows that it fails for:
    80 | !$acc enter data copyin(jim%f)
    95 | !$acc enter data copyin(pjim%f)
   110 | !$acc enter data copyin(cjim%f)
   125 | !$acc enter data copyin(acjim%f)

where the component is 'type(aux), pointer :: f'.

As sizeof(void*) and 2*sizeof(int) is the same, it does not
matter in this case, but I fear it might in other cases.
('aux' contains two 'integer', one direct and one by inheriting
it from 'aux1'.)

Otherwise, I think the patch is fine. However, it also might be
useful to add some character tests (kind=1 and kind=4) for
completeness.

NOTE: character(len=:), allocatable/pointer is the most interesting
case, but that fails due to https://gcc.gnu.org/PR95868.
Thus, we can only test for len=<const>.

Tobias

> @@ -3021,7 +3022,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
>                                                  openacc
>                                                  ? GOMP_MAP_ATTACH_DETACH
>                                                  : GOMP_MAP_ALWAYS_POINTER);
> -                       OMP_CLAUSE_DECL (node2) = data;
> +                       OMP_CLAUSE_DECL (node2)
> +                         = (POINTER_TYPE_P (TREE_TYPE (data))
> +                            ? data : build_fold_addr_expr (data));
>                         OMP_CLAUSE_SIZE (node2) = size_int (0);
>                       }
>                     else
> diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 b/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95
> new file mode 100644
> index 00000000000..e6cf09c6d3c
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95
> @@ -0,0 +1,129 @@
> +type :: type1
> +  integer :: a
> +end type type1
> +
> +type :: type2
> +  integer, pointer :: b
> +end type type2
> +
> +type :: aux1
> +  integer :: y
> +end type aux1
> +
> +type, extends(aux1) :: aux
> +  integer :: x
> +end type aux
> +
> +type :: type3
> +  class(aux), pointer :: c(:)
> +end type type3
> +
> +type :: type4
> +  integer, pointer :: d(:)
> +end type type4
> +
> +type :: type5
> +  type(aux) :: e
> +end type type5
> +
> +type :: type6
> +  type(aux), pointer :: f
> +end type type6
> +
> +type :: type7
> +  class(aux), pointer :: g
> +end type type7
> +
> +type(type1) :: foo
> +type(type2) :: bar
> +type(type3) :: qux
> +type(type4) :: quux
> +type(type5) :: fred
> +type(type6) :: jim
> +type(type7) :: shiela
> +
> +type(type1), pointer :: pfoo
> +type(type2), pointer :: pbar
> +type(type3), pointer :: pqux
> +type(type4), pointer :: pquux
> +type(type5), pointer :: pfred
> +type(type6), pointer :: pjim
> +type(type7), pointer :: pshiela
> +
> +class(type1), pointer :: cfoo
> +class(type2), pointer :: cbar
> +class(type3), pointer :: cqux
> +class(type4), pointer :: cquux
> +class(type5), pointer :: cfred
> +class(type6), pointer :: cjim
> +class(type7), pointer :: cshiela
> +
> +class(type1), allocatable :: acfoo
> +class(type2), allocatable :: acbar
> +class(type3), allocatable :: acqux
> +class(type4), allocatable :: acquux
> +class(type5), allocatable :: acfred
> +class(type6), allocatable :: acjim
> +class(type7), allocatable :: acshiela
> +
> +!$acc enter data copyin(foo)
> +!$acc enter data copyin(foo%a)
> +!$acc enter data copyin(bar)
> +!$acc enter data copyin(bar%b)
> +!$acc enter data copyin(qux)
> +!!$acc enter data copyin(qux%c)
> +!$acc enter data copyin(quux)
> +!$acc enter data copyin(quux%d)
> +!$acc enter data copyin(fred)
> +!$acc enter data copyin(fred%e)
> +!$acc enter data copyin(jim)
> +!$acc enter data copyin(jim%f)
> +!$acc enter data copyin(shiela)
> +!$acc enter data copyin(shiela%g)
> +
> +!$acc enter data copyin(pfoo)
> +!$acc enter data copyin(pfoo%a)
> +!$acc enter data copyin(pbar)
> +!$acc enter data copyin(pbar%b)
> +!$acc enter data copyin(pqux)
> +!!$acc enter data copyin(pqux%c)
> +!$acc enter data copyin(pquux)
> +!$acc enter data copyin(pquux%d)
> +!$acc enter data copyin(pfred)
> +!$acc enter data copyin(pfred%e)
> +!$acc enter data copyin(pjim)
> +!$acc enter data copyin(pjim%f)
> +!$acc enter data copyin(pshiela)
> +!$acc enter data copyin(pshiela%g)
> +
> +!$acc enter data copyin(cfoo)
> +!$acc enter data copyin(cfoo%a)
> +!$acc enter data copyin(cbar)
> +!$acc enter data copyin(cbar%b)
> +!$acc enter data copyin(cqux)
> +!!$acc enter data copyin(cqux%c)
> +!$acc enter data copyin(cquux)
> +!$acc enter data copyin(cquux%d)
> +!$acc enter data copyin(cfred)
> +!$acc enter data copyin(cfred%e)
> +!$acc enter data copyin(cjim)
> +!$acc enter data copyin(cjim%f)
> +!$acc enter data copyin(cshiela)
> +!$acc enter data copyin(cshiela%g)
> +
> +!$acc enter data copyin(acfoo)
> +!$acc enter data copyin(acfoo%a)
> +!$acc enter data copyin(acbar)
> +!$acc enter data copyin(acbar%b)
> +!$acc enter data copyin(acqux)
> +!!$acc enter data copyin(acqux%c)
> +!$acc enter data copyin(acquux)
> +!$acc enter data copyin(acquux%d)
> +!$acc enter data copyin(acfred)
> +!$acc enter data copyin(acfred%e)
> +!$acc enter data copyin(acjim)
> +!$acc enter data copyin(acjim%f)
> +!$acc enter data copyin(acshiela)
> +!$acc enter data copyin(acshiela%g)
> +
> +end
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf


More information about the Gcc-patches mailing list