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