diff options
author | Jeff Law <law@redhat.com> | 2017-08-22 09:13:09 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-08-22 09:13:09 -0600 |
commit | 0db8ddfcb660397bab428ce0d271967d24c23177 (patch) | |
tree | 4004740d0a74395c77ee7b55de8e23b4d1a201a6 /gcc/tree-ssa-dom.c | |
parent | d4c550fd0ecb17d577353074c58283e942d1f870 (diff) | |
download | gcc-0db8ddfcb660397bab428ce0d271967d24c23177.zip gcc-0db8ddfcb660397bab428ce0d271967d24c23177.tar.gz gcc-0db8ddfcb660397bab428ce0d271967d24c23177.tar.bz2 |
re PR tree-optimization/81741 (Misoptimisation : replacing a constant field read access by a function call)
PR tree-optimization/81741
PR tree-optimization/71947
* tree-ssa-dom.c: Include tree-inline.h.
(record_temporary_equivalences): Only record SSA_NAME = SSA_NAME
equivalences if one is more expensive to compute than the other.
* tree-ssa-scopedtables.h (class const_or_copies): Make
record_const_or_copy_raw method private.
(class avail_exprs_stack): New method simplify_binary_operation.
* tree-ssa-scopedtables.c (avail_exprs_stack::lookup_avail_expr): Call
avail_exprs_stack::simplify_binary_operation as needed.
(avail_exprs_stack::simplify_binary_operation): New function.
PR tree-optimization/81741
PR tree-optimization/71947
* gcc.dg/tree-ssa/pr81741.c: New test.
* gcc.dg/tree-ssa/pr71947-7.c: New test.
* gcc.dg/tree-ssa/pr71947-8.c: New test.
* gcc.dg/tree-ssa/pr71947-9.c: New test.
* gcc.dg/tree-ssa/pr71941-1.c: Tweak expected output.
* gcc.dg/tree-ssa/pr71941-2.c: Tweak expected output.
* gcc.dg/tree-ssa/pr71941-3.c: Tweak expected output.
* gcc.dg/tree-ssa/20030922-2.c: xfail.
From-SVN: r251279
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 494b472..407a4ef 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "cfgloop.h" #include "gimple-fold.h" #include "tree-eh.h" +#include "tree-inline.h" #include "gimple-iterator.h" #include "tree-cfg.h" #include "tree-into-ssa.h" @@ -776,16 +777,27 @@ record_temporary_equivalences (edge e, /* Record the simple NAME = VALUE equivalence. */ tree rhs = edge_info->rhs; - record_equality (lhs, rhs, const_and_copies); - /* We already recorded that LHS = RHS, with canonicalization, - value chain following, etc. + /* If this is a SSA_NAME = SSA_NAME equivalence and one operand is + cheaper to compute than the other, then set up the equivalence + such that we replace the expensive one with the cheap one. - We also want to record RHS = LHS, but without any canonicalization - or value chain following. */ - if (TREE_CODE (rhs) == SSA_NAME) - const_and_copies->record_const_or_copy_raw (rhs, lhs, - SSA_NAME_VALUE (rhs)); + If they are the same cost to compute, then do not record anything. */ + if (TREE_CODE (lhs) == SSA_NAME && TREE_CODE (rhs) == SSA_NAME) + { + gimple *rhs_def = SSA_NAME_DEF_STMT (rhs); + int rhs_cost = estimate_num_insns (rhs_def, &eni_size_weights); + + gimple *lhs_def = SSA_NAME_DEF_STMT (lhs); + int lhs_cost = estimate_num_insns (lhs_def, &eni_size_weights); + + if (rhs_cost > lhs_cost) + record_equality (rhs, lhs, const_and_copies); + else if (rhs_cost < lhs_cost) + record_equality (lhs, rhs, const_and_copies); + } + else + record_equality (lhs, rhs, const_and_copies); /* If LHS is an SSA_NAME and RHS is a constant integer and LHS was set via a widening type conversion, then we may be able to record |