diff --git a/compiler/locall.lisp b/compiler/locall.lisp index e4290275705b474bb2465d34fb8ace2c4aceb05d..937b1a3b1706ffb817c9dcb045e4147dd0d6d4bb 100644 --- a/compiler/locall.lisp +++ b/compiler/locall.lisp @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/locall.lisp,v 1.56 2003/10/11 09:44:45 gerd Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/locall.lisp,v 1.57 2003/10/11 11:57:55 gerd Exp $") ;;; ;;; ********************************************************************** ;;; @@ -981,24 +981,31 @@ (member (functional-kind fun) '(nil :assignment)) (not (functional-entry-function fun))) (let* ((ref-cont (node-cont (first refs))) - (dest (continuation-dest ref-cont))) - (when (and dest - (basic-combination-p dest) - (eq (basic-combination-fun dest) ref-cont) - (eq (basic-combination-kind dest) :local) - (not (block-delete-p (node-block dest))) + (call (continuation-dest ref-cont))) + (when (and call + (basic-combination-p call) + (eq (basic-combination-fun call) ref-cont) + (eq (basic-combination-kind call) :local) + (not (block-delete-p (node-block call))) + ;; + ;; Gross hack. Shouldn't happen that the call has + ;; no successors, but it does happen when Python + ;; eliminates dead code, and the interpreter doesn't + ;; like if we don't let-convert in such a case. + (or *converting-for-interpreter* + (block-succ (node-block call))) (cond ((ok-initial-convert-p fun) t) (t (reoptimize-continuation ref-cont) nil))) - (when (eq fun (node-home-lambda dest)) + (when (eq fun (node-home-lambda call)) (delete-lambda fun) (return-from maybe-let-convert nil)) (unless (eq (functional-kind fun) :assignment) - (let-convert fun dest)) - (reoptimize-call dest) + (let-convert fun call)) + (reoptimize-call call) (setf (functional-kind fun) - (if (mv-combination-p dest) :mv-let :let)))) + (if (mv-combination-p call) :mv-let :let)))) t)))