diff options
author | Tom de Vries <tom@codesourcery.com> | 2013-10-23 13:26:45 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2013-10-23 13:26:45 +0000 |
commit | a63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8 (patch) | |
tree | 9eaf6cd1b1c2baf624da7125ea93a82260620b34 /gcc | |
parent | 7abed779644ba75a9d8ca1be0afb50b9a30665ad (diff) | |
download | gcc-a63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8.zip gcc-a63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8.tar.gz gcc-a63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr58805.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 3 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c03246a..0170761 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 574fdc0..b498c3a 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 0000000..dda0e4b --- /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 785d986..be5b71e 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); |