re PR fortran/59345 (_gfortran_internal_pack on compiler generated temps)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 13 Jan 2019 11:06:03 +0000 (11:06 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 13 Jan 2019 11:06:03 +0000 (11:06 +0000)
2019-01-13  Thomas Koenig  <tkoenig@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-13  Thomas Koenig  <tkoenig@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.

From-SVN: r267903

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90
gcc/testsuite/gfortran.dg/internal_pack_17.f90 [new file with mode: 0644]

index 50db133fa39e4666c8ff33a7c1c59a43302cd81c..82e122ed1632d75a9abc28e07ee5aa84fc582be5 100644 (file)
@@ -1,3 +1,10 @@
+2019-01-13  Thomas Koenig  <tkoenig@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  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/61765
index 6b3c0e2d65b12077a1185ef662148f5db9e08741..ae597e8e4bf1f02cc734d83b0160a54e337c7e45 100644 (file)
@@ -7756,7 +7756,6 @@ array_parameter_size (tree desc, gfc_expr *expr, tree *size)
 }
 
 /* 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,
@@ -7882,11 +7881,23 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 
   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;
index 0398fb8287401dea358b7fb867d12a0f839eb029..609320e6f7da058517072e4ebbb1e727c0516723 100644 (file)
@@ -1,3 +1,10 @@
+2019-01-13  Thomas Koenig  <tkoenig@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.
+
 2019-01-12  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/61765
index b135d3d56e4477648cf0063cc694eec25b7d34b1..15f9ecb74de644a2e78dab726d6d7c8c69a4e6d9 100644 (file)
@@ -26,5 +26,5 @@ contains
   end function
 end
 ! { dg-final { scan-tree-dump-times "builtin_malloc" 3 "original" } }
-! { dg-final { scan-tree-dump-times "builtin_free" 4 "original" } }
+! { dg-final { scan-tree-dump-times "builtin_free" 3 "original" } }
 ! { dg-final { scan-tree-dump-times "while \\(1\\)" 4 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_17.f90 b/gcc/testsuite/gfortran.dg/internal_pack_17.f90
new file mode 100644 (file)
index 0000000..c1b813b
--- /dev/null
@@ -0,0 +1,24 @@
+! { 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" } }