diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-03-07 17:49:46 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-30 23:29:28 +0200 |
| commit | 4723d27700f35d172053c725488a84ffdac9891f (patch) | |
| tree | e55e2bc18711fa86fb07b911c9b72f44c2137031 /memops.c | |
| parent | 587340e4f516759bc66786522ffcd9396a1d83f8 (diff) | |
| download | sparse-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.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -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); } |
