summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/optimize.tl19
1 files changed, 18 insertions, 1 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index 73aa6dc6..99faad8a 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -51,7 +51,7 @@
uwprot catch block jend))
(:postinit (bb)
- (let* ((insns (dedup-labels (cons bb.start bb.insns)))
+ (let* ((insns (early-peephole (dedup-labels (cons bb.start bb.insns))))
(cuts (merge [where symbolp insns]
[where [andf consp
(op memq (car @1) bb.jump-ops)]
@@ -474,3 +474,20 @@
(cons label0 rest))
(@else tail))
insns)
+
+(defun early-peephole (code)
+ (rewrite-case insns code
+ (((mov (t @t1) (d @d1))
+ (jmp @lab2)
+ @(symbolp @lab1)
+ (mov (t @t1) (t 0))
+ @lab2
+ (ifq (t @t1) (t 0) @lab3)
+ . @rest)
+ ^((mov (t ,t1) (d ,d1))
+ (jmp ,lab3)
+ ,lab1
+ (mov (t ,t1) (t 0))
+ ,lab2
+ ,*rest))
+ (@else else)))