From a7cb592efa9ec72c4c5e9d3c1e7469203a4b47e2 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 2 Apr 2024 15:15:04 +0300 Subject: add simple unreachability --- src/unreachable.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/unreachable.c (limited to 'src/unreachable.c') diff --git a/src/unreachable.c b/src/unreachable.c new file mode 100644 index 0000000..90a65bd --- /dev/null +++ b/src/unreachable.c @@ -0,0 +1,38 @@ +#include + +void build_reachable_vec(struct vec *reachable, struct blk *cur) +{ + if (cur->reachable) + return; + + cur->reachable = true; + vec_append(reachable, &cur); + + if (cur->btype == RET) + return; + + if (cur->btype == J) + cur->s1 = cur->s2; + + if (cur->s1) + build_reachable_vec(reachable, cur->s1); + + if (cur->s2) + build_reachable_vec(reachable, cur->s2); +} + +void unreachable(struct fn *f) +{ + struct vec reachable = vec_create(sizeof(struct blk *)); + struct blk *b = blk_at(f->blks, 0); + build_reachable_vec(&reachable, b); + foreach_blk(bi, f->blks) { + struct blk *b = blk_at(f->blks, bi); + if (!b->reachable) + destroy_block(b); + + } + + vec_destroy(&f->blks); + f->blks = reachable; +} -- cgit v1.3