aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-01-11 06:32:10 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-01-11 06:32:10 +0000
commit7dc3df082b9edc8d78e0cd3846027afc345aebc7 (patch)
treebee65d939bd05507d8c1ee7b8e4d50924a28d8f4 /gcc
parent0604d5672f51109bbd1397de439a3fce444a30d6 (diff)
downloadgcc-7dc3df082b9edc8d78e0cd3846027afc345aebc7.zip
gcc-7dc3df082b9edc8d78e0cd3846027afc345aebc7.tar.gz
gcc-7dc3df082b9edc8d78e0cd3846027afc345aebc7.tar.bz2
re PR fortran/59345 (_gfortran_internal_pack on compiler generated temps)
2019-01-11 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/59345 * trans-array.c (gfc_conv_parameter_array): Temporary arrays generated for expressions do not need to be repacked. 2019-01-11 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/59345 * gfortran.dg/internal_pack_16.f90: New test. From-SVN: r267829
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_16.f909
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 678970b..6c5e195 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-11 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/59345
+ * trans-array.c (gfc_conv_parameter_array): Temporary
+ arrays generated for expressions do not need to be repacked.
+
2019-01-10 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/86322
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index e71e76e..af3a2d8 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7866,6 +7866,12 @@ 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. */
+
+ no_pack = no_pack || (g77 && expr->expr_type == EXPR_OP);
+
/* Array constructors are always contiguous and do not need packing. */
array_constructor = g77 && !this_array_result && expr->expr_type == EXPR_ARRAY;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 018fa76..80e0b1a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-01-11 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/59345
+ * gfortran.dg/internal_pack_16.f90: New test.
+
2019-01-10 Jakub Jelinek <jakub@redhat.com>
PR target/88785
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_16.f90 b/gcc/testsuite/gfortran.dg/internal_pack_16.f90
new file mode 100644
index 0000000..7e34c2b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/internal_pack_16.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+! PR 59345 - pack/unpack was not needed here.
+SUBROUTINE S1(A)
+ REAL :: A(3)
+ 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" } }