From 5630e3e157a10a74e925de90e9badee11996a225 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Sat, 19 Jan 2013 22:00:56 -0700 Subject: [PATCH] re PR tree-optimization/52631 (VN does not use simplified expression for lookup) PR tree-optimization/52631 * tree-ssa-sccvn (visit_use): Before looking up the original statement, try looking up the simplified expression. PR tree-optimization/52631 * tree-ssa/pr52631.c: New test. * tree-ssa/ssa-fre-9: Update expected output. From-SVN: r195318 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/tree-ssa/pr52631.c | 14 ++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-9.c | 2 +- gcc/tree-ssa-sccvn.c | 22 ++++++++++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr52631.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c01942622f..528afa12c3f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-19 Andrew Pinski + + PR tree-optimization/52631 + * tree-ssa-sccvn (visit_use): Before looking up the original + statement, try looking up the simplified expression. + 2013-01-19 Anthony Green * config/moxie/moxie.c (moxie_expand_prologue): Set diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d6a8f70619d..0d502962e03 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-01-19 Jeff Law + + PR tree-optimization/52631 + * tree-ssa/pr52631.c: New test. + * tree-ssa/ssa-fre-9: Update expected output. + 2013-01-19 Anthony Green * gcc.dg/tree-ssa/asm-2.c (REGISTER): Pick an appropriate register diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr52631.c b/gcc/testsuite/gcc.dg/tree-ssa/pr52631.c new file mode 100644 index 00000000000..c0d650b9ae6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr52631.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-fre1-details" } */ + +unsigned f(unsigned a) +{ + unsigned b = a >> 31; + return b&1; +} + +/* We want to verify that we replace the b & 1 with b. */ +/* { dg-final { scan-tree-dump-times "Replaced b_\[0-9\]+ & 1 with b_\[0-9\]+ in" 1 "fre1"} } */ + +/* { dg-final { cleanup-tree-dump "fre1" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-9.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-9.c index 57c6d4b5be7..d3986f5ba17 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-9.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-9.c @@ -23,6 +23,6 @@ void __frame_state_for1 (volatile char *state_in) } } -/* { dg-final { scan-tree-dump-times "Eliminated: 1" 2 "fre1" } } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 2" 2 "fre1" } } */ /* { dg-final { scan-tree-dump-times "Insertions: 1" 2 "fre1" } } */ /* { dg-final { cleanup-tree-dump "fre1" } } */ diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 57940357a6b..81a07aefb4f 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3422,6 +3422,28 @@ visit_use (tree use) } else { + /* First try to lookup the simplified expression. */ + if (simplified) + { + enum gimple_rhs_class rhs_class; + + + rhs_class = get_gimple_rhs_class (TREE_CODE (simplified)); + if ((rhs_class == GIMPLE_UNARY_RHS + || rhs_class == GIMPLE_BINARY_RHS + || rhs_class == GIMPLE_TERNARY_RHS) + && valid_gimple_rhs_p (simplified)) + { + tree result = vn_nary_op_lookup (simplified, NULL); + if (result) + { + changed = set_ssa_val_to (lhs, result); + goto done; + } + } + } + + /* Otherwise visit the original statement. */ switch (vn_get_stmt_kind (stmt)) { case VN_NARY: -- 2.30.2