]> git.eshelyaron.com Git - emacs.git/commitdiff
Better commutative binary numerical op codegen
authorMattias Engdegård <mattiase@acm.org>
Sun, 29 Jan 2023 12:34:48 +0000 (13:34 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sun, 29 Jan 2023 12:48:23 +0000 (13:48 +0100)
* 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.

lisp/emacs-lisp/bytecomp.el

index bfb9be4712bc89ef4a6cfae32fb51a198e7e7053..e8a8fe37756afaf635796d7f515ca7725a8e9f2a 100644 (file)
@@ -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))))