Possible patch for fortran/57910
Louis Krupp
louis.krupp@zoho.com
Thu Oct 6 02:41:00 GMT 2016
PR fortran/57910
* trans-expr.c (gfc_add_interface_mapping): Don't try to
dereference call-by-value scalar argument.
The patch seems to work without breaking other tests.
Louis Krupp
-------------- next part --------------
Index: gcc/fortran/trans-array.c
===================================================================
--- gcc/fortran/trans-array.c (revision 240723)
+++ gcc/fortran/trans-array.c (working copy)
@@ -6963,6 +6963,7 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *ex
/* TODO: Optimize passing function return values. */
gfc_se lse;
gfc_se rse;
+ bool deep_copy;
/* Start the copying loops. */
gfc_mark_ss_chain_used (loop.temp_ss, 1);
@@ -6993,9 +6994,12 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *ex
gfc_add_block_to_block (&block, &lse.pre);
lse.string_length = rse.string_length;
+
+ deep_copy = !se->data_not_needed
+ && (expr->expr_type == EXPR_VARIABLE
+ || expr->expr_type == EXPR_ARRAY);
tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts,
- expr->expr_type == EXPR_VARIABLE
- || expr->expr_type == EXPR_ARRAY, false);
+ deep_copy, false);
gfc_add_expr_to_block (&block, tmp);
/* Finish the copying loops. */
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog (revision 240723)
+++ gcc/fortran/ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2016-10-02 Louis Krupp <louis.krupp@zoho.com>
+
+ PR fortran/69955
+ * trans-array.c (gfc_conv_expr_descriptor): Don't allocate
+ components if it's not necessary.
+
2016-09-30 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/66643
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (revision 240723)
+++ gcc/testsuite/ChangeLog (working copy)
@@ -1,3 +1,7 @@
+2016-10-02 Louis Krupp <louis.krupp@zoho.com>
+
+ * gfortran.dg/pr69955.f90: New test.
+
2016-10-03 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.target/avr/torture/builtins-error.c: Add -ffat-lto-objects
Index: gcc/testsuite/gfortran.dg/pr69955.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr69955.f90 (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr69955.f90 (working copy)
@@ -0,0 +1,78 @@
+! { dg-do run { target x86_64-*-linux* } }
+!
+! On Linux, this test reads /proc/<PID>/statm to retrieve the current
+! virtual memory size. Other platforms might have something similar.
+
+program p
+ implicit none
+
+ type :: t1
+ integer, allocatable :: t(:)
+ end type t1
+
+ type :: t2
+ type(t1), allocatable :: x1(:)
+ end type t2
+
+ type(t2) :: var(10)
+
+ integer :: i
+ integer :: vm_after_short_run, vm_after_long_run
+
+ do i= 1, 10
+ allocate(var(i)%x1(100))
+ allocate(var(i)%x1(1)%t(100))
+ enddo
+
+ open(unit = 37, file = "/dev/null", status = "old")
+
+ call s(100)
+
+ vm_after_short_run = vm_usage()
+
+ call s(100000)
+
+ vm_after_long_run = vm_usage()
+
+ ! Has VM usage gone up significantly? A test without the patch
+ ! showed an increase of a factor of 4.
+ if (vm_after_long_run > vm_after_short_run * 1.1) then
+ print '("vm after short run: ", i0, ", after long run: ", i0)', &
+ vm_after_short_run, vm_after_long_run
+ call abort
+ endif
+
+ close(unit = 37)
+
+ do i=1,10
+ deallocate(var(i)%x1)
+ enddo
+
+contains
+
+ subroutine s(counter)
+ implicit none
+ integer, intent(in) :: counter
+ integer :: i, j, n
+
+ do j=1, counter
+ n = size( [ ( var(i)%x1 , i = 1, size(var) ) ] )
+ write(unit = 37, fmt = '(i5)') n
+ enddo
+ end subroutine
+
+ function vm_usage()
+ implicit none
+ integer vm_usage
+ character(len=20) :: statm_name
+ integer, dimension(7) :: statm_info
+
+ write(statm_name, '("/proc/", i0, "/statm")') getpid()
+ open(unit = 21, file = statm_name, status = 'old')
+ read(21, *) statm_info(:)
+ close(unit = 21)
+
+ vm_usage = statm_info(1) ! VmSize
+ end function
+
+end program p
More information about the Fortran
mailing list