diff options
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/optimize.tl | 12 |
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 |