summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.c
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-18 17:39:47 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-18 17:39:47 +0000
commit81fdab0ff0f31bdd66cedb925c57f1994e02502c (patch)
tree41b0ff9a0dade709f61ae4c8b7f6c1e781617743 /gcc/tree-ssa.c
parentada40935ef7cd6d2300ac09d22584a87e0dcd93c (diff)
downloadgcc-81fdab0ff0f31bdd66cedb925c57f1994e02502c.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89233 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r--gcc/tree-ssa.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index affa3047420..4362e01aff8 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