aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2015-04-27 22:01:28 -0600
committerJeff Law <law@gcc.gnu.org>2015-04-27 22:01:28 -0600
commit009b7fc1870354e2c70d21c88fa671113a8e5f13 (patch)
treea59c6eeaf6d12c3a659434c06b6cf3b9bc71f7ba
parent3954ead0d88676855e877a8a20c05f49256260d7 (diff)
downloadgcc-009b7fc1870354e2c70d21c88fa671113a8e5f13.zip
gcc-009b7fc1870354e2c70d21c88fa671113a8e5f13.tar.gz
gcc-009b7fc1870354e2c70d21c88fa671113a8e5f13.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65217.c4
-rw-r--r--gcc/tree-ssa-dom.c14
4 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fff0015..1a82f17 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67bdd69..0fc2384 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.target/i386/pr65217.c b/gcc/testsuite/gcc.target/i386/pr65217.c
index 3f495b2..d5c9be5 100644
--- a/gcc/testsuite/gcc.target/i386/pr65217.c
+++ b/gcc/testsuite/gcc.target/i386/pr65217.c
@@ -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)
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index a67b4e4..c7d427b 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -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)