0.8alpha.0.32:
[sbcl.git] / src / compiler / ir1util.lisp
index 6805e4f..b3f02b5 100644 (file)
   (remove-from-dfo block)
   (values))
 
-;;; Do stuff to indicate that the return node Node is being deleted.
-;;; We set the RETURN to NIL.
+;;; Do stuff to indicate that the return node NODE is being deleted.
 (defun delete-return (node)
   (declare (type creturn node))
-  (let ((fun (return-lambda node)))
+  (let* ((fun (return-lambda node))
+         (tail-set (lambda-tail-set fun)))
     (aver (lambda-return fun))
-    (setf (lambda-return fun) nil))
+    (setf (lambda-return fun) nil)
+    (when (and tail-set (not (find-if #'lambda-return (tail-set-funs tail-set))))
+      (setf (tail-set-type tail-set) *empty-type*)))
   (values))
 
 ;;; If any of the VARS in FUN was never referenced and was not
          (setf (continuation-asserted-type cont) *wild-type*)
           (setf (continuation-type-to-check cont) *wild-type*)
          (values))))))
+
+(defun flush-combination (combination)
+  (declare (type combination combination))
+  (flush-dest (combination-fun combination))
+  (dolist (arg (combination-args combination))
+    (flush-dest arg))
+  (unlink-node combination)
+  (values))
+
 \f
 ;;;; leaf hackery
 
     (setf (ref-leaf ref) leaf)
     (setf (leaf-ever-used leaf) t)
     (let ((ltype (leaf-type leaf)))
-      (if (fun-type-p ltype)
+      (if (let* ((cont (node-cont ref))
+                 (dest (continuation-dest cont)))
+            (and (basic-combination-p dest)
+                 (eq cont (basic-combination-fun dest))))
          (setf (node-derived-type ref) ltype)
          (derive-node-type ref ltype)))
     (reoptimize-continuation (node-cont ref)))