From 94c483974ca4328bf8402ddf65308e63afdf22b4 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 27 Feb 2021 12:19:19 -0800 Subject: 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. --- share/txr/stdlib/optimize.tl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3