summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/compiler.tl22
-rw-r--r--stdlib/optimize.tl26
-rw-r--r--tests/012/seq.tl30
3 files changed, 58 insertions, 20 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index e48a2403..8e8ba3c0 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -409,8 +409,9 @@
(((dreg [me.dreg dobj])) dreg)
((((< me.dreg-cntr %lev-size%)))
(let ((dreg ^(d ,(pinc me.dreg-cntr))))
- (set [me.data (cadr dreg)] dobj)
- (set [me.dreg dobj] dreg)))
+ (set me.datavec nil
+ [me.data (cadr dreg)] dobj
+ [me.dreg dobj] dreg)))
(t (compile-error me.last-form "code too complex: too many literals")))))
(defmeth compiler alloc-dreg (me)
@@ -420,6 +421,12 @@
dreg)
(compile-error me.last-form "code too complex: too many literals")))
+(defmeth compiler null-dregs (me used-dreg)
+ (each ((n 0..me.dreg-cntr))
+ (unless (bit used-dreg n)
+ (set [me.data n] nil
+ me.datavec nil))))
+
(defmeth compiler get-sidx (me atom)
(iflet ((sidx [me.sidx atom]))
sidx
@@ -427,6 +434,12 @@
(set [me.stab sidx] atom)
(set [me.sidx atom] sidx))))
+(defmeth compiler null-stab (me used-sidx)
+ (each ((n 0..me.sidx-cntr))
+ (unless (bit used-sidx n)
+ (set [me.stab n] nil
+ me.symvec nil))))
+
(defmeth compiler get-datavec (me)
(or me.datavec
(set me.datavec (vec-list [mapcar me.data (range* 0 me.dreg-cntr)]))))
@@ -1766,7 +1779,7 @@
(let ((olev *opt-level*))
(if (>= olev 4)
(let* ((lt-dregs (mapcar .oreg me.lt-frags))
- (bb (new (basic-blocks insns lt-dregs me.(get-symvec)))))
+ (bb (new (basic-blocks me insns lt-dregs me.(get-symvec)))))
(when (>= olev 4)
bb.(thread-jumps)
bb.(elim-dead-code))
@@ -1778,7 +1791,8 @@
bb.(peephole)
bb.(link-graph)
bb.(thread-jumps)
- bb.(elim-dead-code))))
+ bb.(elim-dead-code))
+ bb.(null-unused-data)))
(cond
((>= olev 7)
bb.(merge-jump-thunks)
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index 9950d934..b6cbbb10 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -52,7 +52,8 @@
rlinks ,(mapcar .label bl.rlinks)
next ,bl.next.?label) stream)))
- (defstruct (basic-blocks insns lt-dregs symvec) nil
+ (defstruct (basic-blocks compiler insns lt-dregs symvec) nil
+ compiler
insns
lt-dregs
symvec
@@ -524,6 +525,16 @@
(set bb.recalc t)
(cons (car insns) ren))
(t insns))))
+ ;; constant folding
+ (@(require ((gcall @tgt @idx . @(all (d @dn))) . @rest)
+ [%const-foldable% [bb.symvec idx]])
+ (let* ((co bb.compiler)
+ (dvec co.(get-datavec))
+ (fun [bb.symvec idx])
+ (args [mapcar dvec dn])
+ (val (apply fun args))
+ (dreg co.(get-dreg val)))
+ ^((mov ,tgt ,dreg) ,*rest)))
(@nil insns))))
(defmeth basic-blocks peephole (bb)
@@ -764,6 +775,19 @@
(each ((cl clist))
cl.(apply-treg-compacting-map map))))))
+(defmeth basic-blocks null-unused-data (bb)
+ (let ((used-dregs 0)
+ (used-funs 0)
+ (co bb.compiler))
+ (each ((bl bb.list))
+ (each ((insn bl.insns))
+ (if-match @(coll (d @dn)) insn
+ (set-mask used-dregs (mask . dn)))
+ (if-match (@(or gcall gapply getf getlx setlx) @nil @fn . @nil) insn
+ (set-mask used-funs (mask fn)))))
+ co.(null-dregs used-dregs)
+ co.(null-stab used-funs)))
+
(defun rewrite (fun list)
(build
(while* list
diff --git a/tests/012/seq.tl b/tests/012/seq.tl
index 4d2260e9..df5ce065 100644
--- a/tests/012/seq.tl
+++ b/tests/012/seq.tl
@@ -317,42 +317,42 @@
(mtest
(nrot nil) nil
- (nrot #()) #()
+ (nrot (vec)) #()
(nrot "") ""
(nrot nil 2) nil
- (nrot #() 2) #()
+ (nrot (vec) 2) #()
(nrot "" 2) ""
(nrot nil -1) nil
- (nrot #() -1) #()
+ (nrot (vec) -1) #()
(nrot "" -1) "")
(mtest
(let ((s '(a))) (nrot s)) (a)
- (let ((s #(1))) (nrot s) s) #(1)
+ (let ((s (vec 1))) (nrot s) s) #(1)
(let ((s "x")) (nrot s) s) "x"
(let ((s '(a))) (nrot s -1)) (a)
- (let ((s #(1))) (nrot s -1) s) #(1)
+ (let ((s (vec 1))) (nrot s -1) s) #(1)
(let ((s "x")) (nrot s -1) s) "x")
(mtest
(let ((s '(a b))) (nrot s)) (b a)
- (let ((s #(1 2))) (nrot s) s) #(2 1)
- (let ((s "xy")) (nrot s) s) "yx"
+ (let ((s (vec 1 2))) (nrot s) s) #(2 1)
+ (let ((s (copy "xy"))) (nrot s) s) "yx"
(let ((s '(a b))) (nrot s -1)) (b a)
- (let ((s #(1 2))) (nrot s -1) s) #(2 1)
- (let ((s "xy")) (nrot s -1) s) "yx")
+ (let ((s (vec 1 2))) (nrot s -1) s) #(2 1)
+ (let ((s (copy "xy"))) (nrot s -1) s) "yx")
(mtest
(let ((s '(a b c))) (nrot s)) (b c a)
- (let ((s #(1 2 3))) (nrot s) s) #(2 3 1)
- (let ((s "xyz")) (nrot s) s) "yzx"
+ (let ((s (vec 1 2 3))) (nrot s) s) #(2 3 1)
+ (let ((s (copy "xyz"))) (nrot s) s) "yzx"
(let ((s '(a b c))) (nrot s -1)) (c a b)
- (let ((s #(1 2 3))) (nrot s -1) s) #(3 1 2)
- (let ((s "xyz")) (nrot s -1) s) "zxy")
+ (let ((s (vec 1 2 3))) (nrot s -1) s) #(3 1 2)
+ (let ((s (copy "xyz"))) (nrot s -1) s) "zxy")
(mtest
- (let ((s '(a b c))) (nrot s 33)) (a b c)
- (let ((s '(a b c))) (nrot s 34)) (b c a))
+ (let ((s (list 'a 'b 'c))) (nrot s 33)) (a b c)
+ (let ((s (list 'a 'b 'c))) (nrot s 34)) (b c a))
(mtest
(rot nil) nil