]> git.eshelyaron.com Git - emacs.git/commitdiff
* Optimize pure functions defined by the compilation environment
authorAndrea Corallo <akrl@sdf.org>
Sun, 5 Jul 2020 21:05:36 +0000 (22:05 +0100)
committerAndrea Corallo <akrl@sdf.org>
Thu, 9 Jul 2020 15:22:48 +0000 (16:22 +0100)
* 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'.

lisp/emacs-lisp/comp.el

index 000af0a8b34c6b3176659a4d6fcbf91ed2c9c5d3..5ff2e0983718a3a99d42626018c40f4e810a6ce0 100644 (file)
@@ -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."