* Optimize pure functions defined by the compilation environment
* lisp/emacs-lisp/comp.el (comp-apply-in-env): New macro. (comp-function-call-maybe-remove): Update to make use of `comp-apply-in-env'.
This commit is contained in:
parent
7622740e29
commit
b4de6baa7b
1 changed files with 27 additions and 7 deletions
|
@ -1995,6 +1995,22 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non nil."
|
|||
(copy-comp-mvar insn)
|
||||
insn)))
|
||||
|
||||
(defmacro comp-apply-in-env (func &rest args)
|
||||
"Apply FUNC to ARGS in the current compilation environment."
|
||||
`(let ((env (cl-loop
|
||||
for f being the hash-value in (comp-ctxt-funcs-h comp-ctxt)
|
||||
for func-name = (comp-func-name f)
|
||||
for byte-code = (comp-func-byte-func f)
|
||||
when func-name
|
||||
collect `(,func-name . ,(symbol-function func-name))
|
||||
and do
|
||||
(setf (symbol-function func-name) byte-code))))
|
||||
(unwind-protect
|
||||
(apply ,func ,@args)
|
||||
(cl-loop
|
||||
for (func-name . def) in env
|
||||
do (setf (symbol-function func-name) def)))))
|
||||
|
||||
(defun comp-ref-args-to-array (args)
|
||||
"Given ARGS assign them to a dedicated array."
|
||||
(when args
|
||||
|
@ -2064,13 +2080,17 @@ Here goes everything that can be done not iteratively (read once).
|
|||
(car args))))))
|
||||
((comp-function-optimizable-p f args)
|
||||
(ignore-errors
|
||||
;; No point to complain here because we should do basic block
|
||||
;; pruning in order to be sure that this is not dead-code. This
|
||||
;; is now left to gcc, to be implemented only if we want a
|
||||
;; reliable diagnostic here.
|
||||
(rewrite-insn-as-setimm insn
|
||||
(apply f
|
||||
(mapcar #'comp-mvar-constant args))))))))
|
||||
;; No point to complain here in case of error because we
|
||||
;; should do basic block pruning in order to be sure that this
|
||||
;; is not dead-code. This is now left to gcc, to be
|
||||
;; implemented only if we want a reliable diagnostic here.
|
||||
(let* ((f (if-let (f-in-ctxt (comp-symbol-func-to-fun f))
|
||||
;; If the function is IN the compilation ctxt
|
||||
;; and know to be pure.
|
||||
(comp-func-byte-func f-in-ctxt)
|
||||
f))
|
||||
(value (comp-apply-in-env f (mapcar #'comp-mvar-constant args))))
|
||||
(rewrite-insn-as-setimm insn value)))))))
|
||||
|
||||
(defun comp-propagate-insn (insn)
|
||||
"Propagate within INSN."
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue