diff options
-rw-r--r-- | share/txr/stdlib/optimize.tl | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl index b4722f56..1541cd17 100644 --- a/share/txr/stdlib/optimize.tl +++ b/share/txr/stdlib/optimize.tl @@ -77,7 +77,7 @@ bb.(link-graph)) (:method get-insns (bb) - [mappend .insns bb.list]) + bb.(late-peephole [mappend .insns bb.list])) (:method cut-block (bb bl at insns) (let* ((nlabel (gensym "nl")) @@ -491,6 +491,21 @@ (set pbl.insns (append (ldiff code tail) (list sins)))))) (set bb.list (remove-if (lop memq dupes) bb.list)))))))) +(defmeth basic-blocks late-peephole (bb code) + (rewrite-case insns code + (((if @reg @lab1) + @lab2 + (jmp @lab3) + @lab1 + . @rest) + (let* ((bl [bb.hash lab2])) + (if (some bl.rlinks (op eq bb) .next) + insns + ^((ifq ,reg (t 0) ,lab3) + ,lab1 + ,*rest)))) + (@else else))) + (defun rewrite (fun list) (build (while* list |