re PR tree-optimization/17656 (internal compiler error: in replace_immediate_uses, at tree-ssa.c:1041)

PR tree-optimization/17656
	* tree-ssa.c (replace_immediate_uses): When replacing a
	constant, if the call to fold_stmt produced a different
	statement, get an appropriate statement pointer by scanning
	STMT's basic block.

	PR tree-optimization/17656
	* testsuite/gcc.c-torture/compile/pr17656.c: New test.

From-SVN: r89233
This commit is contained in:
Diego Novillo 2004-10-18 17:39:47 +00:00 committed by Diego Novillo
parent 18e4be8561
commit bca9e17b5a
4 changed files with 49 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2004-10-18 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/17656
* tree-ssa.c (replace_immediate_uses): When replacing a
constant, if the call to fold_stmt produced a different
statement, get an appropriate statement pointer by scanning
STMT's basic block.
2004-10-18 Richard Henderson <rth@redhat.com>
* pointer-set.c (hash1): Don't use libm functions in fallback case.

View File

@ -1,3 +1,8 @@
2004-10-18 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/17656
* testsuite/gcc.c-torture/compile/pr17656.c: New test.
2004-10-18 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/eh/shadow1.C: New.

View File

@ -0,0 +1,18 @@
int sprintf (char *s, const char *format, ...);
int foo(int i, int j)
{
char *buf, *str;
if (i)
str = "";
else if (j)
str = "";
else
return 1;
/* We were propagating &""[0] here and not calling fold_stmt with a
proper statement pointer. */
sprintf(buf, str);
return 0;
}

View File

@ -1093,7 +1093,8 @@ replace_immediate_uses (tree var, tree repl)
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.
the temporary then we fallback on looking for a proper
pointer to STMT by scanning STMT's basic block.
Note that all this will become unnecessary soon. This
pass is being replaced with a proper copy propagation pass
@ -1103,7 +1104,22 @@ replace_immediate_uses (tree var, tree repl)
tree tmp = stmt;
fold_stmt (&tmp);
if (tmp != stmt)
abort ();
{
basic_block bb = bb_for_stmt (stmt);
block_stmt_iterator si;
/* Start iterating at the start of the basic block
holding STMT until we reach it. This is slow, but
it's the only way to get a statement pointer
reliably. */
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
if (bsi_stmt (si) == stmt)
{
fold_stmt (bsi_stmt_ptr (si));
stmt = bsi_stmt (si);
break;
}
}
}
/* If REPL is a pointer, it may have different memory tags associated