Hello world, this patch fixes the rest of the PR by making sure we do not pack/unpack for function results which are either allocatable or explicit shape arrays.
Regression-tested. OK for trunk? Regards Thomas 2019-01-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/59345 * trans-array.c (gfc_conv_array_parameter): Remove TODO. Do not pack/unpack results of functions which return an explicit-shaped or allocatable array. 2019-01-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/59345 * gfortran.dg/internal_pack_17.f90: New test. * gfortran.dg/alloc_comp_auto_array_3.f90: Adjust number of calls to builtin_free.
Index: trans-array.c =================================================================== --- trans-array.c (Revision 267829) +++ trans-array.c (Arbeitskopie) @@ -7740,7 +7740,6 @@ array_parameter_size (tree desc, gfc_expr *expr, t } /* Convert an array for passing as an actual parameter. */ -/* TODO: Optimize passing g77 arrays. */ void gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77, @@ -7866,11 +7865,23 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * no_pack = contiguous && no_pack; - /* If we have an expression, an array temporary will be - generated which does not need to be packed / unpacked - if passed to an explicit-shape dummy array. */ + /* If we have an EXPR_OP or a function returning an explicit-shaped + or allocatable array, an array temporary will be generated which + does not need to be packed / unpacked if passed to an + explicit-shape dummy array. */ - no_pack = no_pack || (g77 && expr->expr_type == EXPR_OP); + if (g77) + { + if (expr->expr_type == EXPR_OP) + no_pack = 1; + else if (expr->expr_type == EXPR_FUNCTION && expr->value.function.esym) + { + gfc_symbol *result = expr->value.function.esym->result; + if (result->attr.dimension + && (result->as->type == AS_EXPLICIT || result->attr.allocatable)) + no_pack = 1; + } + } /* Array constructors are always contiguous and do not need packing. */ array_constructor = g77 && !this_array_result && expr->expr_type == EXPR_ARRAY;
! { dg-do compile } ! { dg-additional-options "-fdump-tree-original" } ! PR 59345 - pack/unpack was not needed here. ! Original test case by Joost VandeVondele SUBROUTINE S1(A) INTERFACE FUNCTION CONTIGUOUS_F1() RESULT(res) INTEGER :: res(5) END FUNCTION END INTERFACE CALL S2(CONTIGUOUS_F1()) END SUBROUTINE SUBROUTINE S3(A) INTERFACE FUNCTION CONTIGOUOS_F2() RESULT(res) INTEGER, ALLOCATABLE :: res(:) END FUNCTION END INTERFACE PROCEDURE(CONTIGOUOS_F2), POINTER :: A CALL S2(A()) END SUBROUTINE ! { dg-final { scan-tree-dump-not "_gfortran_internal_pack" "original" } } ! { dg-final { scan-tree-dump-not "_gfortran_internal_unpack" "original" } }