/* PR tree-optimization/83047 */ /* { dg-do run { target mmap } } */ /* { dg-options "-O2" } */ #include #include #include #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif #ifndef MAP_ANON #define MAP_ANON 0 #endif #ifndef MAP_FAILED #define MAP_FAILED ((void *)-1) #endif #include __attribute__((noipa)) void foo (char *p, char *q, int r) { char a = q[0]; if (r || a == '\0') return; char b = q[1]; p[0] = a; p[1] = b; } int main () { char *p = mmap (NULL, 131072, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) return 0; if (munmap (p + 65536, 65536) < 0) return 0; p[0] = 'c'; p[1] = 'd'; p[65536 - 2] = 'a'; p[65536 - 1] = 'b'; volatile int r = 1; foo (p, p + 65536 - 2, r); if (p[0] != 'c' || p[1] != 'd') abort (); r = 0; foo (p, p + 65536 - 2, r); if (p[0] != 'a' || p[1] != 'b') abort (); p[0] = 'e'; p[1] = 'f'; r = 1; foo (p, p + 65536 - 1, r); if (p[0] != 'e' || p[1] != 'f') abort (); return 0; }