From: Richard Biener Date: Wed, 10 Dec 2014 09:29:05 +0000 (+0000) Subject: re PR tree-optimization/64191 (indirect clobbers messes up dead code elimination... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=128227683ace7606605d204bd75b851a22043d6d;p=gcc.git re PR tree-optimization/64191 (indirect clobbers messes up dead code elimination in loop calling dtor) 2014-12-10 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63008297238..4ceefc83240 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-12-10 Richard Biener + + 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 PR target/63594 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9d03fb8e852..8d18ec974e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-12-10 Richard Biener + + PR tree-optimization/64191 + * g++.dg/pr64191.C: Make sure we can DCE empty loops with + indirect clobbers. + 2014-12-09 Alan Lawrence PR target/63870 diff --git a/gcc/testsuite/g++.dg/pr64191.C b/gcc/testsuite/g++.dg/pr64191.C new file mode 100644 index 00000000000..e40a62d0843 --- /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 1d887c28f86..7f68770e40e 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);