From: Richard Biener Date: Wed, 7 May 2014 07:59:26 +0000 (+0000) Subject: backport: re PR tree-optimization/58246 (wrong code at -O1 and above) X-Git-Tag: releases/gcc-4.7.4~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a6547fc50c909fe39a6e8ff0df3213188fcd7d8;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/58246 (wrong code at -O1 and above) 2014-05-07 Richard Biener Backport from mainline 2013-08-29 Richard Biener PR tree-optimization/58246 * tree-ssa-dce.c (mark_aliased_reaching_defs_necessary_1): Properly handle the dominance check inside a basic-block. * gcc.dg/torture/pr58246.c: New testcase. From-SVN: r210141 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 030f3ffcd74d..804f3231b4a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-05-07 Richard Biener + + Backport from mainline + 2013-08-29 Richard Biener + + PR tree-optimization/58246 + * tree-ssa-dce.c (mark_aliased_reaching_defs_necessary_1): Properly + handle the dominance check inside a basic-block. + 2014-05-06 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6b5f1f576203..811cff5c7204 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-05-07 Richard Biener + + Backport from mainline + 2013-08-29 Richard Biener + + PR tree-optimization/58246 + * gcc.dg/torture/pr58246.c: New testcase. + 2014-05-06 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.dg/torture/pr58246.c b/gcc/testsuite/gcc.dg/torture/pr58246.c new file mode 100644 index 000000000000..5417abf913d5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58246.c @@ -0,0 +1,21 @@ +/* { dg-do run } */ + +extern void abort (void); + +int a, b; + +int main () +{ + int t[2] = {1,1}; + + for (a = 0; a < 2; a++) + { + b ^= t[a]; + t[a] = t[1] = 0; + } + + if (b != 1) + abort (); + + return 0; +} diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index ace9ef9972d4..d99e77130d42 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -576,6 +576,11 @@ mark_aliased_reaching_defs_necessary_1 (ao_ref *ref, tree vdef, void *data) in the references (gcc.c-torture/execute/pr42142.c). The simplest way is to check if the kill dominates the use. */ + /* But when both are in the same block we cannot + easily tell whether we came from a backedge + unless we decide to compute stmt UIDs + (see PR58246). */ + && (basic_block) data != gimple_bb (def_stmt) && dominated_by_p (CDI_DOMINATORS, (basic_block) data, gimple_bb (def_stmt)) && operand_equal_p (ref->ref, lhs, 0))