From: Jakub Jelinek Date: Sun, 16 Jan 2011 20:21:42 +0000 (+0100) Subject: backport: re PR tree-optimization/43655 (-ftree-ter causes FAIL: g++.old-deja/g+... X-Git-Tag: releases/gcc-4.5.3~303 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07d76b8988b7fc149a63e2ed07f1f03790da6c85;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/43655 (-ftree-ter causes FAIL: g++.old-deja/g++.law/temps5.C execution test) Backport from mainline 2010-12-16 Jakub Jelinek PR tree-optimization/43655 * tree-ssa-ter.c (is_replaceable_p): Don't use gimple_references_memory_p for -O0, instead check for load by looking at rhs. * g++.dg/opt/pr43655.C: New test. From-SVN: r168866 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d65bebc20198..db6b41f75757 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,11 @@ Backport from mainline 2010-12-16 Jakub Jelinek + PR tree-optimization/43655 + * tree-ssa-ter.c (is_replaceable_p): Don't use + gimple_references_memory_p for -O0, instead check for load + by looking at rhs. + PR debug/46893 * cfgexpand.c (expand_debug_expr): If GET_MODE (op0) is VOIDmode, use TYPE_MODE (TREE_TYPE (tem)) instead of mode1. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd8d27dc2a47..b83af10d258a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backport from mainline 2010-12-16 Jakub Jelinek + PR tree-optimization/43655 + * g++.dg/opt/pr43655.C: New test. + PR debug/46893 * gcc.dg/pr46893.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr43655.C b/gcc/testsuite/g++.dg/opt/pr43655.C new file mode 100644 index 000000000000..f7e370b9e426 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr43655.C @@ -0,0 +1,34 @@ +// PR tree-optimization/43655 +// { dg-do run } +// { dg-options "-O0 -ftree-ter" } + +extern "C" void abort (); + +struct C +{ + C (int i) : val(i) { } + C (const C& c) : val(c.val) { } + ~C (void) { val = 999; } + C& operator = (const C& c) { val = c.val; return *this; } + C& inc (int i) { val += i; return *this; } + int val; +}; + +C +f () +{ + return C (3); +} + +C +f (int i) +{ + return f ().inc (i); +} + +int +main () +{ + if (f (2).val != 5) + abort (); +} diff --git a/gcc/tree-ssa-ter.c b/gcc/tree-ssa-ter.c index 902b1f07f362..8c25748a94bb 100644 --- a/gcc/tree-ssa-ter.c +++ b/gcc/tree-ssa-ter.c @@ -416,7 +416,9 @@ is_replaceable_p (gimple stmt) return false; /* Without alias info we can't move around loads. */ - if (gimple_references_memory_p (stmt) && !optimize) + if (!optimize + && gimple_assign_single_p (stmt) + && !is_gimple_val (gimple_assign_rhs1 (stmt))) return false; /* Float expressions must go through memory if float-store is on. */