/* 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 } } } } */ 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); }