X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fstack.lisp;h=00730cbafa714760b17dfbda0d34ee4ba7e2df60;hb=975f1932acc3a8e90fb31d2b055bfbdde78ea927;hp=4ac4c7af2d82b5651b800da1dd2fd33a1b5b315c;hpb=6d69dfcc438b3530fa922e518919158ccf1af497;p=sbcl.git diff --git a/src/compiler/stack.lisp b/src/compiler/stack.lisp index 4ac4c7a..00730cb 100644 --- a/src/compiler/stack.lisp +++ b/src/compiler/stack.lisp @@ -61,6 +61,7 @@ ;;; been changed. (defun merge-uvl-live-sets (early late) (declare (type list early late)) + ;; FIXME: O(N^2) (dolist (e late early) (pushnew e early))) @@ -93,21 +94,23 @@ block (lambda (dx-cleanup) (dolist (lvar (cleanup-info dx-cleanup)) - (let* ((generator (lvar-use lvar)) - (block (node-block generator)) - (2block (block-info block))) - ;; DX objects, living in the LVAR, are - ;; alive in the environment, protected by - ;; the CLEANUP. We also cannot move them - ;; (because, in general, we cannot track - ;; all references to them). Therefore, - ;; everything, allocated deeper than a DX - ;; object, should be kept alive until the - ;; object is deallocated. - (setq new-end (merge-uvl-live-sets - new-end (ir2-block-end-stack 2block))) - (setq new-end (merge-uvl-live-sets - new-end (ir2-block-pushed 2block))))))) + (let ((uses (lvar-uses lvar))) + (dolist (generator (if (listp uses) uses (list uses))) + (let* ((block (node-block generator)) + (2block (block-info block))) + ;; DX objects, living in the LVAR, are + ;; alive in the environment, protected + ;; by the CLEANUP. We also cannot move + ;; them (because, in general, we cannot + ;; track all references to + ;; them). Therefore, everything, + ;; allocated deeper than a DX object, + ;; should be kept alive until the + ;; object is deallocated. + (setq new-end (merge-uvl-live-sets + new-end (ir2-block-end-stack 2block))) + (setq new-end (merge-uvl-live-sets + new-end (ir2-block-pushed 2block))))))))) (setf (ir2-block-end-stack 2block) new-end)