diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-18 17:39:47 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-18 17:39:47 +0000 |
commit | 81fdab0ff0f31bdd66cedb925c57f1994e02502c (patch) | |
tree | 41b0ff9a0dade709f61ae4c8b7f6c1e781617743 /gcc/tree-ssa.c | |
parent | ada40935ef7cd6d2300ac09d22584a87e0dcd93c (diff) | |
download | gcc-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.c | 20 |
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 |