From: Juho S. <js...@us...> - 2007-01-18 00:32:08
|
Update of /cvsroot/sbcl/sbcl/src/compiler In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv24275/src/compiler Modified Files: fopcompile.lisp locall.lisp main.lisp Log Message: 1.0.1.31: Speed up fopcompilation of functions * Get rid of the extra wrapper lambda around fopcompiled functions * This requires making sure that functions with xeps are never let- or assignment-converted. * Fix some whitespace damage, and a few tests that were making invalid assumptions * Compilation speedup seems to be about 5% for most cases, up to 20% on high debug levels. Index: fopcompile.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/fopcompile.lisp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- fopcompile.lisp 15 Jan 2007 21:05:43 -0000 1.5 +++ fopcompile.lisp 18 Jan 2007 00:32:04 -0000 1.6 @@ -384,17 +384,11 @@ (cond ;; Lambda forms are compiled with the real compiler ((lambda-form-p form) - ;; We wrap the real lambda inside another one to ensure - ;; that the compiler doesn't e.g. let convert it, thinking - ;; that there are no external references. - (let* ((handle (%compile `(lambda () ,form) + (let* ((handle (%compile form *compile-object* :path path))) (when for-value-p - (sb!fasl::dump-push handle *compile-object*) - ;; And then call the wrapper function when loading the FASL - (sb!fasl::dump-fop 'sb!fasl::fop-funcall *compile-object*) - (sb!fasl::dump-byte 0 *compile-object*)))) + (sb!fasl::dump-push handle *compile-object*)))) ;; While function names are translated to a call to FDEFINITION. ((legal-fun-name-p form) (dump-fdefinition form)) Index: locall.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/locall.lisp,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- locall.lisp 28 May 2006 04:16:09 -0000 1.75 +++ locall.lisp 18 Jan 2007 00:32:04 -0000 1.76 @@ -1050,7 +1050,8 @@ ;;; true if we converted. (defun maybe-let-convert (clambda) (declare (type clambda clambda)) - (unless (declarations-suppress-let-conversion-p clambda) + (unless (or (declarations-suppress-let-conversion-p clambda) + (functional-has-external-references-p clambda)) ;; We only convert to a LET when the function is a normal local ;; function, has no XEP, and is referenced in exactly one local ;; call. Conversion is also inhibited if the only reference is in @@ -1166,7 +1167,8 @@ (defun maybe-convert-to-assignment (clambda) (declare (type clambda clambda)) (when (and (not (functional-kind clambda)) - (not (functional-entry-fun clambda))) + (not (functional-entry-fun clambda)) + (not (functional-has-external-references-p clambda))) (let ((outside-non-tail-call nil) (outside-call nil)) (when (and (dolist (ref (leaf-refs clambda) t) Index: main.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/main.lisp,v retrieving revision 1.119 retrieving revision 1.120 diff -u -d -r1.119 -r1.120 --- main.lisp 9 Jan 2007 03:25:05 -0000 1.119 +++ main.lisp 18 Jan 2007 00:32:04 -0000 1.120 @@ -986,6 +986,7 @@ (assert-global-function-definition-type name locall-fun)) (setf (functional-entry-fun fun) locall-fun (functional-kind fun) :external + (functional-has-external-references-p locall-fun) t (functional-has-external-references-p fun) t) fun))) |