[Bug fortran/92698] New: Unnecessary copy in overlapping array assignment

mjr19 at cam dot ac.uk gcc-bugzilla@gcc.gnu.org
Wed Nov 27 18:29:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92698

            Bug ID: 92698
           Summary: Unnecessary copy in overlapping array assignment
           Product: gcc
           Version: 9.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mjr19 at cam dot ac.uk
  Target Milestone: ---

subroutine cpy(a,src,dest,len)
  integer, intent(in) :: src,dest,len
  real(kind(1d0)), intent(inout) :: a(:)

  a(dest:dest+len-1)=a(src:src+len-1)

end subroutine cpy


seems to compile to malloc tmp array, inline copy to tmp, inline copy from tmp,
free tmp in gfortran 7.4 and 8.3. Gfortran 9.2 modifies this by replacing the
inline copies with memcpy at -O3.

Fortran permits the source and destination to overlap, so a single call to
memcpy would be wrong. However, it is always possible to do an overlapping copy
in place either by incrementing from the start or by decrementing from the end,
as glibc's memmove does. The use of a temporary array, whilst given as an
example in the Fortran standard to illustrate that overlap is permitted, seems
in practice unnecessary. Would it not be better to call memmove once rather
than memcpy twice? Or perhaps a single inline copy, direction to be determined
by the nature of the overlap?

(Above observations from Linux / x86_64)


More information about the Gcc-bugs mailing list