summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorMattias EngdegÄrd <mattiase@acm.org>2023-01-29 13:34:48 +0100
committerMattias EngdegÄrd <mattiase@acm.org>2023-01-29 13:48:23 +0100
commit254c75fc2935e7edef079166d90b231278115a2f (patch)
treee0255c78283d649134a5c0723929a8b736410649 /lisp/emacs-lisp
parente55855c5a1e85e230d2860c973358a34eb72da64 (diff)
downloademacs-254c75fc2935e7edef079166d90b231278115a2f.tar.gz
emacs-254c75fc2935e7edef079166d90b231278115a2f.tar.bz2
emacs-254c75fc2935e7edef079166d90b231278115a2f.zip
Better commutative binary numerical op codegen
* lisp/emacs-lisp/bytecomp.el (byte-compile-variadic-numeric): Put a constant argument last for better LAP code opportunities. This applies to commutative binary operations (+ and *). `min` and `max` are not included being not quite commutative.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/bytecomp.el12
1 files changed, 9 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index bfb9be4712b..e8a8fe37756 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -4063,9 +4063,15 @@ This function is never called when `lexical-binding' is nil."
(byte-compile-constant 1)
(byte-compile-out (get '* 'byte-opcode) 0))
(3
- (byte-compile-form (nth 1 form))
- (byte-compile-form (nth 2 form))
- (byte-compile-out (get (car form) 'byte-opcode) 0))
+ (let ((arg1 (nth 1 form))
+ (arg2 (nth 2 form)))
+ (when (and (memq (car form) '(+ *))
+ (macroexp-const-p arg1))
+ ;; Put constant argument last for better LAP optimisation.
+ (cl-rotatef arg1 arg2))
+ (byte-compile-form arg1)
+ (byte-compile-form arg2)
+ (byte-compile-out (get (car form) 'byte-opcode) 0)))
(_
;; >2 args: compile as a single function call.
(byte-compile-normal-call form))))