diff options
-rw-r--r-- | share/txr/stdlib/compiler.tl | 1 | ||||
-rw-r--r-- | share/txr/stdlib/optimize.tl | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 1d95fd3b..4d08b526 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -1506,6 +1506,7 @@ bb.(calc-liveness) bb.(peephole) bb.(thread-jumps) + bb.(elim-dead-code) bb.(get-insns))) (defun true-const-p (arg) diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl index 754ad9ae..259a64ae 100644 --- a/share/txr/stdlib/optimize.tl +++ b/share/txr/stdlib/optimize.tl @@ -388,6 +388,24 @@ (dohash (label bl bb.hash) (set bl.insns bb.(thread-jumps-block label bl.insns)))) +(defmeth basic-blocks elim-dead-code (bb) + (dohash (label bl bb.hash) + (set bl.links nil)) + bb.(link-graph) + (let* ((visited (hash :eq-based)) + (reachable (build + (labels ((visit (bl) + (when (test-set [visited bl]) + (add bl.label) + (when bl.next + (visit [bb.hash bl.next])) + [mapcar [chain bb.hash visit] bl.links]))) + (for ((bl bb.root)) (bl) ((set bl [bb.hash bl.next])) + (add bl.label) + (visit bl)) + (visit bb.root))))) + (set bb.labels [keep-if (chain bb.hash visited) bb.labels]))) + (defun rewrite (fun list) (build (while* list |