diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-12-01 23:46:56 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2021-03-25 00:11:53 +0100 |
commit | 23109ddefaadf1a476ea47d123994e5f073f701e (patch) | |
tree | c1016ec418e923d96c64a7909cc9dad566b01077 | |
parent | e0c12f39daec8b2d13fb84e80033f7d9052374c7 (diff) | |
download | sparse-23109ddefaadf1a476ea47d123994e5f073f701e.tar.gz |
kill redundant stores (local)
A store is called 'redundant' when the corresponding location
already contains the value that will be stored.
This patch removes such stores in the case where the memops
which make them redundant is in the same basic block.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | memops.c | 5 | ||||
-rw-r--r-- | validation/memops/kill-redundant-store0.c | 1 |
2 files changed, 5 insertions, 1 deletions
@@ -213,6 +213,11 @@ static bool try_to_kill_store(pseudo_t pseudo, struct instruction *insn, /* possible partial dominance? */ if (dominance < 0) return false; + if (insn->target == dom->target && insn->bb == dom->bb) { + // found a memop which makes the store redundant + kill_instruction_force(insn); + return false; + } if (dom->opcode == OP_LOAD) return false; if (dom->is_volatile) diff --git a/validation/memops/kill-redundant-store0.c b/validation/memops/kill-redundant-store0.c index e911166d..8819938f 100644 --- a/validation/memops/kill-redundant-store0.c +++ b/validation/memops/kill-redundant-store0.c @@ -7,7 +7,6 @@ void foo(int *ptr) /* * check-name: kill-redundant-store0 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-output-ignore * check-output-excludes: store |