summaryrefslogtreecommitdiffstats
path: root/stdlib/compiler.tl
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/compiler.tl')
-rw-r--r--stdlib/compiler.tl22
1 files changed, 18 insertions, 4 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)