re PR tree-optimization/56661 (Incorrect code with -O1 -ftree-pre)

2013-03-20  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56661
	* tree-ssa-sccvn.c (visit_use): Only value-number calls if
	the result does not have to be distinct.

	* gcc.dg/torture/pr56661.c: New testcase.

From-SVN: r196825
This commit is contained in:
Richard Biener 2013-03-20 13:26:19 +00:00 committed by Richard Biener
parent 54714c680a
commit 92a8d7a733
4 changed files with 64 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2013-03-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/56661
* tree-ssa-sccvn.c (visit_use): Only value-number calls if
the result does not have to be distinct.
2013-03-20 Richard Biener <rguenther@suse.de>
* tree-inline.c (copy_tree_body_r): Sync MEM_REF code with

View File

@ -1,3 +1,8 @@
2013-03-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/56661
* gcc.dg/torture/pr56661.c: New testcase.
2013-03-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR rtl-optimization/56605

View File

@ -0,0 +1,46 @@
/* { dg-do run } */
__attribute__((noinline, noclone)) void
bar (int *b)
{
b[0] = b[1] = b[2] = 1;
}
__attribute__((noinline, noclone)) int
baz (int x)
{
if (x != 1)
__builtin_abort ();
}
void
foo (int x)
{
if (x == 0)
{
int *b = __builtin_malloc (3 * sizeof (int));
while (b[0])
;
}
else if (x == 1)
{
int i, j;
int *b = __builtin_malloc (3 * sizeof (int));
for (i = 0; i < 2; i++)
{
bar (b);
for (j = 0; j < 3; ++j)
baz (b[j]);
baz (b[0]);
}
}
}
int
main ()
{
int x = 1;
asm volatile ("" : "+r" (x));
foo (x);
return 0;
}

View File

@ -3506,8 +3506,13 @@ visit_use (tree use)
We can value number 2 calls to the same function with the
same vuse and the same operands which are not subsequent
the same, because there is no code in the program that can
compare the 2 values. */
|| gimple_vdef (stmt)))
compare the 2 values... */
|| (gimple_vdef (stmt)
/* ... unless the call returns a pointer which does
not alias with anything else. In which case the
information that the values are distinct are encoded
in the IL. */
&& !(gimple_call_return_flags (stmt) & ERF_NOALIAS))))
changed = visit_reference_op_call (lhs, stmt);
else
changed = defs_to_varying (stmt);