aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-09-20 14:40:10 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-09-20 14:40:10 +0000
commit565b88862d1336a37ca7f3bbffd99c194182e961 (patch)
treef21c6617ab6ed8a7aa8f4afb71c9b2f0bd39f76d
parent5e979df36984081291bce02e95a66e849e6dc212 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c19
-rw-r--r--gcc/tree-ssa-dom.c42
4 files changed, 71 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b35e74..baba93b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-20 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/45705
+ * tree-ssa-dom.c (optimize_stmt): Perform redundant store elimination.
+
2010-09-20 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/45695
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d5340a7..93a35b6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-20 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/45705
+ * gcc.dg/tree-ssa/ssa-dom-dse-1.c: New testcase.
+
2010-09-20 Michael Matz <matz@suse.de>
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 0000000..504e4bc
--- /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 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. */