From: Nikodemus S. <de...@us...> - 2010-09-01 14:42:18
|
Update of /cvsroot/sbcl/sbcl/src/compiler In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv20350/src/compiler Modified Files: ir1tran.lisp ir1util.lisp node.lisp Log Message: 1.0.42.15: prevent inline expansion from creating refs to dead lambda-vars * Fixes lp#454681. * Patch by Alexey. In his words, in reference to the test-case: (multiple-value-bind (iterator+977 getter+978) (does-not-exist-but-does-not-matter) (flet ((iterator+976 () (funcall iterator+977))) (declare (inline iterator+976)) (let ((iterator+976 #'iterator+976)) (funcall iterator+976))))) Inline expansion of ITERATOR+976 tries to refer to a dead LAMBDA-VAR ITERATOR+977 of varargs entry, which was substituted with ITERATOR+977 of &OPTIONAL processor. Thus the referenced variable is dead and is not bound anywhere. The attached patch fixes the problem by giving up on inline expansion if it tries to make a reference to a dead LAMBDA-VAR, similar to the way dead BLOCK tags are treated. Index: ir1tran.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/ir1tran.lisp,v retrieving revision 1.177 retrieving revision 1.178 diff -u -d -r1.177 -r1.178 --- ir1tran.lisp 19 Mar 2010 21:33:08 -0000 1.177 +++ ir1tran.lisp 1 Sep 2010 14:42:09 -0000 1.178 @@ -594,8 +594,7 @@ ;;; functional instead. (defun reference-leaf (start next result leaf &optional (name '.anonymous.)) (declare (type ctran start next) (type (or lvar null) result) (type leaf leaf)) - (when (functional-p leaf) - (assure-functional-live-p leaf)) + (assure-leaf-live-p leaf) (let* ((type (lexenv-find leaf type-restrictions)) (leaf (or (and (defined-fun-p leaf) (not (eq (defined-fun-inlinep leaf) Index: ir1util.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/ir1util.lisp,v retrieving revision 1.134 retrieving revision 1.135 diff -u -d -r1.134 -r1.135 --- ir1util.lisp 28 Feb 2010 17:37:12 -0000 1.134 +++ ir1util.lisp 1 Sep 2010 14:42:09 -0000 1.135 @@ -1052,6 +1052,7 @@ (defun delete-lambda-var (leaf) (declare (type lambda-var leaf)) + (setf (lambda-var-deleted leaf) t) ;; Iterate over all local calls flushing the corresponding argument, ;; allowing the computation of the argument to be deleted. We also ;; mark the LET for reoptimization, since it may be that we have @@ -2035,6 +2036,15 @@ (memq (functional-kind functional) '(:deleted :zombie)))) (throw 'locall-already-let-converted functional))) +(defun assure-leaf-live-p (leaf) + (typecase leaf + (lambda-var + (when (lambda-var-deleted leaf) + (throw 'locall-already-let-converted leaf))) + (functional + (assure-functional-live-p leaf)))) + + (defun call-full-like-p (call) (declare (type combination call)) (let ((kind (basic-combination-kind call))) Index: node.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/node.lisp,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- node.lisp 19 Mar 2010 21:33:08 -0000 1.87 +++ node.lisp 1 Sep 2010 14:42:09 -0000 1.88 @@ -1102,7 +1102,11 @@ ;; This is set by physical environment analysis if it chooses an ;; indirect (value cell) representation for this variable because it ;; is both set and closed over. - indirect) + indirect + ;; true if the last reference has been deleted (and new references + ;; should not be made) + deleted + ) (def!struct (lambda-var (:include basic-var)) (flags (lambda-var-attributes) @@ -1143,6 +1147,8 @@ `(lambda-var-attributep (lambda-var-flags ,var) ignore)) (defmacro lambda-var-indirect (var) `(lambda-var-attributep (lambda-var-flags ,var) indirect)) +(defmacro lambda-var-deleted (var) + `(lambda-var-attributep (lambda-var-flags ,var) deleted)) ;;;; basic node types |