https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89617
Bug ID: 89617 Summary: memmove used even after runtime guard against overlap Product: gcc Version: 8.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jzwinck at gmail dot com Target Milestone: --- For the following example, GCC 8.3 uses memmove unless compiling with -DRESTRICT. With -DRESTRICT it optimizes the copy to just 4 mov instructions. The copy code is only invoked after checking that the addresses differ, so moving the call to std::copy out of line just to decorate it with __restrict__ should not be necessary to achieve optimal code generation, given strict aliasing. #include <algorithm> #include <iterator> typedef int Arr[3]; inline void Copy(Arr& __restrict__ dest, const Arr& __restrict__ src) { std::copy(std::begin(src), std::end(src), dest); } void f2(Arr& dest, const Arr& src) { if (&dest != &src) // make sure there is no aliasing { #ifdef RESTRICT Copy(dest, src); // generates better code, why? #else std::copy(std::begin(src), std::end(src), dest); #endif } } Demo: https://godbolt.org/z/mT18Hb Discussion: https://stackoverflow.com/questions/55015151/can-arrays-overlap-alias-or-is-gcc-being-overly-cautious