From a63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8 Mon Sep 17 00:00:00 2001
From: Tom de Vries <tom@codesourcery.com>
Date: Wed, 23 Oct 2013 13:26:45 +0000
Subject: [PATCH] Add missing check in stmt_local_def for tail-merge.

2013-10-22  Tom de Vries  <tom@codesourcery.com>

	PR tree-optimization/58805
	* tree-ssa-tail-merge.c (stmt_local_def): Add gimple_vdef check.

	* gcc.dg/pr58805.c: New test.

From-SVN: r203973
---
 gcc/ChangeLog                  |  5 +++++
 gcc/testsuite/ChangeLog        |  5 +++++
 gcc/testsuite/gcc.dg/pr58805.c | 24 ++++++++++++++++++++++++
 gcc/tree-ssa-tail-merge.c      |  3 ++-
 4 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr58805.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c03246ad8a63..017076187f1c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-23  Tom de Vries  <tom@codesourcery.com>
+
+	PR tree-optimization/58805
+	* tree-ssa-tail-merge.c (stmt_local_def): Add gimple_vdef check.
+
 2013-10-23  Jakub Jelinek  <jakub@redhat.com>
 
 	* tree-vect-patterns.c (vect_recog_divmod_pattern): Optimize
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 574fdc0f6173..b498c3a83127 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-23  Tom de Vries  <tom@codesourcery.com>
+
+	PR tree-optimization/58805
+	* gcc.dg/pr58805.c: New test.
+
 2013-10-23  Jakub Jelinek  <jakub@redhat.com>
 
 	* gcc.target/i386/vect-div-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr58805.c b/gcc/testsuite/gcc.dg/pr58805.c
new file mode 100644
index 000000000000..dda0e4bdf4bd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr58805.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */
+
+/* Type that matches the 'p' constraint.  */
+#define TYPE void *
+
+static inline
+void bar (TYPE *r)
+{
+  TYPE t;
+  __asm__ ("" : "=&p" (t), "=p" (*r));
+}
+
+void
+foo (int n, TYPE *x, TYPE *y)
+{
+  if (n == 0)
+    bar (x);
+  else
+    bar (y);
+}
+
+/* { dg-final { scan-tree-dump-times "__asm__" 2 "pre"} } */
+/* { dg-final { cleanup-tree-dump "pre" } } */
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index 785d986c65d8..be5b71e58a8f 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -304,7 +304,8 @@ stmt_local_def (gimple stmt)
   tree val;
   def_operand_p def_p;
 
-  if (gimple_has_side_effects (stmt))
+  if (gimple_has_side_effects (stmt)
+      || gimple_vdef (stmt) != NULL_TREE)
     return false;
 
   def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
-- 
GitLab