From 92a5094e04e9c9a50e596884eacabe53b36a53e9 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 9 Dec 2014 14:25:09 +0000 Subject: [PATCH] re PR tree-optimization/64193 (Decreased performance after r173250) 2014-12-09 Richard Biener PR tree-optimization/64193 * tree-ssa-alias.c (walk_non_aliased_vuses): Add valueize parameter and valueize the VUSE before looking up the def stmt. * tree-ssa-alias.h (walk_non_aliased_vuses): Adjust prototype. * tree-ssa-sccvn.c (vn_reference_lookup_pieces): Pass vn_valueize to walk_non_aliased_vuses. (vn_reference_lookup): Likewise. * tree-ssa-dom.c (lookup_avail_expr): Pass NULL as valueize callback to walk_non_aliased_vuses. * gcc.dg/tree-ssa/ssa-fre-43.c: New testcase. From-SVN: r218515 --- gcc/ChangeLog | 12 +++++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c | 29 ++++++++++++++++++++++ gcc/tree-ssa-alias.c | 8 ++++++ gcc/tree-ssa-alias.h | 1 + gcc/tree-ssa-dom.c | 2 +- gcc/tree-ssa-sccvn.c | 6 +++-- 7 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0997ef4f312..75312341824 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2014-12-09 Richard Biener + + PR tree-optimization/64193 + * tree-ssa-alias.c (walk_non_aliased_vuses): Add valueize parameter + and valueize the VUSE before looking up the def stmt. + * tree-ssa-alias.h (walk_non_aliased_vuses): Adjust prototype. + * tree-ssa-sccvn.c (vn_reference_lookup_pieces): Pass vn_valueize + to walk_non_aliased_vuses. + (vn_reference_lookup): Likewise. + * tree-ssa-dom.c (lookup_avail_expr): Pass NULL as valueize + callback to walk_non_aliased_vuses. + 2014-12-09 Richard Biener PR middle-end/64199 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fbd11360617..ed0315622f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-09 Richard Biener + + PR tree-optimization/64193 + * gcc.dg/tree-ssa/ssa-fre-43.c: New testcase. + 2014-12-09 Richard Biener PR middle-end/64199 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c new file mode 100644 index 00000000000..e79e7c402c8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c @@ -0,0 +1,29 @@ +/* PR tree-optimization/64193 */ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre1-details" } */ + +double T,T2,E1[5]; +int J; + +void +PA(double E[]) +{ + J = 0; + +L10: + E[1] = ( E[1] + E[2] + E[3] - E[4]) * T; + E[2] = ( E[1] + E[2] - E[3] + E[4]) * T; + E[3] = ( E[1] - E[2] + E[3] + E[4]) * T; + E[4] = (-E[1] + E[2] + E[3] + E[4]) / T2; + J += 1; + + if (J < 6) + goto L10; +} + +/* We should remove 15 dead loads, fully propagating their replacements + with exactly 4 loads and 4 stores from/to E remaining. */ + +/* { dg-final { scan-tree-dump-times "Removing dead stmt" 15 "fre1" } } */ +/* { dg-final { scan-tree-dump-not "Not changing value number" "fre1" } } */ +/* { dg-final { cleanup-tree-dump "fre1" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 17e84149c7a..5ad25762920 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2632,12 +2632,18 @@ get_continuation_for_phi (gimple phi, ao_ref *ref, If TRANSLATE returns NULL the walk continues and TRANSLATE is supposed to adjust REF and *DATA to make that valid. + VALUEIZE if non-NULL is called with the next VUSE that is considered + and return value is substituted for that. This can be used to + implement optimistic value-numbering for example. Note that the + VUSE argument is assumed to be valueized already. + TODO: Cache the vector of equivalent vuses per ref, vuse pair. */ void * walk_non_aliased_vuses (ao_ref *ref, tree vuse, void *(*walker)(ao_ref *, tree, unsigned int, void *), void *(*translate)(ao_ref *, tree, void *, bool), + tree (*valueize)(tree), void *data) { bitmap visited = NULL; @@ -2663,6 +2669,8 @@ walk_non_aliased_vuses (ao_ref *ref, tree vuse, else if (res != NULL) break; + if (valueize) + vuse = valueize (vuse); def_stmt = SSA_NAME_DEF_STMT (vuse); if (gimple_nop_p (def_stmt)) break; diff --git a/gcc/tree-ssa-alias.h b/gcc/tree-ssa-alias.h index 3193c64a38a..ca6390a9793 100644 --- a/gcc/tree-ssa-alias.h +++ b/gcc/tree-ssa-alias.h @@ -124,6 +124,7 @@ extern void *walk_non_aliased_vuses (ao_ref *, tree, void *(*)(ao_ref *, tree, unsigned int, void *), void *(*)(ao_ref *, tree, void *, bool), + tree (*)(tree), void *); extern unsigned int walk_aliased_vdefs (ao_ref *, tree, bool (*)(ao_ref *, tree, void *), diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 60be376e740..bd37226c856 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2635,7 +2635,7 @@ lookup_avail_expr (gimple stmt, bool insert) && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)), true) && walk_non_aliased_vuses (&ref, vuse2, - vuse_eq, NULL, vuse1) != NULL)) + vuse_eq, NULL, NULL, vuse1) != NULL)) { struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt); *element2 = element; diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 7f694152745..d7a4742caf6 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -2160,7 +2160,8 @@ vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type, *vnresult = (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse, vn_reference_lookup_2, - vn_reference_lookup_3, &vr1); + vn_reference_lookup_3, + vn_valueize, &vr1); gcc_checking_assert (vr1.operands == shared_lookup_references); } @@ -2212,7 +2213,8 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind, wvnresult = (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse, vn_reference_lookup_2, - vn_reference_lookup_3, &vr1); + vn_reference_lookup_3, + vn_valueize, &vr1); gcc_checking_assert (vr1.operands == shared_lookup_references); if (wvnresult) { -- 2.30.2