(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)