0.8.1.52:
[sbcl.git] / src / compiler / ir1util.lisp
index 74f5a20..ea581fb 100644 (file)
     (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))
                              *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