summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-02-27 12:19:19 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-02-27 12:19:19 -0800
commit94c483974ca4328bf8402ddf65308e63afdf22b4 (patch)
tree1ecc206680d41799774a3a7fd692f2cabdbf6f62
parentb0b7a05c76fac4dc072e394731a7e5f153c775a8 (diff)
downloadtxr-94c483974ca4328bf8402ddf65308e63afdf22b4.tar.gz
txr-94c483974ca4328bf8402ddf65308e63afdf22b4.tar.bz2
txr-94c483974ca4328bf8402ddf65308e63afdf22b4.zip
compiler: eliminate jumps to following instruction.
* share/txr/stdlib/optimize.tl (basic-blocks elim-next-jump): New method, which detects that the basic block ends with a (jmp label), where label is the next block in emit order. This jmp instruction can be eliminated. (basic-blocks elim-dead-code): Walk the reachable labels, and call elim-next-jmp to remove useless jumps.
-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