bd52d17906
too large to list, but see: http://gcc.gnu.org/gcc-3.4/changes.html http://gcc.gnu.org/gcc-4.0/changes.html http://gcc.gnu.org/gcc-4.1/changes.html for the details.
178 lines
3.3 KiB
C
178 lines
3.3 KiB
C
/* 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-*-* } && ilp32 } } } */
|
|
/* { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 } */
|
|
|
|
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);
|
|
}
|