aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-12-10 09:29:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-12-10 09:29:05 +0000
commit128227683ace7606605d204bd75b851a22043d6d (patch)
tree9a4757f31af85f3b526ae2e96a7b2978bf95593a /gcc
parent092444af0474ed194abe53ea7cbd950dd7e2cdbd (diff)
downloadgcc-128227683ace7606605d204bd75b851a22043d6d.zip
gcc-128227683ace7606605d204bd75b851a22043d6d.tar.gz
gcc-128227683ace7606605d204bd75b851a22043d6d.tar.bz2
re PR tree-optimization/64191 (indirect clobbers messes up dead code elimination in loop calling dtor)
2014-12-10 Richard Biener <rguenther@suse.de> PR tree-optimization/64191 * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Do not mark clobbers as necessary. (eliminate_unnecessary_stmts): Keep clobbers live if we can. * g++.dg/pr64191.C: Make sure we can DCE empty loops with indirect clobbers. From-SVN: r218566
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/pr64191.C25
-rw-r--r--gcc/tree-ssa-dce.c22
4 files changed, 58 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6300829..4ceefc8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-12-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/64191
+ * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Do not
+ mark clobbers as necessary.
+ (eliminate_unnecessary_stmts): Keep clobbers live if we can.
+
2014-12-10 Jakub Jelinek <jakub@redhat.com>
PR target/63594
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9d03fb8..8d18ec9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/64191
+ * g++.dg/pr64191.C: Make sure we can DCE empty loops with
+ indirect clobbers.
+
2014-12-09 Alan Lawrence <alan.lawrence@arm.com>
PR target/63870
diff --git a/gcc/testsuite/g++.dg/pr64191.C b/gcc/testsuite/g++.dg/pr64191.C
new file mode 100644
index 0000000..e40a62d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr64191.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-cddce1" }
+
+struct Bar
+{
+ int i;
+ ~Bar() { }
+};
+void bar_dtor_loop(Bar* p, unsigned int n)
+{
+ if (p) {
+ Bar* e = p + n;
+ while (e > p) {
+ --e;
+ e->~Bar();
+ }
+ }
+}
+
+// The clobber in ~Bar should persist but those inlined into
+// bar_dtor_loop not, nor should the loop therein
+
+// { dg-final { scan-tree-dump-times "CLOBBER" 1 "cddce1" } }
+// { dg-final { scan-tree-dump-times "if" 0 "cddce1" } }
+// { dg-final { cleanup-tree-dump "cddce1" } }
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 1d887c2..7f68770 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -292,8 +292,7 @@ mark_stmt_if_obviously_necessary (gimple stmt, bool aggressive)
break;
case GIMPLE_ASSIGN:
- if (TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
- && TREE_CLOBBER_P (gimple_assign_rhs1 (stmt)))
+ if (gimple_clobber_p (stmt))
return;
break;
@@ -1362,6 +1361,25 @@ eliminate_unnecessary_stmts (void)
/* If GSI is not necessary then remove it. */
if (!gimple_plf (stmt, STMT_NECESSARY))
{
+ /* Keep clobbers that we can keep live live. */
+ if (gimple_clobber_p (stmt))
+ {
+ ssa_op_iter iter;
+ use_operand_p use_p;
+ bool dead = false;
+ FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
+ {
+ tree name = USE_FROM_PTR (use_p);
+ if (!SSA_NAME_IS_DEFAULT_DEF (name)
+ && !bitmap_bit_p (processed, SSA_NAME_VERSION (name)))
+ {
+ dead = true;
+ break;
+ }
+ }
+ if (!dead)
+ continue;
+ }
if (!is_gimple_debug (stmt))
something_changed = true;
remove_dead_stmt (&gsi, bb);