aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2013-10-23 13:26:45 +0000
committerTom de Vries <vries@gcc.gnu.org>2013-10-23 13:26:45 +0000
commita63b68b2f2ca3b7452550b8eeafab8fe4dbdccd8 (patch)
tree9eaf6cd1b1c2baf624da7125ea93a82260620b34 /gcc
parent7abed779644ba75a9d8ca1be0afb50b9a30665ad (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr58805.c24
-rw-r--r--gcc/tree-ssa-tail-merge.c3
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);