From 7ec67e2af8d310e18dd894c9836c28254773bd0c Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 21 May 2013 08:11:23 +0000 Subject: [PATCH] re PR tree-optimization/57303 (struct miscompiled at -O1 and above) 2013-05-21 Richard Biener PR tree-optimization/57303 * tree-ssa-sink.c (statement_sink_location): Improve killing stmt detection and properly handle self-assignments. * gcc.dg/torture/pr57303.c: New testcase. From-SVN: r199135 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/torture/pr57303.c | 33 ++++++++++++++++++++++++++ gcc/tree-ssa-sink.c | 18 ++++++++++---- 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr57303.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6113341ba7..0a7c1e701c3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-05-21 Richard Biener + + PR tree-optimization/57303 + * tree-ssa-sink.c (statement_sink_location): Improve killing + stmt detection and properly handle self-assignments. + 2013-05-21 Christian Bruel * dwarf2out.c (multiple_reg_loc_descriptor): Use dbx_reg_number for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f78e672b66b..0783914af15 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-21 Richard Biener + + PR tree-optimization/57303 + * gcc.dg/torture/pr57303.c: New testcase. + 2013-05-21 Jakub Jelinek PR tree-optimization/57321 diff --git a/gcc/testsuite/gcc.dg/torture/pr57303.c b/gcc/testsuite/gcc.dg/torture/pr57303.c new file mode 100644 index 00000000000..1ddb5a8aab3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57303.c @@ -0,0 +1,33 @@ +/* { dg-do run } */ + +void abort (void); + +struct S0 +{ + int f0; +}; +struct S1 +{ + struct S0 f0; +}; + +struct S1 x = { {0} }; +struct S1 y = { {1} }; + +static void +foo (struct S0 p) +{ + struct S0 *l = &y.f0; + *l = x.f0; + if (p.f0) + *l = *l; +} + +int +main () +{ + foo(y.f0); + if (y.f0.f0 != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index 0d9029bc66e..87a0a599110 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -331,11 +331,19 @@ statement_sink_location (gimple stmt, basic_block frombb, gimple use_stmt = USE_STMT (use_p); /* A killing definition is not a use. */ - if (gimple_assign_single_p (use_stmt) - && gimple_vdef (use_stmt) - && operand_equal_p (gimple_assign_lhs (stmt), - gimple_assign_lhs (use_stmt), 0)) - continue; + if ((gimple_has_lhs (use_stmt) + && operand_equal_p (gimple_assign_lhs (stmt), + gimple_get_lhs (use_stmt), 0)) + || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt))) + { + /* If use_stmt is or might be a nop assignment then USE_STMT + acts as a use as well as definition. */ + if (stmt != use_stmt + && ref_maybe_used_by_stmt_p (use_stmt, + gimple_assign_lhs (stmt))) + return false; + continue; + } if (gimple_code (use_stmt) != GIMPLE_PHI) return false; -- 2.30.2