((continuation-block cont)
(block-home-lambda-or-null (continuation-block cont)))
(t
- (bug "confused about home lambda for ~S"))))
+ (bug "confused about home lambda for ~S" cont))))
;;; Return the LAMBDA that is CONT's home.
(declaim (ftype (sfunction (continuation) clambda)
;;; beginning of the current value, rather than replacing it entirely.
(defun make-lexenv (&key (default *lexenv*)
funs vars blocks tags
- type-restrictions weakend-type-restrictions
+ type-restrictions
(lambda (lexenv-lambda default))
(cleanup (lexenv-cleanup default))
(policy (lexenv-policy default)))
(frob blocks lexenv-blocks)
(frob tags lexenv-tags)
(frob type-restrictions lexenv-type-restrictions)
- (frob weakend-type-restrictions lexenv-weakend-type-restrictions)
lambda cleanup policy)))
;;; Makes a LEXENV, suitable for using in a MACROLET introduced
nil
nil
(lexenv-type-restrictions lexenv) ; XXX
- (lexenv-weakend-type-restrictions lexenv)
nil
nil
(lexenv-policy lexenv))))
(return-block (and return (node-block return))))
(unless (leaf-ever-used clambda)
(let ((*compiler-error-context* bind))
- (compiler-notify "deleting unused function~:[.~;~:*~% ~S~]"
- (leaf-debug-name clambda))))
+ (compiler-notify 'code-deletion-note
+ :format-control "deleting unused function~:[.~;~:*~% ~S~]"
+ :format-arguments (list (leaf-debug-name clambda)))))
(unless (block-delete-p bind-block)
(unlink-blocks (component-head component) bind-block))
(when (and return-block (not (block-delete-p return-block)))
(when last
(let ((cont (node-cont last)))
(delete-continuation-use last)
- (if (eq (continuation-kind cont) :unused)
- (delete-continuation cont)
- (reoptimize-continuation cont)))))
+ (acond ((eq (continuation-kind cont) :unused)
+ (delete-continuation cont))
+ ((and (null (find-uses cont))
+ (continuation-dest cont))
+ (mark-for-deletion (node-block it)))
+ ((reoptimize-continuation cont))))))
(dolist (b (block-pred block))
(unlink-blocks b block)
(cast
(flush-dest (cast-value node))))
- (delete-continuation (node-prev node)))
+ (delete-continuation (node-prev node)))
(remove-from-dfo block)
(values))
0)))
(unless (return-p node)
(let ((*compiler-error-context* node))
- (compiler-notify "deleting unreachable code")))
+ (compiler-notify 'code-deletion-note
+ :format-control "deleting unreachable code"
+ :format-arguments nil)))
(return))))))
(values))
*inline-expansion-limit*))
nil)
(t t))))
+
+;;; Make sure that FUNCTIONAL is not let-converted or deleted.
+(defun assure-functional-live-p (functional)
+ (declare (type functional functional))
+ (when (and (or
+ ;; looks LET-converted
+ (functional-somewhat-letlike-p functional)
+ ;; It's possible for a LET-converted function to end up
+ ;; deleted later. In that case, for the purposes of this
+ ;; analysis, it is LET-converted: LET-converted functionals
+ ;; are too badly trashed to expand them inline, and deleted
+ ;; LET-converted functionals are even worse.
+ (eql (functional-kind functional) :deleted)))
+ (throw 'locall-already-let-converted functional)))
\f
;;;; careful call