0.8.7.4:
[sbcl.git] / src / compiler / macros.lisp
index 98ab8fc..c92c88a 100644 (file)
                                     (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)