annotate gcc/testsuite/gcc.c-torture/compile/20051216-1.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR rtl-optimization/25432 */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 void *malloc (__SIZE_TYPE__);
kono
parents:
diff changeset
4 void *realloc (void *, __SIZE_TYPE__);
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 struct A { double x, y; };
kono
parents:
diff changeset
7 struct B { double x0, y0, x1, y1; };
kono
parents:
diff changeset
8 struct C { int n_points; int dir; struct B bbox; struct A *points; };
kono
parents:
diff changeset
9 struct D { int n_segs; struct C segs[1]; };
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 void foo (int, int, int *, int, int *, struct A **, int *, int *,
kono
parents:
diff changeset
12 struct D *, int *, struct D **, int *, int **);
kono
parents:
diff changeset
13 int baz (struct A, struct A, struct A, struct A);
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 static void
kono
parents:
diff changeset
16 bar (struct D *svp, int *n_points_max,
kono
parents:
diff changeset
17 struct A p, int *seg_map, int *active_segs, int i)
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 int asi, n_points;
kono
parents:
diff changeset
20 struct C *seg;
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 asi = seg_map[active_segs[i]];
kono
parents:
diff changeset
23 seg = &svp->segs[asi];
kono
parents:
diff changeset
24 n_points = seg->n_points;
kono
parents:
diff changeset
25 seg->points = ((struct A *)
kono
parents:
diff changeset
26 realloc (seg->points, (n_points_max[asi] <<= 1) * sizeof (struct A)));
kono
parents:
diff changeset
27 seg->points[n_points] = p;
kono
parents:
diff changeset
28 seg->bbox.y1 = p.y;
kono
parents:
diff changeset
29 seg->n_points++;
kono
parents:
diff changeset
30 }
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 struct D *
kono
parents:
diff changeset
33 test (struct D *vp)
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 int *active_segs, n_active_segs, *cursor, seg_idx;
kono
parents:
diff changeset
36 double y, share_x;
kono
parents:
diff changeset
37 int tmp1, tmp2, asi, i, j, *n_ips, *n_ips_max, n_segs_max;
kono
parents:
diff changeset
38 struct A **ips, p_curs, *pts;
kono
parents:
diff changeset
39 struct D *new_vp;
kono
parents:
diff changeset
40 int *n_points_max, *seg_map, first_share;
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 n_segs_max = 16;
kono
parents:
diff changeset
43 new_vp = (struct D *) malloc (sizeof (struct D) +
kono
parents:
diff changeset
44 (n_segs_max - 1) * sizeof (struct C));
kono
parents:
diff changeset
45 new_vp->n_segs = 0;
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 if (vp->n_segs == 0)
kono
parents:
diff changeset
48 return new_vp;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 active_segs = ((int *) malloc ((vp->n_segs) * sizeof (int)));
kono
parents:
diff changeset
51 cursor = ((int *) malloc ((vp->n_segs) * sizeof (int)));
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 seg_map = ((int *) malloc ((vp->n_segs) * sizeof (int)));
kono
parents:
diff changeset
54 n_ips = ((int *) malloc ((vp->n_segs) * sizeof (int)));
kono
parents:
diff changeset
55 n_ips_max = ((int *) malloc ((vp->n_segs) * sizeof (int)));
kono
parents:
diff changeset
56 ips = ((struct A * *) malloc ((vp->n_segs) * sizeof (struct A *)));
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 n_points_max = ((int *) malloc ((n_segs_max) * sizeof (int)));
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 n_active_segs = 0;
kono
parents:
diff changeset
61 seg_idx = 0;
kono
parents:
diff changeset
62 y = vp->segs[0].points[0].y;
kono
parents:
diff changeset
63 while (seg_idx < vp->n_segs || n_active_segs > 0)
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 for (i = 0; i < n_active_segs; i++)
kono
parents:
diff changeset
66 {
kono
parents:
diff changeset
67 asi = active_segs[i];
kono
parents:
diff changeset
68 if (vp->segs[asi].n_points - 1 == cursor[asi] &&
kono
parents:
diff changeset
69 vp->segs[asi].points[cursor[asi]].y == y)
kono
parents:
diff changeset
70 i--;
kono
parents:
diff changeset
71 }
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 while (seg_idx < vp->n_segs && y == vp->segs[seg_idx].points[0].y)
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 cursor[seg_idx] = 0;
kono
parents:
diff changeset
76 n_ips[seg_idx] = 1;
kono
parents:
diff changeset
77 n_ips_max[seg_idx] = 2;
kono
parents:
diff changeset
78 ips[seg_idx] =
kono
parents:
diff changeset
79 ((struct A *) malloc ((n_ips_max[seg_idx]) * sizeof (struct A)));
kono
parents:
diff changeset
80 ips[seg_idx][0] = vp->segs[seg_idx].points[0];
kono
parents:
diff changeset
81 pts = ((struct A *) malloc ((16) * sizeof (struct A)));
kono
parents:
diff changeset
82 pts[0] = vp->segs[seg_idx].points[0];
kono
parents:
diff changeset
83 tmp1 = seg_idx;
kono
parents:
diff changeset
84 for (j = i; j < n_active_segs; j++)
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 tmp2 = active_segs[j];
kono
parents:
diff changeset
87 active_segs[j] = tmp1;
kono
parents:
diff changeset
88 tmp1 = tmp2;
kono
parents:
diff changeset
89 }
kono
parents:
diff changeset
90 active_segs[n_active_segs] = tmp1;
kono
parents:
diff changeset
91 n_active_segs++;
kono
parents:
diff changeset
92 seg_idx++;
kono
parents:
diff changeset
93 }
kono
parents:
diff changeset
94 first_share = -1;
kono
parents:
diff changeset
95 share_x = 0;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 for (i = 0; i < n_active_segs; i++)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 asi = active_segs[i];
kono
parents:
diff changeset
100 p_curs = ips[asi][1];
kono
parents:
diff changeset
101 if (p_curs.y == y)
kono
parents:
diff changeset
102 {
kono
parents:
diff changeset
103 bar (new_vp, n_points_max,
kono
parents:
diff changeset
104 p_curs, seg_map, active_segs, i);
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 n_ips[asi]--;
kono
parents:
diff changeset
107 for (j = 0; j < n_ips[asi]; j++)
kono
parents:
diff changeset
108 ips[asi][j] = ips[asi][j + 1];
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 if (first_share < 0 || p_curs.x != share_x)
kono
parents:
diff changeset
111 {
kono
parents:
diff changeset
112 foo (first_share, i,
kono
parents:
diff changeset
113 active_segs, n_active_segs,
kono
parents:
diff changeset
114 cursor, ips, n_ips, n_ips_max, vp, seg_map,
kono
parents:
diff changeset
115 &new_vp, &n_segs_max, &n_points_max);
kono
parents:
diff changeset
116 first_share = i;
kono
parents:
diff changeset
117 share_x = p_curs.x;
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120 else
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 foo (first_share, i,
kono
parents:
diff changeset
123 active_segs, n_active_segs,
kono
parents:
diff changeset
124 cursor, ips, n_ips, n_ips_max, vp, seg_map,
kono
parents:
diff changeset
125 &new_vp, &n_segs_max, &n_points_max);
kono
parents:
diff changeset
126 first_share = -1;
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128 }
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130 return new_vp;
kono
parents:
diff changeset
131 }