[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