1 /* PR optimization/6475
2    Distilled from zlib sources.  */
3 /* { dg-do run } */
4 /* { dg-options "-O2" } */
5 /* { dg-options "-O2 -frename-registers -fomit-frame-pointer -fPIC -mtune=i686" { target { { i?86-*-* x86_64-*-* } && { ia32 && fpic } } } } */
6 
7 extern void exit (int);
8 
9 typedef struct
10 {
11   union
12   {
13     struct
14     {
15       unsigned char a3;
16       unsigned char a4;
17     } a2;
18     unsigned int a5;
19   } a0;
20   unsigned int a1;
21 } A;
22 
23 static int
foo(unsigned int * b,unsigned int n,unsigned int s,const unsigned int * d,const unsigned int * e,A ** t,unsigned int * m,A * hp,unsigned int * hn,unsigned int * v)24 foo (unsigned int *b, unsigned int n, unsigned int s, const unsigned int *d,
25      const unsigned int *e, A **t, unsigned int *m, A *hp, unsigned int *hn,
26      unsigned int *v)
27 {
28   unsigned int a, c[15 + 1], f;
29   int g, h;
30   unsigned int i, j, k;
31   int l;
32   unsigned int ee;
33   unsigned int *p;
34   A *q, r, *u[15];
35   int w;
36   unsigned int x[15 + 1], *xx;
37   int y;
38   unsigned int z;
39   p = c;
40   *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
41   *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
42   *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
43   *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
44   p = b;
45   i = n;
46   do
47     c[*p++]++;
48   while (--i);
49   if (c[0] == n)
50     {
51       *t = (A *) 0;
52       *m = 0;
53       return 0;
54     }
55   l = *m;
56   for (j = 1; j <= 15; j++)
57     if (c[j])
58       break;
59   k = j;
60   if ((unsigned int) l < j)
61     l = j;
62   for (i = 15; i; i--)
63     if (c[i])
64       break;
65   g = i;
66   if ((unsigned int) l > i)
67     l = i;
68   *m = l;
69   for (y = 1 << j; j < i; j++, y <<= 1)
70     if ((y -= c[j]) < 0)
71       return -3;
72   if ((y -= c[i]) < 0)
73     return -3;
74   c[i] += y;
75   x[1] = j = 0;
76   p = c + 1;
77   xx = x + 2;
78   while (--i)
79     *xx++ = (j += *p++);
80   p = b;
81   i = 0;
82   do
83     if ((j = *p++) != 0)
84       v[x[j]++] = i;
85   while (++i < n);
86   n = x[g];
87   x[0] = i = 0;
88   p = v;
89   h = -1;
90   w = -l;
91   u[0] = (A *) 0;
92   q = (A *) 0;
93   z = 0;
94   for (; k <= g; k++)
95     {
96       a = c[k];
97       while (a--)
98 	{
99 	  while (k > w + l)
100 	    {
101 	      h++;
102 	      w += l;
103 	      z = g - w;
104 	      z = z > (unsigned int) l ? l : z;
105 	      if ((f = 1 << (j = k - w)) > a + 1)
106 		{
107 		  f -= a + 1;
108 		  xx = c + k;
109 		  if (j < z)
110 		    while (++j < z)
111 		      {
112 			if ((f <<= 1) <= *++xx)
113 			  break;
114 			f -= *xx;
115 		      }
116 		}
117 	      z = 1 << j;
118 	      if (*hn + z > 1440)
119 		return -3;
120 	      u[h] = q = hp + *hn;
121 	      *hn += z;
122 	      if (h)
123 		{
124 		  x[h] = i;
125 		  r.a0.a2.a4 = (unsigned char) l;
126 		  r.a0.a2.a3 = (unsigned char) j;
127 		  j = i >> (w - l);
128 		  r.a1 = (unsigned int) (q - u[h - 1] - j);
129 		  u[h - 1][j] = r;
130 		}
131 	      else
132 		*t = q;
133 	    }
134 	  r.a0.a2.a4 = (unsigned char) (k - w);
135 	  if (p >= v + n)
136 	    r.a0.a2.a3 = 128 + 64;
137 	  else if (*p < s)
138 	    {
139 	      r.a0.a2.a3 = (unsigned char) (*p < 256 ? 0 : 32 + 64);
140 	      r.a1 = *p++;
141 	    }
142 	  else
143 	    {
144 	      r.a0.a2.a3 = (unsigned char) (e[*p - s] + 16 + 64);
145 	      r.a1 = d[*p++ - s];
146 	    }
147 	  f = 1 << (k - w);
148 	  for (j = i >> w; j < z; j += f)
149 	    q[j] = r;
150 	  for (j = 1 << (k - 1); i & j; j >>= 1)
151 	    i ^= j;
152 	  i ^= j;
153 	  ee = (1 << w) - 1;
154 	  while ((i & ee) != x[h])
155 	    {
156 	      h--;
157 	      w -= l;
158 	      ee = (1 << w) - 1;
159 	    }
160 	}
161     }
162   return y != 0 && g != 1 ? (-5) : 0;
163 }
164 
165 unsigned int a[19] = { 3, 4, 0, 2, 2, [17] = 3, 3 };
166 unsigned int d[19];
167 A h[1440];
168 
169 int
main(void)170 main (void)
171 {
172   unsigned int b = 0, c = 0;
173   A *e = 0;
174   foo (a, 19, 19, 0, 0, &e, &b, h, &c, d);
175   exit (0);
176 }
177