1 /* { dg-require-effective-target mmap } */
2
3 #include <sys/mman.h>
4 #include <stdio.h>
5
6 #define COUNT 128
7 #define MMAP_SIZE 0x20000
8 #define ADDRESS 0x1122000000
9 #define TYPE unsigned int
10
11 #ifndef MAP_ANONYMOUS
12 #define MAP_ANONYMOUS MAP_ANON
13 #endif
14
15 void __attribute__((noipa))
16 loop (TYPE *restrict x, TYPE *restrict y)
17 {
18 for (int i = 0; i < COUNT; ++i)
19 {
20 x[i * 4] = y[i * 2] + 1;
21 x[i * 4 + 1] = y[i * 2] + 2;
22 x[i * 4 + 2] = y[i * 2 + 1] + 3;
23 x[i * 4 + 3] = y[i * 2 + 1] + 4;
24 }
25 }
26
27 TYPE x[COUNT * 4];
28
29 int
30 main (void)
31 {
32 void *y;
33 TYPE *end_y;
34
35 y = mmap ((void *) ADDRESS, MMAP_SIZE, PROT_READ | PROT_WRITE,
36 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
37 if (y == MAP_FAILED)
38 {
39 perror ("mmap");
40 return 1;
41 }
42
43 end_y = (TYPE *) ((char *) y + MMAP_SIZE);
44
45 loop (x, end_y - COUNT * 2);
46
47 return 0;
48 }
49
50 /* { dg-final { scan-tree-dump "Data access with gaps requires scalar epilogue loop" "vect" { target { vect_perm && vect_int } } } } */