re PR tree-optimization/43655 (-ftree-ter causes FAIL: g++.old-deja/g++.law/temps5.C execution test)

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: r167955
This commit is contained in:
Jakub Jelinek 2010-12-16 22:44:02 +01:00 committed by Jakub Jelinek
parent 94406344b5
commit bcdae749d0
4 changed files with 49 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2010-12-16 Jakub Jelinek <jakub@redhat.com>
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.
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46404

View File

@ -1,3 +1,8 @@
2010-12-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/43655
* g++.dg/opt/pr43655.C: New test.
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46404

View File

@ -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 ();
}

View File

@ -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. */