re PR tree-optimization/65217 (__builtin_unreachable in if statement causes bad assembly generation)

PR tree-optimization/65217
	* tree-ssa-dom.c (record_equality): Given two SSA_NAMEs, if just one
	of them has a single use, make sure it is the LHS of the implied
	copy.

        PR tree-optimization/65217
	* gcc.target/i386/pr65217.c: Remove XFAIL.

From-SVN: r222499
This commit is contained in:
Jeff Law 2015-04-27 22:01:28 -06:00 committed by Jeff Law
parent 3954ead0d8
commit 009b7fc187
4 changed files with 28 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2015-04-27 Jeff Law <law@redhat.com>
PR tree-optimization/65217
* tree-ssa-dom.c (record_equality): Given two SSA_NAMEs, if just one
of them has a single use, make sure it is the LHS of the implied
copy.
2015-04-28 Alan Modra <amodra@gmail.com>
PR target/65810

View File

@ -1,3 +1,8 @@
2015-04-27 Jeff Law <law@redhat.com>
PR tree-optimization/65217
* gcc.target/i386/pr65217.c: Remove XFAIL.
2015-04-27 Andre Vehreschild <vehre@gmx.de>
PR fortran/60322

View File

@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O" } */
/* { dg-final { scan-assembler-not "negl" { xfail *-*-* } } } */
/* { dg-final { scan-assembler-not "andl" { xfail *-*-* } } } */
/* { dg-final { scan-assembler-not "negl" } } */
/* { dg-final { scan-assembler-not "andl" } } */
int
test(int n)

View File

@ -1762,6 +1762,20 @@ record_equality (tree x, tree y)
if (tree_swap_operands_p (x, y, false))
std::swap (x, y);
/* Most of the time tree_swap_operands_p does what we want. But there's
cases where we we know one operand is better for copy propagation than
the other. Given no other code cares about ordering of equality
comparison operators for that purpose, we just handle the special cases
here. */
if (TREE_CODE (x) == SSA_NAME && TREE_CODE (y) == SSA_NAME)
{
/* If one operand is a single use operand, then make it
X. This will preserve its single use properly and if this
conditional is eliminated, the computation of X can be
eliminated as well. */
if (has_single_use (y) && ! has_single_use (x))
std::swap (x, y);
}
if (TREE_CODE (x) == SSA_NAME)
prev_x = SSA_NAME_VALUE (x);
if (TREE_CODE (y) == SSA_NAME)