Richard,
This patch adds a missing check for gimple_vdef in stmt_local_def for the
tail-merge pass.
Bootstrapped and reg-tested on x86_64.
OK for trunk, gcc-4_8-branch?
Thanks,
- Tom
2013-10-22 Tom de Vries <[email protected]>
PR tree-optimization/58805
* tree-ssa-tail-merge.c (stmt_local_def): Add gimple_vdef check.
* gcc.dg/pr58805.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr58805.c b/gcc/testsuite/gcc.dg/pr58805.c
new file mode 100644
index 0000000..6e6eba5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr58805.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */
+
+static inline void bar(unsigned long *r)
+{
+ unsigned long t;
+ __asm__ (
+ "movq $42, %[t]\n\t"
+ "movq %[t], %[r]\n\t"
+ : [t] "=&r" (t), [r] "=r" (*r)
+ );
+}
+
+void foo(int n, unsigned long *x, unsigned long *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 9094935..0090da6 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -300,7 +300,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);