/* PR optimization/6475
   Distilled from zlib sources.  */
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-options "-O2 -frename-registers -fomit-frame-pointer -fPIC -mtune=i686" { target { { i?86-*-* x86_64-*-* } && { ia32 && fpic } } } } */
/* { dg-skip-if "exceeds eBPF stack limit" { bpf-*-* } } */

extern void exit (int);

typedef struct
{
  union
  {
    struct
    {
      unsigned char a3;
      unsigned char a4;
    } a2;
    unsigned int a5;
  } a0;
  unsigned int a1;
} A;

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)
{
  unsigned int a, c[15 + 1], f;
  int g, h;
  unsigned int i, j, k;
  int l;
  unsigned int ee;
  unsigned int *p;
  A *q, r, *u[15];
  int w;
  unsigned int x[15 + 1], *xx;
  int y;
  unsigned int z;
  p = c;
  *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
  *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
  *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
  *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
  p = b;
  i = n;
  do
    c[*p++]++;
  while (--i);
  if (c[0] == n)
    {
      *t = (A *) 0;
      *m = 0;
      return 0;
    }
  l = *m;
  for (j = 1; j <= 15; j++)
    if (c[j])
      break;
  k = j;
  if ((unsigned int) l < j)
    l = j;
  for (i = 15; i; i--)
    if (c[i])
      break;
  g = i;
  if ((unsigned int) l > i)
    l = i;
  *m = l;
  for (y = 1 << j; j < i; j++, y <<= 1)
    if ((y -= c[j]) < 0)
      return -3;
  if ((y -= c[i]) < 0)
    return -3;
  c[i] += y;
  x[1] = j = 0;
  p = c + 1;
  xx = x + 2;
  while (--i)
    *xx++ = (j += *p++);
  p = b;
  i = 0;
  do
    if ((j = *p++) != 0)
      v[x[j]++] = i;
  while (++i < n);
  n = x[g];
  x[0] = i = 0;
  p = v;
  h = -1;
  w = -l;
  u[0] = (A *) 0;
  q = (A *) 0;
  z = 0;
  for (; k <= g; k++)
    {
      a = c[k];
      while (a--)
	{
	  while (k > w + l)
	    {
	      h++;
	      w += l;
	      z = g - w;
	      z = z > (unsigned int) l ? l : z;
	      if ((f = 1 << (j = k - w)) > a + 1)
		{
		  f -= a + 1;
		  xx = c + k;
		  if (j < z)
		    while (++j < z)
		      {
			if ((f <<= 1) <= *++xx)
			  break;
			f -= *xx;
		      }
		}
	      z = 1 << j;
	      if (*hn + z > 1440)
		return -3;
	      u[h] = q = hp + *hn;
	      *hn += z;
	      if (h)
		{
		  x[h] = i;
		  r.a0.a2.a4 = (unsigned char) l;
		  r.a0.a2.a3 = (unsigned char) j;
		  j = i >> (w - l);
		  r.a1 = (unsigned int) (q - u[h - 1] - j);
		  u[h - 1][j] = r;
		}
	      else
		*t = q;
	    }
	  r.a0.a2.a4 = (unsigned char) (k - w);
	  if (p >= v + n)
	    r.a0.a2.a3 = 128 + 64;
	  else if (*p < s)
	    {
	      r.a0.a2.a3 = (unsigned char) (*p < 256 ? 0 : 32 + 64);
	      r.a1 = *p++;
	    }
	  else
	    {
	      r.a0.a2.a3 = (unsigned char) (e[*p - s] + 16 + 64);
	      r.a1 = d[*p++ - s];
	    }
	  f = 1 << (k - w);
	  for (j = i >> w; j < z; j += f)
	    q[j] = r;
	  for (j = 1 << (k - 1); i & j; j >>= 1)
	    i ^= j;
	  i ^= j;
	  ee = (1 << w) - 1;
	  while ((i & ee) != x[h])
	    {
	      h--;
	      w -= l;
	      ee = (1 << w) - 1;
	    }
	}
    }
  return y != 0 && g != 1 ? (-5) : 0;
}

unsigned int a[19] = { 3, 4, 0, 2, 2, [17] = 3, 3 };
unsigned int d[19];
A h[1440];

int
main (void)
{
  unsigned int b = 0, c = 0;
  A *e = 0;
  foo (a, 19, 19, 0, 0, &e, &b, h, &c, d);
  exit (0);
}
