1 /* PR middle-end/36043 target/58744 target/65408 */
2 /* { dg-do run { target mmap } } */
3 /* { dg-options "-O2" } */
4 
5 #include <sys/mman.h>
6 #ifndef MAP_ANONYMOUS
7 #define MAP_ANONYMOUS MAP_ANON
8 #endif
9 #ifndef MAP_ANON
10 #define MAP_ANON 0
11 #endif
12 #ifndef MAP_FAILED
13 #define MAP_FAILED ((void *)-1)
14 #endif
15 
16 typedef struct
17 {
18   unsigned char r;
19   unsigned char g;
20   unsigned char b;
21 } __attribute__((packed)) pr58744;
22 
23 typedef struct
24 {
25   unsigned short r;
26   unsigned short g;
27   unsigned short b;
28 } pr36043;
29 
30 typedef struct
31 {
32   int r;
33   int g;
34   int b;
35 } pr65408;
36 
37 __attribute__ ((noinline, noclone))
38 void
f1a(pr58744 x)39 f1a (pr58744 x)
40 {
41   if (x.r != 1 || x.g != 2 || x.b != 3)
42     __builtin_abort();
43 }
44 
45 __attribute__ ((noinline, noclone))
46 void
f1(pr58744 * x)47 f1 (pr58744 *x)
48 {
49   f1a (*x);
50 }
51 
52 __attribute__ ((noinline, noclone))
53 void
f2a(pr36043 x)54 f2a (pr36043 x)
55 {
56   if (x.r != 1 || x.g != 2 || x.b != 3)
57     __builtin_abort();
58 }
59 
60 __attribute__ ((noinline, noclone))
61 void
f2(pr36043 * x)62 f2 (pr36043 *x)
63 {
64   f2a (*x);
65 }
66 
67 __attribute__ ((noinline, noclone))
68 void
f3a(pr65408 x)69 f3a (pr65408 x)
70 {
71   if (x.r != 1 || x.g != 2 || x.b != 3)
72     __builtin_abort();
73 }
74 
75 __attribute__ ((noinline, noclone))
76 void
f3(pr65408 * x)77 f3 (pr65408 *x)
78 {
79   f3a (*x);
80 }
81 
82 int
main()83 main ()
84 {
85   char *p = mmap ((void *) 0, 131072, PROT_READ | PROT_WRITE,
86 		  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
87   if (p == MAP_FAILED)
88     return 0;
89   char *endp = p + 65536;
90   if (munmap (endp, 65536) < 0)
91     return 0;
92 
93   pr58744 *s1 = (pr58744 *) endp - 1;
94   s1->r = 1;
95   s1->g = 2;
96   s1->b = 3;
97   f1 (s1);
98 
99   pr36043 *s2 = (pr36043 *) endp - 1;
100   s2->r = 1;
101   s2->g = 2;
102   s2->b = 3;
103   f2 (s2);
104 
105   pr65408 *s3 = (pr65408 *) endp - 1;
106   s3->r = 1;
107   s3->g = 2;
108   s3->b = 3;
109   f3 (s3);
110 
111   return 0;
112 }
113