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:
parent
18e4be8561
commit
bca9e17b5a
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue