From b4e48861dfd6ec635b252dc13a5b19a2df237cc7 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 14 Nov 2013 00:10:42 +0000 Subject: [PATCH] Handle GIMPLE_ASSIGNs with different vuse in gimple_equal_p 2013-11-14 Tom de Vries * tree-ssa-tail-merge.c (gimple_equal_p): Add test for structural equality for GIMPLE_ASSIGN. * gcc.dg/tail-merge-store.c: New test. From-SVN: r204767 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/tail-merge-store.c | 22 ++++++++++++++++++++++ gcc/tree-ssa-tail-merge.c | 13 +++++++++++-- 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tail-merge-store.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66d9c7b2e5e..dad20a4bdb5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-11-14 Tom de Vries + + * tree-ssa-tail-merge.c (gimple_equal_p): Add test for structural + equality for GIMPLE_ASSIGN. + 2013-11-14 Tom de Vries * tree-ssa-tail-merge.c (gimple_operand_equal_value_p): Factor new diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93080a8d0b8..ddbb62eeb07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-11-14 Tom de Vries + + * gcc.dg/tail-merge-store.c: New test. + 2013-11-13 Andrew MacLeod * testsuite/g++.dg/plugin/selfassign.c: Include gimple-iterator.h. diff --git a/gcc/testsuite/gcc.dg/tail-merge-store.c b/gcc/testsuite/gcc.dg/tail-merge-store.c new file mode 100644 index 00000000000..1aefbdc1495 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tail-merge-store.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ + +int z; +int x; + +void +f (int c, int d) +{ + if (c) + z = 5; + else + { + if (d) + x = 4; + z = 5; + } +} + +/* { dg-final { scan-tree-dump-times "duplicate of" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "z = 5" 1 "pre"} } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index ca69b23e4bb..c97da97f6d3 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -1142,8 +1142,17 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2) lhs2 = gimple_get_lhs (s2); if (TREE_CODE (lhs1) != SSA_NAME && TREE_CODE (lhs2) != SSA_NAME) - return (vn_valueize (gimple_vdef (s1)) - == vn_valueize (gimple_vdef (s2))); + { + /* If the vdef is the same, it's the same statement. */ + if (vn_valueize (gimple_vdef (s1)) + == vn_valueize (gimple_vdef (s2))) + return true; + + /* Test for structural equality. */ + return (operand_equal_p (lhs1, lhs2, 0) + && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1), + gimple_assign_rhs1 (s2))); + } else if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME) return vn_valueize (lhs1) == vn_valueize (lhs2); -- 2.30.2