]> git.eshelyaron.com Git - emacs.git/commitdiff
(byte-optimize-if): Move `progn' out of the test
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 23 Aug 2007 19:56:16 +0000 (19:56 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 23 Aug 2007 19:56:16 +0000 (19:56 +0000)
so as to optimise cases where the `progn's result is constant.

lisp/ChangeLog
lisp/emacs-lisp/byte-opt.el

index 947682cdc17ed2a8704bb5bc742ef055f9b06535..dadc3e0f78cdae3ebdf3fc0849f4aaa4ab014247 100644 (file)
@@ -1,7 +1,12 @@
+2007-08-23  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/byte-opt.el (byte-optimize-if): Move `progn' out of the test
+       so as to optimise cases where the `progn's result is constant.
+
 2007-08-23  Thien-Thi Nguyen  <ttn@gnuvola.org>
 
-       * locate.el (locate-get-file-positions): Use
-       line-beginning-position and line-end-position.
+       * locate.el (locate-get-file-positions):
+       Use line-beginning-position and line-end-position.
 
 2007-08-23  John Wiegley  <johnw@newartisans.com>
 
index 82a5cf0a75a6daa4e516a095b51c93b9a3b6b93e..b4eaf4ff5ebf15827771abeefd6ee11abf2439b4 100644 (file)
@@ -31,7 +31,7 @@
 ;; "No matter how hard you try, you can't make a racehorse out of a pig.
 ;; You can, however, make a faster pig."
 ;;
-;; Or, to put it another way, the emacs byte compiler is a VW Bug.  This code
+;; Or, to put it another way, the Emacs byte compiler is a VW Bug.  This code
 ;; makes it be a VW Bug with fuel injection and a turbocharger...  You're
 ;; still not going to make it go faster than 70 mph, but it might be easier
 ;; to get it there.
     form))
 
 (defun byte-optimize-if (form)
+  ;; (if (progn <insts> <test>) <rest>) ==> (progn <insts> (if <test> <rest>))
   ;; (if <true-constant> <then> <else...>) ==> <then>
   ;; (if <false-constant> <then> <else...>) ==> (progn <else...>)
   ;; (if <test> nil <else...>) ==> (if (not <test>) (progn <else...>))
   ;; (if <test> <then> nil) ==> (if <test> <then>)
   (let ((clause (nth 1 form)))
-    (cond ((byte-compile-trueconstp clause)
+    (cond ((eq (car clause) 'progn)
+           (if (null (cddr clause))
+               ;; A trivial `progn'.
+               (byte-optimize-if `(if ,(cadr clause) ,@(nthcdr 2 form)))
+             (nconc (butlast clause)
+                    (list
+                     (byte-optimize-if
+                      `(if ,(car (last clause)) ,@(nthcdr 2 form)))))))
+          ((byte-compile-trueconstp clause)
           (nth 2 form))
          ((null clause)
           (if (nthcdr 4 form)
 ;; This list contains numbers, which are pc values,
 ;; before each instruction.
 (defun byte-decompile-bytecode (bytes constvec)
-  "Turns BYTECODE into lapcode, referring to CONSTVEC."
+  "Turn BYTECODE into lapcode, referring to CONSTVEC."
   (let ((byte-compile-constants nil)
        (byte-compile-variables nil)
        (byte-compile-tag-number 0))