annotate gcc/testsuite/gcc.dg/pr66444.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -fipa-ra" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 extern void abort (void);
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 #if (__SIZEOF_LONG_LONG__ == __SIZEOF_POINTER__)
kono
parents:
diff changeset
7 #define ADD_SUFFIX(a) a ## ULL
kono
parents:
diff changeset
8 #elif (__SIZEOF_LONG__ == __SIZEOF_POINTER__)
kono
parents:
diff changeset
9 #define ADD_SUFFIX(a) a ## UL
kono
parents:
diff changeset
10 #elif (__SIZEOF_INT__ == __SIZEOF_POINTER__)
kono
parents:
diff changeset
11 #define ADD_SUFFIX(a) a ## U
kono
parents:
diff changeset
12 #else
kono
parents:
diff changeset
13 #error Add target support here
kono
parents:
diff changeset
14 #endif
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #if __SIZEOF_POINTER__ <= 4
kono
parents:
diff changeset
17 /* Use a 16 bit pointer to have a valid pointer for 16-bit to 31-bit pointer
kono
parents:
diff changeset
18 architectures. Using sizeof, we cannot distinguish between 31-bit and 32-bit
kono
parents:
diff changeset
19 pointer types, so we also handle the 32-bit pointer type case here. */
kono
parents:
diff changeset
20 #define CONST_PTR ADD_SUFFIX (0x800)
kono
parents:
diff changeset
21 #else
kono
parents:
diff changeset
22 /* For x86_64 -m64, the problem reproduces with this 32-bit CONST_PTR, but not
kono
parents:
diff changeset
23 with a 2-power below it. */
kono
parents:
diff changeset
24 #define CONST_PTR ADD_SUFFIX (0x80000000)
kono
parents:
diff changeset
25 #endif
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 int __attribute__((noinline, noclone))
kono
parents:
diff changeset
28 bar (void)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 return 1;
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 struct S
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 unsigned long p, q, r;
kono
parents:
diff changeset
36 void *v;
kono
parents:
diff changeset
37 };
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 struct S *s1;
kono
parents:
diff changeset
40 struct S *s2;
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 void __attribute__((noinline, noclone))
kono
parents:
diff changeset
43 fn2 (struct S *x)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 s2 = x;
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 __attribute__((noinline, noclone)) void *
kono
parents:
diff changeset
49 fn1 (struct S *x)
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 /* Just a statement to make it a non-const function. */
kono
parents:
diff changeset
52 s1 = x;
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 return (void *)0;
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 int __attribute__((noinline, noclone))
kono
parents:
diff changeset
58 baz (void)
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 struct S *x = (struct S *) CONST_PTR;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 x += bar ();
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 fn1 (x);
kono
parents:
diff changeset
65 fn2 (x);
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 return 0;
kono
parents:
diff changeset
68 }
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 int
kono
parents:
diff changeset
71 main (void)
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 baz ();
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 if (s2 != (((struct S *) CONST_PTR) + 1))
kono
parents:
diff changeset
76 abort ();
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 return 0;
kono
parents:
diff changeset
79 }