0.8.9.10:
[sbcl.git] / src / compiler / ir1opt.lisp
index 7238730..c7ac819 100644 (file)
     (when (block-start next)  ; NEXT is not an END-OF-COMPONENT marker
       (cond ( ;; We cannot combine with a successor block if:
              (or
-              ;; The successor has more than one predecessor.
+              ;; the successor has more than one predecessor;
               (rest (block-pred next))
-              ;; The successor is the current block (infinite loop).
+              ;; the successor is the current block (infinite loop);
               (eq next block)
-              ;; The next block has a different cleanup, and thus
+              ;; the next block has a different cleanup, and thus
               ;; we may want to insert cleanup code between the
-              ;; two blocks at some point.
+              ;; two blocks at some point;
               (not (eq (block-end-cleanup block)
                        (block-start-cleanup next)))
-              ;; The next block has a different home lambda, and
+              ;; the next block has a different home lambda, and
               ;; thus the control transfer is a non-local exit.
               (not (eq (block-home-lambda block)
-                       (block-home-lambda next))))
+                       (block-home-lambda next)))
+              ;; Stack analysis phase wants ENTRY to start a block.
+              (entry-p (block-start-node next)))
              nil)
             (t
              (join-blocks block next)
         (recognize-known-call call ir1-converting-not-optimizing-p))
        ((valid-fun-use call type
                        :argument-test #'always-subtypep
-                       :result-test #'always-subtypep
+                       :result-test nil
                        ;; KLUDGE: Common Lisp is such a dynamic
                        ;; language that all we can do here in
                        ;; general is issue a STYLE-WARNING. It
     (unlink-node call)
     (unlink-node (lambda-bind clambda))
     (setf (lambda-bind clambda) nil))
+  (setf (functional-kind clambda) :zombie)
+  (let ((home (lambda-home clambda)))
+    (setf (lambda-lets home) (delete clambda (lambda-lets home))))
   (values))
 
 ;;; This function is called when one of the arguments to a LET
 (deftransform values ((&rest vals) * * :node node)
   (unless (lvar-single-value-p (node-lvar node))
     (give-up-ir1-transform))
-  (setf (node-derived-type node) *wild-type*)
+  (setf (node-derived-type node)
+        (make-short-values-type (list (single-value-type
+                                       (node-derived-type node)))))
   (principal-lvar-single-valuify (node-lvar node))
   (if vals
       (let ((dummies (make-gensym-list (length (cdr vals)))))
                            (immediately-used-p value use))
                   (unless next-block
                     (when ctran (ensure-block-start ctran))
-                    (setq next-block (first (block-succ (node-block cast)))))
+                    (setq next-block (first (block-succ (node-block cast))))
+                    (ensure-block-start (node-prev cast)))
                   (%delete-lvar-use use)
                   (add-lvar-use use lvar)
                   (unlink-blocks (node-block use) (node-block cast))