From: Diego Novillo Date: Mon, 18 Oct 2004 17:39:47 +0000 (+0000) Subject: re PR tree-optimization/17656 (internal compiler error: in replace_immediate_uses... X-Git-Tag: releases/gcc-4.0.0~3935 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bca9e17b5aade3e19ae49ff9c211510674b46a02;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e461b8b306e..c6bcd56d4ce7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-10-18 Diego Novillo + + 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 * pointer-set.c (hash1): Don't use libm functions in fallback case. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 146312b98b20..0cf098bf76ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-10-18 Diego Novillo + + PR tree-optimization/17656 + * testsuite/gcc.c-torture/compile/pr17656.c: New test. + 2004-10-18 Nathan Sidwell * g++.dg/eh/shadow1.C: New. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr17656.c b/gcc/testsuite/gcc.c-torture/compile/pr17656.c new file mode 100644 index 000000000000..0acb71f0c5e3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr17656.c @@ -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; +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index affa30474200..4362e01aff8d 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -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