diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-24 12:13:45 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-24 12:13:45 +0000 |
commit | 7f0432c37434f3cffa9199233c00fb2b55e2b076 (patch) | |
tree | 9f6dcc9f0199cf56118ddb5bed8a117a7de8be67 /gcc/tree-ssa-dce.c | |
parent | 6a60f216c210e3a38096d326901eb187beaf4954 (diff) | |
download | gcc-7f0432c37434f3cffa9199233c00fb2b55e2b076.tar.gz |
* gcc.dg/tree-ssa/pr23382.c: Avoid DCE from eliminating dead variable.
* tree-ssa-dce.c (eliminate_unnecesary_stmts): Remove dead LHS of calls.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121108 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dce.c')
-rw-r--r-- | gcc/tree-ssa-dce.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 381d91016e0..3631add456f 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -688,7 +688,32 @@ eliminate_unnecessary_stmts (void) { tree call = get_call_expr_in (t); if (call) - notice_special_calls (call); + { + tree name; + + /* When LHS of var = call (); is dead, simplify it into + call (); saving one operand. */ + if (TREE_CODE (t) == GIMPLE_MODIFY_STMT + && (TREE_CODE ((name = GIMPLE_STMT_OPERAND (t, 0))) + == SSA_NAME) + && !TEST_BIT (processed, SSA_NAME_VERSION (name))) + { + something_changed = true; + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "Deleting LHS of call: "); + print_generic_stmt (dump_file, t, TDF_SLIM); + fprintf (dump_file, "\n"); + } + push_stmt_changes (bsi_stmt_ptr (i)); + TREE_BLOCK (call) = TREE_BLOCK (t); + bsi_replace (&i, call, false); + maybe_clean_or_replace_eh_stmt (t, call); + mark_symbols_for_renaming (call); + pop_stmt_changes (bsi_stmt_ptr (i)); + } + notice_special_calls (call); + } bsi_next (&i); } } |