aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-05-17 13:42:21 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-05-17 13:42:21 +0000
commitf1bcb061d172ca7e3bdcc46476b20776382a2974 (patch)
tree2c194e4957f273738f38510a0f14822f61e6800a /gcc
parent3f90a68f0fda2f571ba2a3463096b82dbea51217 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/tree-ssa-dse.c13
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. */