Commit 12822768 by Richard Biener Committed by Richard Biener

re PR tree-optimization/64191 (indirect clobbers messes up dead code elimination…

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
parent 092444af
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
......
// { 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" } }
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment