summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/optimize.tl12
1 files changed, 11 insertions, 1 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index 81536c32..a2054ca3 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -390,6 +390,14 @@
(dohash (label bl bb.hash)
(set bl.insns bb.(thread-jumps-block label bl.insns))))
+(defmeth basic-blocks elim-next-jump (bb bl label)
+ (let* ((tail (last bl.insns))
+ (linsn (car tail)))
+ (when-match (jmp @jlabel) linsn
+ (let ((next bb.(next-block label)))
+ (when (eql [bb.hash next].?label jlabel)
+ (set bl.insns (butlast bl.insns)))))))
+
(defmeth basic-blocks elim-dead-code (bb)
(dohash (label bl bb.hash)
(set bl.links nil))
@@ -406,7 +414,9 @@
(add bl.label)
(visit bl))
(visit bb.root)))))
- (set bb.labels [keep-if (chain bb.hash visited) bb.labels])))
+ (set bb.labels [keep-if (chain bb.hash visited) bb.labels])
+ (each ((lb bb.labels))
+ bb.(elim-next-jump [bb.hash lb] lb))))
(defun rewrite (fun list)
(build