diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b35e7462866..baba93b09d27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-09-20 Richard Guenther + + PR tree-optimization/45705 + * tree-ssa-dom.c (optimize_stmt): Perform redundant store elimination. + 2010-09-20 Jakub Jelinek PR rtl-optimization/45695 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5340a765f27..93a35b6cd686 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-20 Richard Guenther + + PR tree-optimization/45705 + * gcc.dg/tree-ssa/ssa-dom-dse-1.c: New testcase. + 2010-09-20 Michael Matz PR testsuite/45706 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c new file mode 100644 index 000000000000..504e4bc038d8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int x; +void +foo (void) +{ + if (x == 0) + x = 0; +} +void +bar (int i) +{ + if (x == i) + x = i; +} + +/* { dg-final { scan-tree-dump-not "x =" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c1abb40c529c..54a35af4a855 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. */