diff options
author | Richard Guenther <rguenther@suse.de> | 2010-09-20 14:40:10 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-09-20 14:40:10 +0000 |
commit | 565b88862d1336a37ca7f3bbffd99c194182e961 (patch) | |
tree | f21c6617ab6ed8a7aa8f4afb71c9b2f0bd39f76d /gcc/tree-ssa-dom.c | |
parent | 5e979df36984081291bce02e95a66e849e6dc212 (diff) | |
download | gcc-565b88862d1336a37ca7f3bbffd99c194182e961.zip gcc-565b88862d1336a37ca7f3bbffd99c194182e961.tar.gz gcc-565b88862d1336a37ca7f3bbffd99c194182e961.tar.bz2 |
re PR middle-end/45705 (Useless store not optimized away)
2010-09-20 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45705
* tree-ssa-dom.c (optimize_stmt): Perform redundant store elimination.
* gcc.dg/tree-ssa/ssa-dom-dse-1.c: New testcase.
From-SVN: r164434
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c1abb40..54a35af 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2178,6 +2178,48 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si) update_stmt_if_modified (stmt); eliminate_redundant_computations (&si); stmt = gsi_stmt (si); + + /* Perform simple redundant store elimination. */ + if (gimple_assign_single_p (stmt) + && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) + { + tree lhs = gimple_assign_lhs (stmt); + tree rhs = gimple_assign_rhs1 (stmt); + tree cached_lhs; + gimple new_stmt; + if (TREE_CODE (rhs) == SSA_NAME) + { + tree tem = SSA_NAME_VALUE (rhs); + if (tem) + rhs = tem; + } + /* Build a new statement with the RHS and LHS exchanged. */ + if (TREE_CODE (rhs) == SSA_NAME) + { + gimple defstmt = SSA_NAME_DEF_STMT (rhs); + new_stmt = gimple_build_assign (rhs, lhs); + SSA_NAME_DEF_STMT (rhs) = defstmt; + } + else + new_stmt = gimple_build_assign (rhs, lhs); + gimple_set_vuse (new_stmt, gimple_vuse (stmt)); + cached_lhs = lookup_avail_expr (new_stmt, false); + if (cached_lhs + && rhs == cached_lhs) + { + basic_block bb = gimple_bb (stmt); + int lp_nr = lookup_stmt_eh_lp (stmt); + unlink_stmt_vdef (stmt); + gsi_remove (&si, true); + if (lp_nr != 0) + { + bitmap_set_bit (need_eh_cleanup, bb->index); + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, " Flagged to clear EH edges.\n"); + } + return; + } + } } /* Record any additional equivalences created by this statement. */ |