aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-01-13 14:57:39 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-01-13 14:57:39 +0000
commit8ef8fa9a4de095b17647b65b22081413d6afd171 (patch)
tree1cc2fe21c165c2700c15ca13240553c5f4dd3f00
parent234c38181acfb1e3980bd4a6974328d097b922f1 (diff)
downloadgcc-8ef8fa9a4de095b17647b65b22081413d6afd171.zip
gcc-8ef8fa9a4de095b17647b65b22081413d6afd171.tar.gz
gcc-8ef8fa9a4de095b17647b65b22081413d6afd171.tar.bz2
re PR fortran/57992 (Pointless packing of contiguous arrays for simply contiguous functions results as actual arguments)
2019-01-13 Thomas Koenig <tkoenig@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 <tkoenig@gcc.gnu.org> PR fortran/59345 * gfortran.dg/internal_pack_18.f90: New test. From-SVN: r267905
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_18.f9015
4 files changed, 29 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 82e122e..ca20973 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2019-01-13 Thomas Koenig <tkoenig@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 <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
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index ae597e8..1814916 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7894,7 +7894,9 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
{
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;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 10bf8bd..33a7f95 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/59345
+ * gfortran.dg/internal_pack_18.f90: New test.
+
2019-01-13 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/pr51628-20.c: Updated.
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_18.f90 b/gcc/testsuite/gfortran.dg/internal_pack_18.f90
new file mode 100644
index 0000000..ede0691
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/internal_pack_18.f90
@@ -0,0 +1,15 @@
+! { 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" } }