Function: comp--place-phis
comp--place-phis is a byte-compiled function defined in comp.el.gz.
Signature
(comp--place-phis)
Documentation
Place phi insns into the current function.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/comp.el.gz
(defun comp--place-phis ()
"Place phi insns into the current function."
;; Originally based on: Static Single Assignment Book
;; Algorithm 3.1: Standard algorithm for inserting phi-functions
(cl-flet ((add-phi (slot-n bb)
;; Add a phi func for slot SLOT-N at the top of BB.
(push `(phi ,slot-n) (comp-block-insns bb)))
(slot-assigned-p (slot-n bb)
;; Return t if a SLOT-N was assigned within BB.
(cl-loop for insn in (comp-block-insns bb)
for op = (car insn)
when (or (and (comp--assign-op-p op)
(eql slot-n (comp-mvar-slot (cadr insn))))
;; fetch-handler is after a non local
;; therefore clobbers all frame!!!
(eq op 'fetch-handler))
return t)))
(cl-loop for i from (- (comp-func-vframe-size comp-func))
below (comp-func-frame-size comp-func)
;; List of blocks with a definition of mvar i
for defs-v = (cl-loop with blocks = (comp-func-blocks comp-func)
for b being each hash-value of blocks
when (slot-assigned-p i b)
collect b)
;; Set of basic blocks where phi is added.
for f = ()
;; Worklist, set of basic blocks that contain definitions of v.
for w = defs-v
do
(while w
(let ((x (pop w)))
(cl-loop for y being each hash-value of (comp-block-df x)
unless (cl-find y f)
do (add-phi i y)
(push y f)
;; Adding a phi implies mentioning the
;; corresponding slot so in case adjust w.
(unless (cl-find y defs-v)
(push y w))))))))