(return))
(let ((kind (functional-kind functional)))
(cond ((or (functional-somewhat-letlike-p functional)
- (eql kind :deleted))
+ (memq kind '(:deleted :zombie)))
(values)) ; nothing to do
((and (null (leaf-refs functional)) (eq kind nil)
(not (functional-entry-fun functional)))
;;; new references to it.
(defun let-convert (fun call)
(declare (type clambda fun) (type basic-combination call))
- (let ((next-block (if (node-tail-p call)
- nil
- (insert-let-body fun call))))
+ (let* ((next-block (insert-let-body fun call))
+ (next-block (if (node-tail-p call)
+ nil
+ next-block)))
(move-return-stuff fun call next-block)
- (merge-lets fun call)))
+ (merge-lets fun call)
+ (setf (node-tail-p call) nil)
+ ;; If CALL has a derive type NIL, it means that "its return" is
+ ;; unreachable, but the next BIND is still reachable; in order to
+ ;; not confuse MAYBE-TERMINATE-BLOCK...
+ (setf (node-derived-type call) *wild-type*)))
;;; Reoptimize all of CALL's args and its result.
(defun reoptimize-call (call)