1.0.27.40: host-invariant string constant coalescing
[sbcl.git] / src / compiler / locall.lisp
index fe1dea8..fe8af57 100644 (file)
                 (handle-nested-dynamic-extent-lvars dx (cast-value use)))
                (combination
                 (loop for arg in (combination-args use)
-                      when (lvar-good-for-dx-p arg dx)
-                      append (handle-nested-dynamic-extent-lvars dx arg))))))
+                      ;; deleted args show up as NIL here
+                      when (and arg (lvar-good-for-dx-p arg dx))
+                      append (handle-nested-dynamic-extent-lvars dx arg)))
+               (ref
+                (let* ((other (trivial-lambda-var-ref-lvar use)))
+                  (unless (eq other lvar)
+                    (handle-nested-dynamic-extent-lvars dx other)))))))
       (cons lvar
             (if (listp uses)
                 (loop for use in uses
                do (entries `((eql ,n-supplied ,n)
                              (%funcall ,(force ep) ,@(subseq temps 0 n)))))
          `(lambda (,n-supplied ,@temps)
-            ;; FIXME: Make sure that INDEX type distinguishes between
-            ;; target and host. (Probably just make the SB!XC:DEFTYPE
-            ;; different from CL:DEFTYPE.)
             (declare (type index ,n-supplied))
             (cond
              ,@(if more (butlast (entries)) (entries))
                  ;; KLUDGE: (NOT (< ...)) instead of >= avoids one round of
                  ;; deftransforms and lambda-conversion.
                  `((,(if (zerop min) t `(not (< ,n-supplied ,max)))
-                    ,(let ((n-context (gensym))
-                           (n-count (gensym)))
+                    ,(with-unique-names (n-context n-count)
                        `(multiple-value-bind (,n-context ,n-count)
                             (%more-arg-context ,n-supplied ,max)
                           (locally
   (with-ir1-environment-from-node (lambda-bind (main-entry fun))
     (let ((res (ir1-convert-lambda (make-xep-lambda-expression fun)
                                    :debug-name (debug-name
-                                                'xep (leaf-debug-name fun)))))
+                                                'xep (leaf-debug-name fun))
+                                   :system-lambda t)))
       (setf (functional-kind res) :external
             (leaf-ever-used res) t
             (functional-entry-fun res) fun
                (%funcall ,entry ,@args))
             :debug-name (debug-name 'hairy-function-entry
                                     (lvar-fun-debug-name
-                                     (basic-combination-fun call)))))))
+                                     (basic-combination-fun call)))
+            :system-lambda t))))
     (convert-call ref call new-fun)
     (dolist (ref (leaf-refs entry))
       (convert-call-if-possible ref (lvar-dest (node-lvar ref))))))
     (setf (lambda-physenv clambda) home-physenv)
 
     (when physenv
+      (unless home-physenv
+        (setf home-physenv (get-lambda-physenv home)))
       (setf (physenv-nlx-info home-physenv)
             (nconc (physenv-nlx-info physenv)
                    (physenv-nlx-info home-physenv))))