From 489a79de96c7f90271e57b86b8162ef7ba500fed Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sat, 6 Jun 2020 16:53:34 +0200 Subject: [PATCH] * Mitigate possible speed 3 miss-optimization 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 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index f30409ae5cd..b8ab48a9965 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -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. -- 2.39.5