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 <t...@codesourcery.com> 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);