X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmacros.lisp;h=c92c88a25f2594582889ff02a274b9bfd820b7fe;hb=20b2378572cf7378f3f267e2234c4234dacfbdc9;hp=e96a92bf134a903658a0a07ef2828f00a18e595a;hpb=ddc94b60746df2f6ace927af6be6046cdc1e8a1b;p=sbcl.git diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index e96a92b..c92c88a 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -631,15 +631,22 @@ ;;; 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) &body body) +(defmacro do-nodes-backwards ((node-var lvar block &key restart-p) &body body) (let ((n-block (gensym)) (n-prev (gensym))) `(loop with ,n-block = ,block - for ,node-var = (block-last ,n-block) then (ctran-use ,n-prev) + 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 ,node-var + while ,(if restart-p + `(and ,node-var (not (block-to-be-deleted-p ,n-block))) + node-var) do (progn ,@body))))