Function: comp-fwprop-insn
comp-fwprop-insn is a byte-compiled function defined in comp.el.gz.
Signature
(comp-fwprop-insn INSN)
Documentation
Propagate within INSN.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/comp.el.gz
(defun comp-fwprop-insn (insn)
"Propagate within INSN."
(pcase insn
(`(set ,lval ,rval)
(pcase rval
(`(,(or 'call 'callref) ,f . ,args)
(comp-fwprop-call insn lval f args))
(`(,(or 'direct-call 'direct-callref) ,f . ,args)
(let ((f (comp-func-name (gethash f (comp-ctxt-funcs-h comp-ctxt)))))
(comp-fwprop-call insn lval f args)))
(_
(comp-cstr-shallow-copy lval rval))))
(`(assume ,lval ,(and (pred comp-mvar-p) rval))
(comp-cstr-shallow-copy lval rval))
(`(assume ,lval (,kind . ,operands))
(cl-case kind
(and
(apply #'comp-cstr-intersection lval operands))
(and-nhc
(apply #'comp-cstr-intersection-no-hashcons lval operands))
(not
;; Prevent double negation!
(unless (comp-cstr-neg (car operands))
(comp-cstr-value-negation lval (car operands))))
(>
(comp-cstr-> lval (car operands) (cadr operands)))
(>=
(comp-cstr->= lval (car operands) (cadr operands)))
(<
(comp-cstr-< lval (car operands) (cadr operands)))
(<=
(comp-cstr-<= lval (car operands) (cadr operands)))
(=
(comp-cstr-= lval (car operands) (cadr operands)))))
(`(setimm ,lval ,v)
(setf (comp-cstr-imm lval) v))
(`(phi ,lval . ,rest)
(let* ((from-latch (cl-some
(lambda (x)
(let* ((bb-name (cadr x))
(bb (gethash bb-name
(comp-func-blocks comp-func))))
(or (comp-latch-p bb)
(when (comp-block-cstr-p bb)
(comp-latch-p (car (comp-block-preds bb)))))))
rest))
(prop-fn (if from-latch
#'comp-cstr-union-no-range
#'comp-cstr-union))
(rvals (mapcar #'car rest)))
(apply prop-fn lval rvals)))))