diff options
-rw-r--r-- | stdlib/compiler.tl | 44 | ||||
-rw-r--r-- | stdlib/optimize.tl | 6 |
2 files changed, 34 insertions, 16 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl index fd855f67..bce409f6 100644 --- a/stdlib/compiler.tl +++ b/stdlib/compiler.tl @@ -377,12 +377,11 @@ (condlet ((((null dobj))) '(t 0)) (((dreg [me.dreg dobj])) dreg) - ((((< me.dreg-cntr %lev-size%))) - (let ((dreg ^(d ,(pinc me.dreg-cntr)))) - (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"))))) + (t + (let ((dreg ^(d ,(pinc me.dreg-cntr)))) + (set me.datavec nil + [me.data (cadr dreg)] dobj + [me.dreg dobj] dreg)))))) (defmeth compiler alloc-dreg (me) (if (< me.dreg-cntr %lev-size%) @@ -1745,6 +1744,24 @@ (push lt-frag me.lt-frags) (new (frag dreg nil nil nil exp.pars)))))))) +(defmeth compiler compact-dregs (me insns) + (let ((map (hash)) + (i 0)) + (each ((insn insns)) + (if-match @(coll @(as dr (d @nil))) insn + (each ((d dr)) + (unless (inhash map d) + (set [map d] ^(d ,(pinc i))))))) + (let ((data (hash :eql-based))) + (dohash (from-dreg to-dreg map) + (set [data (cadr to-dreg)] [me.data (cadr from-dreg)])) + (set me.data data)) + (each ((cell me.dreg)) + (upd (cdr cell) map)) + (set me.datavec nil + me.dreg-cntr i) + (mapcar [iffi consp (op mapcar [orf map use])] insns))) + (defmeth compiler optimize (me insns) (let ((olev *opt-level*)) (if (>= olev 4) @@ -1767,8 +1784,10 @@ ((>= olev 7) bb.(merge-jump-thunks) bb.(compact-tregs) - bb.(late-peephole bb.(get-insns))) - (t bb.(get-insns)))) + bb.(late-peephole me.(compact-dregs bb.(get-insns)))) + ((>= olev 5) + me.(compact-dregs bb.(get-insns))) + (t bb.(get-insns)))) insns))) (defun true-const-p (arg) @@ -2326,9 +2345,12 @@ (eval-cache-emit-warnings)) co.(free-treg oreg) co.(check-treg-leak) - as.(asm co.(optimize ^(,*(mappend .code (nreverse co.lt-frags)) - ,*frag.code - (jend ,frag.oreg)))) + (let ((insns co.(optimize ^(,*(mappend .code (nreverse co.lt-frags)) + ,*frag.code + (jend ,frag.oreg))))) + (unless (< co.dreg-cntr %lev-size%) + (compile-error co.last-form "code too complex: too many literals")) + as.(asm insns)) (vm-make-desc co.nlev (succ as.max-treg) as.buf co.(get-datavec) co.(get-symvec))))) (defun get-param-info (sym) diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl index ee9257ac..49a8259e 100644 --- a/stdlib/optimize.tl +++ b/stdlib/optimize.tl @@ -798,16 +798,12 @@ cl.(apply-treg-compacting-map map)))))) (defmeth basic-blocks null-unused-data (bb) - (let ((used-dregs 0) - (used-funs 0) + (let ((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) |