diff options
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. */ |