Update of /project/movitz/cvsroot/movitz In directory clnet:/tmp/cvs-serv4460
Modified Files: compiler.lisp Log Message: Smarten up make-compiled-two-forms-into-registers slightly, this speeds up the compiler.
--- /project/movitz/cvsroot/movitz/compiler.lisp 2008/03/06 21:14:22 1.194 +++ /project/movitz/cvsroot/movitz/compiler.lisp 2008/03/15 00:21:38 1.195 @@ -8,7 +8,7 @@ ;;;; Created at: Wed Oct 25 12:30:49 2000 ;;;; Distribution: See the accompanying file COPYING. ;;;; -;;;; $Id: compiler.lisp,v 1.194 2008/03/06 21:14:22 ffjeld Exp $ +;;;; $Id: compiler.lisp,v 1.195 2008/03/15 00:21:38 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -5769,6 +5769,15 @@ (operands instruction) (values binding destination))))
+(defun program-is-load-constant (prg) + (and (not (cdr prg)) + (let ((i (car prg))) + (when (and (listp i) + (eq :load-constant (car i))) + (values (third i) + (second i)))))) + + (defun make-compiled-two-forms-into-registers (form0 reg0 form1 reg1 funobj env) "Returns first: code that does form0 into reg0, form1 into reg1. second: whether code is functional-p, @@ -5791,44 +5800,48 @@ :env env :result-mode reg1) (values (cond - ((and (typep final0 'binding) - (not (code-uses-binding-p code1 final0 :load nil :store t))) - (append (compiler-call #'compile-form-unprotected - :form form0 - :result-mode :ignore - :funobj funobj - :env env) - code1 - `((:load-lexical ,final0 ,reg0 :protect-registers (,reg1))))) - ((program-is-load-lexical-of-binding code1) - (destructuring-bind (src dst &key protect-registers shared-reference-p) - (cdar code1) - (assert (eq reg1 dst)) - (append code0 - `((:load-lexical ,src ,reg1 - :protect-registers ,(union protect-registers - (list reg0)) - :shared-reference-p ,shared-reference-p))))) - ;; XXX if we knew that code1 didn't mess up reg0, we could do more.. - (t #+ignore (when (and (not (tree-search code1 reg0)) - (not (tree-search code1 :call))) - (warn "got b: ~S ~S for ~S: ~{~&~A~}" form0 form1 reg0 code1)) - (let ((binding (make-instance 'temporary-name :name (gensym "tmp-"))) - (xenv (make-local-movitz-environment env funobj))) - (movitz-env-add-binding xenv binding) - (append (compiler-call #'compile-form - :form form0 - :funobj funobj - :env env - :result-mode reg0) - `((:init-lexvar ,binding :init-with-register ,reg0 - :init-with-type ,(type-specifier-primary type0))) - (compiler-call #'compile-form - :form form1 - :funobj funobj - :env xenv - :result-mode reg1) - `((:load-lexical ,binding ,reg0)))))) + ((and (typep final0 'binding) + (not (code-uses-binding-p code1 final0 :load nil :store t))) + (append (compiler-call #'compile-form-unprotected + :form form0 + :result-mode :ignore + :funobj funobj + :env env) + code1 + `((:load-lexical ,final0 ,reg0 :protect-registers (,reg1))))) + ((program-is-load-lexical-of-binding code1) + (destructuring-bind (src dst &key protect-registers shared-reference-p) + (cdar code1) + (assert (eq reg1 dst)) + (append code0 + `((:load-lexical ,src ,reg1 + :protect-registers ,(union protect-registers + (list reg0)) + :shared-reference-p ,shared-reference-p))))) + ((eq reg1 (program-is-load-constant code1)) + (append code0 + code1)) + ;; XXX if we knew that code1 didn't mess up reg0, we could do more.. + (t +;; (when (and (not (tree-search code1 reg0)) +;; (not (tree-search code1 :call))) +;; (warn "got b: ~S ~S for ~S: ~{~&~A~}" form0 form1 reg0 code1)) + (let ((binding (make-instance 'temporary-name :name (gensym "tmp-"))) + (xenv (make-local-movitz-environment env funobj))) + (movitz-env-add-binding xenv binding) + (append (compiler-call #'compile-form + :form form0 + :funobj funobj + :env env + :result-mode reg0) + `((:init-lexvar ,binding :init-with-register ,reg0 + :init-with-type ,(type-specifier-primary type0))) + (compiler-call #'compile-form + :form form1 + :funobj funobj + :env xenv + :result-mode reg1) + `((:load-lexical ,binding ,reg0)))))) (and functional0 functional1) t (compiler-values-list (all0))