]> git.eshelyaron.com Git - emacs.git/commitdiff
Elide lexical variables in for-effect context in source optimiser
authorMattias Engdegård <mattiase@acm.org>
Wed, 28 Jul 2021 15:31:44 +0000 (17:31 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 30 Jul 2021 07:54:29 +0000 (09:54 +0200)
* lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
Remove for-effect uses of lexical variables.  We previously relied on
this being done by the lapcode peephole optimiser but at source level
it enables more optimisation opportunities.
Keywords are elided for the same reason.

lisp/emacs-lisp/byte-opt.el

index 4117533cda57156a0838db294b38492d52a5f537..58a08eb3cdbfb8e167af3fd79e3a4c93586a54c4 100644 (file)
@@ -402,19 +402,24 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
         ((and for-effect
              (or byte-compile-delete-errors
                  (not (symbolp form))
-                 (eq form t)))
+                 (eq form t)
+                  (keywordp form)))
          nil)
         ((symbolp form)
          (let ((lexvar (assq form byte-optimize--lexvars)))
-           (if (cddr lexvar)            ; Value available?
-               (if (assq form byte-optimize--vars-outside-loop)
-                   ;; Cannot substitute; mark for retention to avoid the
-                   ;; variable being eliminated.
-                   (progn
-                     (setcar (cdr lexvar) t)
-                     form)
-                 (caddr lexvar))        ; variable value to use
-             form)))
+           (cond
+            ((not lexvar) form)
+            (for-effect nil)
+            ((cddr lexvar)            ; Value available?
+             (if (assq form byte-optimize--vars-outside-loop)
+                 ;; Cannot substitute; mark for retention to avoid the
+                 ;; variable being eliminated.
+                 (progn
+                   (setcar (cdr lexvar) t)
+                   form)
+               ;; variable value to use
+               (caddr lexvar)))
+            (t form))))
         (t form)))
       (`(quote . ,v)
        (if (or (not v) (cdr v))