--- /dev/null
+From aab54373e9406ee2a154b8d6166b3045aa3484ee Mon Sep 17 00:00:00 2001
+From: Muh Muhten <muh.muhten@gmail.com>
+Date: Sat, 9 Feb 2019 17:24:18 -0500
+Subject: [PATCH 2/9] Reimplement block_drop_unreferenced in linear time
+
+---
+ src/compile.c | 50 +++++++++++++++++++++++++++++---------------------
+ 1 file changed, 29 insertions(+), 21 deletions(-)
+
+--- a/src/compile.c
++++ b/src/compile.c
+@@ -53,6 +53,7 @@ struct inst {
+ struct inst* bound_by;
+ char* symbol;
+ int any_unbound;
++ int referenced;
+
+ int nformals;
+ int nactuals;
+@@ -75,6 +76,7 @@ static inst* inst_new(opcode op) {
+ i->bound_by = 0;
+ i->symbol = 0;
+ i->any_unbound = 0;
++ i->referenced = 0;
+ i->nformals = -1;
+ i->nactuals = -1;
+ i->subfn = gen_noop();
+@@ -465,30 +467,36 @@ block block_bind_referenced(block binder
+ return block_join(refd, body);
+ }
+
++static void block_mark_referenced(block body) {
++ int saw_top = 0;
++ for (inst* i = body.last; i; i = i->prev) {
++ if (saw_top && i->bound_by == i && !i->referenced)
++ continue;
++ if (i->op == TOP) {
++ saw_top = 1;
++ }
++ if (i->bound_by) {
++ i->bound_by->referenced = 1;
++ }
++
++ block_mark_referenced(i->arglist);
++ block_mark_referenced(i->subfn);
++ }
++}
++
+ block block_drop_unreferenced(block body) {
+- inst* curr;
++ block_mark_referenced(body);
++
+ block refd = gen_noop();
+- block unrefd = gen_noop();
+- int drop;
+- do {
+- drop = 0;
+- while ((curr = block_take(&body)) && curr->op != TOP) {
+- block b = inst_block(curr);
+- if (block_count_refs(b,refd) + block_count_refs(b,body) == 0) {
+- unrefd = BLOCK(unrefd, b);
+- drop++;
+- } else {
+- refd = BLOCK(refd, b);
+- }
+- }
+- if (curr && curr->op == TOP) {
+- body = BLOCK(inst_block(curr),body);
++ inst* curr;
++ while ((curr = block_take(&body))) {
++ if (curr->bound_by == curr && !curr->referenced) {
++ inst_free(curr);
++ } else {
++ refd = BLOCK(inst_block(curr), refd);
+ }
+- body = BLOCK(refd, body);
+- refd = gen_noop();
+- } while (drop != 0);
+- block_free(unrefd);
+- return body;
++ }
++ return refd;
+ }
+
+ jv block_take_imports(block* body) {