diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr83047.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr83047.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr83047.c b/gcc/testsuite/gcc.dg/pr83047.c new file mode 100644 index 0000000..db374a9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83047.c @@ -0,0 +1,58 @@ +/* PR tree-optimization/83047 */ +/* { dg-do run { target mmap } } */ +/* { dg-options "-O2" } */ + +#include <stddef.h> +#include <stdio.h> +#include <sys/mman.h> +#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 <stdlib.h> + +__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; +} |