diff options
author | Robin Dapp <rdapp@linux.ibm.com> | 2019-08-26 10:18:24 +0000 |
---|---|---|
committer | Robin Dapp <rdapp@gcc.gnu.org> | 2019-08-26 10:18:24 +0000 |
commit | e944354ec05891474b0d204c6c239c04ee7b527b (patch) | |
tree | 7d6c6f10d0b328443395adfe609be168ff339997 | |
parent | bf05a3bbb58b355899ccabe861a06e85b7abe6e4 (diff) | |
download | gcc-e944354ec05891474b0d204c6c239c04ee7b527b.zip gcc-e944354ec05891474b0d204c6c239c04ee7b527b.tar.gz gcc-e944354ec05891474b0d204c6c239c04ee7b527b.tar.bz2 |
[PATCH 1/2] Allow folding all statements.
This patch allows users of the substitute_and_fold_engine to
enable folding all statements. It is now enabled for VRP which
is needed for the match.pd pattern in patch 2/2.
The loop versioning pass was missing one case when
deconstructing addresses that would only be triggered after
this patch for me:
It could handle addition and subsequent convert/nop but not
a convert/nop directly. This would cause the hash to be
calculated differently and, in turn, cause the pass to miss
a versioning opportunity. Fixed this by adding the missing
case.
--
gcc/ChangeLog:
2019-08-26 Robin Dapp <rdapp@linux.ibm.com>
* gimple-loop-versioning.cc (loop_versioning::record_address_fragment):
Add nop_convert case.
* tree-ssa-propagate.c (substitute_and_fold_dom_walker::before_dom_children):
Fold all statements if requested.
* tree-ssa-propagate.h (class substitute_and_fold_engine):
Allow to fold all statements.
* tree-vrp.c (class vrp_folder):
Let substitute_and_fold_engine fold all statements.
From-SVN: r274923
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/gimple-loop-versioning.cc | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-propagate.c | 9 | ||||
-rw-r--r-- | gcc/tree-ssa-propagate.h | 6 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 1 |
5 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 705c993..f5acb32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2019-08-26 Robin Dapp <rdapp@linux.ibm.com> + + * gimple-loop-versioning.cc (loop_versioning::record_address_fragment): + Add nop_convert case. + * tree-ssa-propagate.c (substitute_and_fold_dom_walker::before_dom_children): + Fold all statements if requested. + * tree-ssa-propagate.h (class substitute_and_fold_engine): + Allow to fold all statements. + * tree-vrp.c (class vrp_folder): + Let substitute_and_fold_engine fold all statements. + 2019-08-26 Richard Biener <rguenther@suse.de> PR tree-optimization/91526 diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-versioning.cc index 8fa1948..35344b7 100644 --- a/gcc/gimple-loop-versioning.cc +++ b/gcc/gimple-loop-versioning.cc @@ -1266,6 +1266,12 @@ loop_versioning::record_address_fragment (gimple *stmt, continue; } } + if (CONVERT_EXPR_CODE_P (code)) + { + tree op1 = gimple_assign_rhs1 (assign); + address->terms[i].expr = strip_casts (op1); + continue; + } } i += 1; } diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 0862f83..7172ef8 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -814,7 +814,6 @@ ssa_propagation_engine::ssa_propagate (void) ssa_prop_fini (); } - /* Return true if STMT is of the form 'mem_ref = RHS', where 'mem_ref' is a non-volatile pointer dereference, a structure reference or a reference to a single _DECL. Ignore volatile memory references @@ -1071,6 +1070,14 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb) stmt = gsi_stmt (i); gimple_set_modified (stmt, true); } + /* Also fold if we want to fold all statements. */ + else if (substitute_and_fold_engine->fold_all_stmts + && fold_stmt (&i, follow_single_use_edges)) + { + did_replace = true; + stmt = gsi_stmt (i); + gimple_set_modified (stmt, true); + } /* Some statements may be simplified using propagator specific information. Do this before propagating diff --git a/gcc/tree-ssa-propagate.h b/gcc/tree-ssa-propagate.h index 81b635e..f79c2ff 100644 --- a/gcc/tree-ssa-propagate.h +++ b/gcc/tree-ssa-propagate.h @@ -100,6 +100,8 @@ class ssa_propagation_engine class substitute_and_fold_engine { public: + substitute_and_fold_engine (bool fold_all_stmts = false) + : fold_all_stmts (fold_all_stmts) { } virtual ~substitute_and_fold_engine (void) { } virtual bool fold_stmt (gimple_stmt_iterator *) { return false; } virtual tree get_value (tree) { return NULL_TREE; } @@ -107,6 +109,10 @@ class substitute_and_fold_engine bool substitute_and_fold (basic_block = NULL); bool replace_uses_in (gimple *); bool replace_phi_args_in (gphi *); + + /* Users like VRP can set this when they want to perform + folding for every propagation. */ + bool fold_all_stmts; }; #endif /* _TREE_SSA_PROPAGATE_H */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 8067f85..4145bcc 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -6415,6 +6415,7 @@ vrp_prop::visit_phi (gphi *phi) class vrp_folder : public substitute_and_fold_engine { public: + vrp_folder () : substitute_and_fold_engine (/* Fold all stmts. */ true) { } tree get_value (tree) FINAL OVERRIDE; bool fold_stmt (gimple_stmt_iterator *) FINAL OVERRIDE; bool fold_predicate_in (gimple_stmt_iterator *); |