diff options
author | Richard Biener <rguenther@suse.de> | 2018-05-17 13:42:21 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-05-17 13:42:21 +0000 |
commit | f1bcb061d172ca7e3bdcc46476b20776382a2974 (patch) | |
tree | 2c194e4957f273738f38510a0f14822f61e6800a /gcc | |
parent | 3f90a68f0fda2f571ba2a3463096b82dbea51217 (diff) | |
download | gcc-f1bcb061d172ca7e3bdcc46476b20776382a2974.zip gcc-f1bcb061d172ca7e3bdcc46476b20776382a2974.tar.gz gcc-f1bcb061d172ca7e3bdcc46476b20776382a2974.tar.bz2 |
tree-ssa-dse.c (dse_classify_store): Fix iterator increment for pruning loop and prune defs feeding only already...
2018-05-17 Richard Biener <rguenther@suse.de>
* tree-ssa-dse.c (dse_classify_store): Fix iterator increment
for pruning loop and prune defs feeding only already visited PHIs.
From-SVN: r260322
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-ssa-dse.c | 13 |
2 files changed, 15 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a800a7..3c59e09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2018-05-17 Richard Biener <rguenther@suse.de> + * tree-ssa-dse.c (dse_classify_store): Fix iterator increment + for pruning loop and prune defs feeding only already visited PHIs. + +2018-05-17 Richard Biener <rguenther@suse.de> + * tree-ssa-sccvn.c (vn_reference_lookup_3): Improve memset handling. 2018-05-17 Bin Cheng <bin.cheng@arm.com> diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c index 589cfef..1af50a0 100644 --- a/gcc/tree-ssa-dse.c +++ b/gcc/tree-ssa-dse.c @@ -662,7 +662,7 @@ dse_classify_store (ao_ref *ref, gimple *stmt, } /* Process defs and remove those we need not process further. */ - for (unsigned i = 0; i < defs.length (); ++i) + for (unsigned i = 0; i < defs.length ();) { gimple *def = defs[i]; gimple *use_stmt; @@ -680,11 +680,18 @@ dse_classify_store (ao_ref *ref, gimple *stmt, /* In addition to kills we can remove defs whose only use is another def in defs. That can only ever be PHIs of which we track a single for simplicity reasons (we fail for multiple - PHIs anyways). */ + PHIs anyways). We can also ignore defs that feed only into + already visited PHIs. */ else if (gimple_code (def) != GIMPLE_PHI && single_imm_use (gimple_vdef (def), &use_p, &use_stmt) - && use_stmt == phi_def) + && (use_stmt == phi_def + || (gimple_code (use_stmt) == GIMPLE_PHI + && bitmap_bit_p (visited, + SSA_NAME_VERSION + (PHI_RESULT (use_stmt)))))) defs.unordered_remove (i); + else + ++i; } /* If all defs kill the ref we are done. */ |