char buf[64];
void bar (int);
void
foo (void)
{
int i;
const char *ext = 0;
for (i = 1; i < 3; i++)
{
if (i == 1)
ext = "extern ";
bar (i);
__builtin_strcpy (buf, ext);
bar (i);
}
}
ICEs at -O2 on x86_64-redhat-linux (but likely any other target).
In:
/* FIXME. If REPL is a constant, we need to fold STMT.
However, fold_stmt wants a pointer to the statement, because
it may happen that it needs to replace the whole statement
with a new expression. Since the current def-use machinery
does not return pointers to statements, we call fold_stmt
with the address of a local temporary, if that call changes
the temporary then we fall on our swords.
Note that all this will become unnecessary soon. This
pass is being replaced with a proper copy propagation pass
for 4.1 (dnovillo, 2004-09-17). */
if (TREE_CODE (repl) != SSA_NAME)
{
tree tmp = stmt;
fold_stmt (&tmp);
if (tmp != stmt)
abort ();
}
that fold_stmt changes
__builtin_strcpy (&bufD.1464, &"extern "[0])
into
__builtin_memcpy (&bufD.1464, &"extern "[0], 9)
and as tmp != stmt it aborts.
--
Summary: ICE in replace_immediate_uses
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jakub at gcc dot gnu dot org
CC: dnovillo at redhat dot com,drepper at redhat dot
com,gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18043