annotate gcc/testsuite/gcc.dg/torture/pr70025.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 /* PR middle-end/70025 */
kono
parents:
diff changeset
2 /* { dg-do run } */
kono
parents:
diff changeset
3 /* { dg-additional-options "-mtune=z10" { target s390*-*-* } } */
kono
parents:
diff changeset
4 /* { dg-require-effective-target int32plus } */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 typedef char (*F) (unsigned long, void *);
kono
parents:
diff changeset
7 typedef union { struct A { char a1, a2, a3, a4; unsigned long a5; F a6; void *a7; } b; char c[1]; } B;
kono
parents:
diff changeset
8 struct C { const char *c1; unsigned long c2; };
kono
parents:
diff changeset
9 typedef struct D { unsigned long d1; int d2; const char *d3; unsigned long d4, d5; struct C d6[49]; char d7[8]; } E[1];
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
12 void foo (register E p)
kono
parents:
diff changeset
13 {
kono
parents:
diff changeset
14 asm volatile ("" : : "r" (p) : "memory");
kono
parents:
diff changeset
15 }
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
18 void bar (register E p)
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 register unsigned long k = p[0].d1 + 1;
kono
parents:
diff changeset
21 register struct C *l = &p[0].d6[p[0].d2];
kono
parents:
diff changeset
22 register const char *m = l->c1;
kono
parents:
diff changeset
23 p[0].d1 = k;
kono
parents:
diff changeset
24 if (*m == '\0')
kono
parents:
diff changeset
25 {
kono
parents:
diff changeset
26 register struct A *f = &((B *) m)->b;
kono
parents:
diff changeset
27 register unsigned long n = l->c2;
kono
parents:
diff changeset
28 register unsigned long o = n + f->a5;
kono
parents:
diff changeset
29 if (k < o)
kono
parents:
diff changeset
30 {
kono
parents:
diff changeset
31 register unsigned long i;
kono
parents:
diff changeset
32 register unsigned long q = k + 8;
kono
parents:
diff changeset
33 register F a6 = f->a6;
kono
parents:
diff changeset
34 register void *a7 = f->a7;
kono
parents:
diff changeset
35 if (q > o)
kono
parents:
diff changeset
36 q = o;
kono
parents:
diff changeset
37 for (i = k; i < q; i++)
kono
parents:
diff changeset
38 p[0].d7[i - k] = (*a6) (i - n, a7);
kono
parents:
diff changeset
39 p[0].d4 = k;
kono
parents:
diff changeset
40 p[0].d3 = p[0].d7;
kono
parents:
diff changeset
41 p[0].d5 = q;
kono
parents:
diff changeset
42 return;
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45 while (p[0].d2 > 0 && l[0].c2 != l[-1].c2)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 p[0].d2--;
kono
parents:
diff changeset
48 l--;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50 if (p[0].d2 == 0)
kono
parents:
diff changeset
51 {
kono
parents:
diff changeset
52 p[0].d2 = 0x55555555;
kono
parents:
diff changeset
53 return;
kono
parents:
diff changeset
54 }
kono
parents:
diff changeset
55 p[0].d2--;
kono
parents:
diff changeset
56 foo (p);
kono
parents:
diff changeset
57 }
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 char
kono
parents:
diff changeset
60 baz (unsigned long i, void *j)
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 if (j != 0)
kono
parents:
diff changeset
63 __builtin_abort ();
kono
parents:
diff changeset
64 return (char) i;
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 int
kono
parents:
diff changeset
68 main ()
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 struct D p;
kono
parents:
diff changeset
71 struct A f;
kono
parents:
diff changeset
72 __builtin_memset (&f, 0, sizeof (f));
kono
parents:
diff changeset
73 f.a2 = 4;
kono
parents:
diff changeset
74 f.a5 = 13;
kono
parents:
diff changeset
75 f.a6 = baz;
kono
parents:
diff changeset
76 __builtin_memset (&p, 0, sizeof (p));
kono
parents:
diff changeset
77 p.d6[0].c1 = (const char *) &f;
kono
parents:
diff changeset
78 bar (&p);
kono
parents:
diff changeset
79 if (p.d4 != 1 || p.d5 != 9 || p.d3 != p.d7)
kono
parents:
diff changeset
80 __builtin_abort ();
kono
parents:
diff changeset
81 return 0;
kono
parents:
diff changeset
82 }