Hell world, as part of the contiguous improvement process in gfortran, I have committed the patch below as obvious. gfortran now does not pack/unpack if a function result is contiguous.
Regards Thomas 2019-01-13 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/57992 * trans-array.c (gfc_conv_array_parameter): Do not pack/unpack functions with contiguous results. 2019-01-13 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/57792 * gfortran.dg/internal_pack_18.f90: New test.
Index: trans-array.c =================================================================== --- trans-array.c (Revision 267903) +++ trans-array.c (Arbeitskopie) @@ -7894,7 +7894,9 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * { gfc_symbol *result = expr->value.function.esym->result; if (result->attr.dimension - && (result->as->type == AS_EXPLICIT || result->attr.allocatable)) + && (result->as->type == AS_EXPLICIT + || result->attr.allocatable + || result->attr.contiguous)) no_pack = 1; } }
! { dg-do compile } ! { dg-additional-options "-fdump-tree-original" } ! PR 57992 - this was packed/unpacked unnecessarily. ! Original case by Tobias Burnus. subroutine test interface function f2() integer, pointer, contiguous :: f2(:) end function f2 end interface call bar(f2()) end subroutine test ! { dg-final { scan-tree-dump-not "_gfortran_internal_pack" "original" } } ! { dg-final { scan-tree-dump-not "_gfortran_internal_unpack" "original" } }