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 /gcc/tree-ssa-propagate.c | |
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
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r-- | gcc/tree-ssa-propagate.c | 9 |
1 files changed, 8 insertions, 1 deletions
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 |