]> git.eshelyaron.com Git - emacs.git/commitdiff
Optimise prog1 better
authorMattias Engdegård <mattiase@acm.org>
Thu, 29 Jul 2021 08:07:26 +0000 (10:07 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 30 Jul 2021 07:54:29 +0000 (09:54 +0200)
Rewrite (prog1 CONST FORMS...) => (progn FORMS... CONST)
where CONST is a compile-time constant, because putting the value last
allows the lapcode peephole pass to do important improvements like
branch elimination.  Also use progn instead of prog1 for `ignore`.

* lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
New `prog1` and `ignore` transforms.

lisp/emacs-lisp/byte-opt.el

index 58a08eb3cdbfb8e167af3fd79e3a4c93586a54c4..b6052d8206100cb66617c14ebac86587f1ef27e1 100644 (file)
@@ -452,10 +452,13 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
            (macroexp-progn (byte-optimize-body exps for-effect))
         (byte-optimize-form (car exps) for-effect)))
       (`(prog1 ,exp . ,exps)
-       (if exps
-          `(prog1 ,(byte-optimize-form exp for-effect)
-             . ,(byte-optimize-body exps t))
-        (byte-optimize-form exp for-effect)))
+       (let ((exp-opt (byte-optimize-form exp for-effect)))
+         (if exps
+             (let ((exps-opt (byte-optimize-body exps t)))
+               (if (macroexp-const-p exp-opt)
+                   `(progn ,@exps-opt ,exp-opt)
+                `(prog1 ,exp-opt ,@exps-opt)))
+          exp-opt)))
 
       (`(,(or `save-excursion `save-restriction `save-current-buffer) . ,exps)
        ;; Those subrs which have an implicit progn; it's not quite good
@@ -572,7 +575,7 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
        ;; computed for effect.  We want to avoid the warnings
        ;; that might occur if they were treated that way.
        ;; However, don't actually bother calling `ignore'.
-       `(prog1 nil . ,(mapcar #'byte-optimize-form exps)))
+       `(progn ,@(mapcar #'byte-optimize-form exps) nil))
 
       ;; Needed as long as we run byte-optimize-form after cconv.
       (`(internal-make-closure . ,_)