aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/memops.c
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-03-07 17:49:46 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-30 23:29:28 +0200
commit4723d27700f35d172053c725488a84ffdac9891f (patch)
treee55e2bc18711fa86fb07b911c9b72f44c2137031 /memops.c
parent587340e4f516759bc66786522ffcd9396a1d83f8 (diff)
downloadsparse-dev-4723d27700f35d172053c725488a84ffdac9891f.tar.gz
kds: kill dead stores after memops simplification
Currently, dead stores are removed after the initial promotion of symbols to pseudos (simplify_one_symbol()). But more complex promotions are done later during memops simplification (simplify_loads()) and dead stores should be removed there too but aren't. Fix this by calling kill_dead_stores() after memops simplification. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'memops.c')
-rw-r--r--memops.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/memops.c b/memops.c
index df2e4d6c..20806175 100644
--- a/memops.c
+++ b/memops.c
@@ -190,6 +190,7 @@ next_store:
void simplify_memops(struct entrypoint *ep)
{
struct basic_block *bb;
+ pseudo_t pseudo;
FOR_EACH_PTR_REVERSE(ep->bbs, bb) {
simplify_loads(bb);
@@ -198,4 +199,15 @@ void simplify_memops(struct entrypoint *ep)
FOR_EACH_PTR_REVERSE(ep->bbs, bb) {
kill_dominated_stores(bb);
} END_FOR_EACH_PTR_REVERSE(bb);
+
+ FOR_EACH_PTR(ep->accesses, pseudo) {
+ struct symbol *var = pseudo->sym;
+ unsigned long mod;
+ if (!var)
+ continue;
+ mod = var->ctype.modifiers;
+ if (mod & (MOD_VOLATILE | MOD_NONLOCAL | MOD_STATIC))
+ continue;
+ kill_dead_stores(ep, pseudo, local_pseudo(pseudo));
+ } END_FOR_EACH_PTR(pseudo);
}