+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
+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
--- /dev/null
+// { 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" } }
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;
/* 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);