https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95151
--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> --- Initial attempt failed on [hjl@gnu-cfl-2 pr95151]$ cat saved.c #include <stdint.h> #include <string.h> #include <sys/mman.h> #include <unistd.h> unsigned char *buf1, *buf2; int ret; size_t page_size; static void do_one_test (char *dst, char *src, const char *orig_src, size_t len) { memcpy (src, orig_src, len); memmove (dst, src, len); if (memcmp (dst, orig_src, len) != 0) { ret = 1; return; } } void __attribute__ ((noclone, noinline)) do_test (char *s1, char *s2, int n, size_t len) { int i; for (i = 0; i < n; i++) do_one_test (s2, s2, s1, len); } int main (void) { page_size = 2 * getpagesize (); buf1 = mmap (0, (1 + 1) * page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (buf1 == MAP_FAILED) return -1; if (mprotect (buf1 + 1 * page_size, page_size, PROT_NONE)) return -1; buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (buf2 == MAP_FAILED) return -1; if (mprotect (buf2 + page_size, page_size, PROT_NONE)) return -1; memset (buf1, 0xa5, 1 * page_size); memset (buf2, 0x5a, page_size); char *s1 = (char *) buf1; char *s2 = (char *) buf2; size_t len; size_t i, j; len = 1 << 2; for (i = 0, j = 1; i < len; i++, j += 23) s1[i] = j; do_test (s1, s2, 10, 1 << 2); len = 1 << 4; for (i = 0, j = 1; i < len; i++, j += 23) s1[i] = j; do_test (s1, s2, 10, 1 << 4); return ret; } [hjl@gnu-cfl-2 pr95151]$ make saved /export/build/gnu/tools-build/gcc-gitlab-release-debug/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/tools-build/gcc-gitlab-release-debug/build-x86_64-linux/gcc/ -O2 -minline-all-stringops saved.c -o saved [hjl@gnu-cfl-2 pr95151]$ ./saved Segmentation fault (core dumped) [hjl@gnu-cfl-2 pr95151]$