summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/compiler.tl1
-rw-r--r--share/txr/stdlib/optimize.tl18
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