]> git.eshelyaron.com Git - emacs.git/commitdiff
* Mitigate possible speed 3 miss-optimization
authorAndrea Corallo <akrl@sdf.org>
Sat, 6 Jun 2020 14:53:34 +0000 (16:53 +0200)
committerAndrea Corallo <akrl@sdf.org>
Sat, 6 Jun 2020 21:03:11 +0000 (22:03 +0100)
Do not perform trampoline optimization at speed 3 on function if their
name is not unique inside the compilation unit.  Note that the
function can still be redefined in any other way therefore this is a
mitigation.

* lisp/emacs-lisp/comp.el (comp-func-unique-in-cu-p): New
predicate.
(comp-call-optim-form-call): Perform trampoline optimization
for named functions only if they are unique within the current
compilation unit.

lisp/emacs-lisp/comp.el

index f30409ae5cd01641bf14c5a2e7d948c5411a94b7..b8ab48a9965a382a1e1de16db316cd1e3349bca0 100644 (file)
@@ -399,6 +399,18 @@ structure.")
   "Type hint predicate for function name FUNC."
   (when (memq func comp-type-hints) t))
 
+(defun comp-func-unique-in-cu-p (func)
+  "Return t if FUNC is know to be unique in the current compilation unit."
+  (if (symbolp func)
+      (cl-loop with h = (make-hash-table :test #'eq)
+               for f being the hash-value in (comp-ctxt-funcs-h comp-ctxt)
+               for name = (comp-func-name f)
+               when (gethash name h)
+                 return nil
+               do (puthash name t h)
+               finally return t)
+    t))
+
 (defsubst comp-alloc-class-to-container (alloc-class)
   "Given ALLOC-CLASS return the data container for the current context.
 Assume allocaiton class 'd-default as default."
@@ -2018,7 +2030,8 @@ FUNCTION can be a function-name or byte compiled function."
          ;; Intra compilation unit procedure call optimization.
          ;; Attention speed 3 triggers this for non self calls too!!
          ((and comp-func-callee
-               (or (>= comp-speed 3)
+               (or (and (>= comp-speed 3)
+                        (comp-func-unique-in-cu-p callee))
                    (and (>= comp-speed 2)
                         ;; Anonymous lambdas can't be redefined so are
                         ;; always safe to optimize.