This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Trunk GCC hangs while compiling cpu2k6/perlbench at -O2
- From: Grigory Zagorodnev <grigory_zagorodnev at linux dot intel dot com>
- To: gcc at gcc dot gnu dot org, "H. J. Lu" <hjl at lucon dot org>
- Date: Mon, 29 Jan 2007 13:22:20 +0300
- Subject: Trunk GCC hangs while compiling cpu2k6/perlbench at -O2
GCC 4.3 compiler revision 121206 goes into infinitive loop while
compiling cpu2k6/perlbench source file regcomp.c at -O2 optimization
level on x86_64-redhat-linux.
GDB attached to cc1 process, gives the hang point:
0x0000000000711bd8 in solve_graph (graph=0xd37150)
at /home/testbot/bootstrap/009454/src/gcc/tree-ssa-structalias.c:1619
1619 if (!TEST_BIT (ti->visited, i) && find (i) == i)
You can find the minimal reproducer attached to this mail. It looks like
the problem first appeared at the beginning of the last week. I'll
start binary search to detect the check-in causing this failure.
- Grigory
typedef struct RExC_state_t
{
char *end;
char *parse;
} RExC_state_t;
struct regnode_string
{
unsigned char str_len;
char string[1];
};
static void *regatom (RExC_state_t * pRExC_state, int *flagp);
static void *
regpiece (RExC_state_t * pRExC_state, int *flagp)
{
return regatom (0, 0);
}
static void *
regbranch (RExC_state_t * pRExC_state, int *flagp, int first)
{
return regpiece (0, 0);
}
static void *
reg (RExC_state_t * pRExC_state, int paren, int *flagp)
{
return regbranch (0, 0, 1);
}
void *
Perl_pregcomp (char *exp, char *xend, void *pm)
{
return reg (0, 0, 0);
}
static void *
regatom (RExC_state_t * pRExC_state, int *flagp)
{
register void *ret = 0;
int flags;
tryagain:
switch (*(pRExC_state->parse))
{
case '(':
ret = reg (pRExC_state, 1, &flags);
if (flags & 0x8)
{
goto tryagain;
}
break;
default:
{
register unsigned long len;
register unsigned ender;
register char *p;
char *oldp, *s;
unsigned long numlen;
unsigned long foldlen;
unsigned char tmpbuf[6 + 1], *foldbuf;
defchar:
s = (((struct regnode_string *) ret)->string);
for (len = 0, p = (pRExC_state->parse) - 1;
len < 127 && p < (pRExC_state->end); len++)
{
if (((*p) == '*' || (*p) == '+' || (*p) == '?'
|| ((*p) == '{' && regcurly (p))))
{
unsigned long unilen;
for (foldbuf = tmpbuf; foldlen; foldlen -= numlen)
{
reguni (pRExC_state, ender, s, &unilen);
s += unilen;
}
break;
}
unsigned long unilen;
reguni (pRExC_state, ender, s, &unilen);
s += unilen;
}
};
break;
}
return (ret);
}