From: Jakub Jelinek Date: Tue, 9 Apr 2013 10:04:24 +0000 (+0200) Subject: re PR tree-optimization/56854 (error: non-decl/MEM_REF LHS in clobber statement) X-Git-Tag: releases/gcc-4.9.0~6597 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=39307ba788ba09db3d35eb8d920085bb9aebbece;p=thirdparty%2Fgcc.git re PR tree-optimization/56854 (error: non-decl/MEM_REF LHS in clobber statement) PR tree-optimization/56854 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't forward into clobber stmts if it would change MEM_REF lhs into non-MEM_REF. * g++.dg/torture/pr56854.C: New test. From-SVN: r197625 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d25241f42691..407676933695 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-04-09 Jakub Jelinek + + PR tree-optimization/56854 + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't + forward into clobber stmts if it would change MEM_REF lhs into + non-MEM_REF. + 2013-04-09 Maxim Kuvyrkov * tree.c (type_hash_lookup, type_hash_add): Make static. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 73935171e319..dac8f36bc7a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-09 Jakub Jelinek + + PR tree-optimization/56854 + * g++.dg/torture/pr56854.C: New test. + 2013-04-08 Thomas Koenig PR fortran/56782 diff --git a/gcc/testsuite/g++.dg/torture/pr56854.C b/gcc/testsuite/g++.dg/torture/pr56854.C new file mode 100644 index 000000000000..fc7e30299f68 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr56854.C @@ -0,0 +1,24 @@ +// PR tree-optimization/56854 +// { dg-do compile } + +inline void * +operator new (__SIZE_TYPE__, void *p) throw () +{ + return p; +} + +struct A +{ + int a; + A () : a (0) {} + ~A () {} + A &operator= (const A &v) { this->~A (); new (this) A (v); return *this; } +}; +A b[4], c[4]; + +void +foo () +{ + for (int i = 0; i < 4; ++i) + c[i] = b[i]; +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index edcf92918b7d..26b076146d3a 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -826,7 +826,11 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, && integer_zerop (TREE_OPERAND (lhs, 1)) && useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)), - TREE_TYPE (gimple_assign_rhs1 (use_stmt)))) + TREE_TYPE (gimple_assign_rhs1 (use_stmt))) + /* Don't forward anything into clobber stmts if it would result + in the lhs no longer being a MEM_REF. */ + && (!gimple_clobber_p (use_stmt) + || TREE_CODE (TREE_OPERAND (def_rhs, 0)) == MEM_REF)) { tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0); tree new_offset, new_base, saved, new_lhs;