X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmacros.lisp;h=c92c88a25f2594582889ff02a274b9bfd820b7fe;hb=f73c1f391342c797b8daebe4e8c27e5923341b6d;hp=98ab8fc99a6dc9180d42f7dfc6d44fbbadf21eb7;hpb=6053e7f804b430144bb09e2d107ad4ab3fb97db4;p=sbcl.git diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 98ab8fc..c92c88a 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -619,30 +619,36 @@ (ctran-next it)) (t (return))))) ,@(when lvar-var - `((,lvar-var #1=(when (valued-node-p ,node-var) - (node-lvar ,node-var)) - #1#)))) + `((,lvar-var (when (valued-node-p ,node-var) + (node-lvar ,node-var)) + (when (valued-node-p ,node-var) + (node-lvar ,node-var)))))) (nil) ,@body ,@(when restart-p `((when (block-delete-p ,n-block) (return))))))) -;;; like DO-NODES, only iterating in reverse order -(defmacro do-nodes-backwards ((node-var lvar block) &body body) +;;; Like DO-NODES, only iterating in reverse order. Should be careful +;;; with block being split under us. +(defmacro do-nodes-backwards ((node-var lvar block &key restart-p) &body body) (let ((n-block (gensym)) - (n-start (gensym)) (n-prev (gensym))) - `(do* ((,n-block ,block) - (,n-start (block-start ,n-block)) - (,node-var (block-last ,n-block) (ctran-use ,n-prev)) - (,n-prev (node-prev ,node-var) (node-prev ,node-var)) - (,lvar #1=(when (valued-node-p ,node-var) (node-lvar ,node-var)) - #1#)) - (nil) - ,@body - (when (eq ,n-prev ,n-start) - (return nil))))) + `(loop with ,n-block = ,block + for ,node-var = (block-last ,n-block) then + ,(if restart-p + `(if (eq ,n-block (ctran-block ,n-prev)) + (ctran-use ,n-prev) + (block-last ,n-block)) + `(ctran-use ,n-prev)) + for ,n-prev = (when ,node-var (node-prev ,node-var)) + and ,lvar = (when (and ,node-var (valued-node-p ,node-var)) + (node-lvar ,node-var)) + while ,(if restart-p + `(and ,node-var (not (block-to-be-deleted-p ,n-block))) + node-var) + do (progn + ,@body)))) (defmacro do-nodes-carefully ((node-var block) &body body) (with-unique-names (n-block n-ctran)