https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118358
Bug ID: 118358
Summary: [15 Regression] LRA hangs on xstormy16
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: law at gcc dot gnu.org
Target Milestone: ---
Tamar's recent changes for affine folding to improve exchange2's performance on
some architectures is causing xstormy16 to go into an infinite loop in LRA
compiling the attached testcase (slightly simplified from gcc.dg/20020426-2.c).
Compile with -O2 with an xstormy16-elf cross compiler to observe the hang.
This could well be a problem with the xstormy port; I haven't tried to asses
that.
/* 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;
for (j = 1; j <= 15; j++)
if (c[j])
break;
if ((unsigned int) l < j)
l = j;
for (i = 15; i; i--)
if (c[i])
break;
g = i;
for (y = 1 << j; j < i; j++, y <<= 1)
if ((y -= c[j]) < 0)
return -3;
h = -1;
z = 0;
for (; k <= g; k++)
{
while (k > w + l)
{
h++;
w += l;
if ((f = 1 << (j = k - w)) > a + 1)
;
z = 1 << j;
if (*hn + z > 1440)
return -3;
u[h] = q = hp + *hn;
r.a0.a2.a4 = (unsigned char) l;
r.a1 = (unsigned int) (q - u[h - 1] - j);
}
for (j = i >> w; j < z; j += f)
q[j] = r;
for (j = 1 << (k - 1); i & j; j >>= 1)
i ^= j;
while ((i & ee) != x[h])
{
h--;
w -= l;
}
}
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);
}