summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/compiler.tl2
-rw-r--r--share/txr/stdlib/optimize.tl14
2 files changed, 14 insertions, 2 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index bf06548e..08dc2c13 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -1272,7 +1272,7 @@
(defmeth compiler optimize (me insns)
(let* ((bb (new (basic-blocks insns))))
- bb.(thread-jumps)
+ bb.(peephole)
bb.(get-insns)))
(defun maybe-mov (to-reg from-reg)
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index 4cc82876..7a6b9dbb 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -47,10 +47,17 @@
,*cases))
,list))
-(defmeth basic-blocks thread-jumps (bb)
+(defmeth basic-blocks peephole (bb)
(dohash (label code bb.hash)
(set [bb.hash label]
(rewrite-case insns code
+ ;; dead code
+ ((@(or (jmp @nil) (if (t 0) @nil)) @nil . @rest)
+ (list (car insns)))
+ ;; always taken if
+ (((if (d @reg) @jlabel) . @rest)
+ rest)
+ ;; jump threading
(((jmp @jlabel) . @rest)
(let ((jinsns [bb.hash jlabel]))
(match-case jinsns
@@ -87,6 +94,11 @@
(jmp @(require @jjlabel (neq jjlabel jlabel))) . @nil)
^((close ,reg ,nargs ,jjlabel ,*cargs) ,*rest))
(@jelse insns))))
+ ;; wasteful moves
+ (((mov @reg0 @nil) (mov @reg0 @nil) . @nil)
+ (cdr insns))
+ (((mov @reg0 @reg1) (mov reg1 @reg0) . @rest)
+ ^(,(car insns) ,*rest))
(@else insns)))))
(defun rewrite (fun list)