diff options
Diffstat (limited to 'src/unreachable.c')
| -rw-r--r-- | src/unreachable.c | 34 |
1 files changed, 6 insertions, 28 deletions
diff --git a/src/unreachable.c b/src/unreachable.c index 90a65bd..aa04f46 100644 --- a/src/unreachable.c +++ b/src/unreachable.c @@ -1,38 +1,16 @@ #include <qbt/unreachable.h> -void build_reachable_vec(struct vec *reachable, struct blk *cur) +void remove_unvisited(struct fn *f, int visited) { - 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); + struct vec new = vec_create(sizeof(struct blk *)); foreach_blk(bi, f->blks) { struct blk *b = blk_at(f->blks, bi); - if (!b->reachable) + if (b->visited < visited) destroy_block(b); - + else + vec_append(&new, &b); } vec_destroy(&f->blks); - f->blks = reachable; + f->blks = new; } |
