Hell world,

as part of the contiguous improvement process in gfortran, I have
committed the patch below as obvious.  gfortran now does not pack/unpack
if a function result is contiguous.

Regards

        Thomas


2019-01-13  Thomas Koenig  <tkoe...@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  <tkoe...@gcc.gnu.org>

        PR fortran/57792
        * gfortran.dg/internal_pack_18.f90: New test.
Index: trans-array.c
===================================================================
--- trans-array.c	(Revision 267903)
+++ trans-array.c	(Arbeitskopie)
@@ -7894,7 +7894,9 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr *
 	{
 	  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;
 	}
     }
! { 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" } }

Reply via email to