changeset 82790:346e6c150fa0

(byte-optimize-if): Move `progn' out of the test so as to optimise cases where the `progn's result is constant.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 23 Aug 2007 19:56:16 +0000
parents 4ca3b6194ff8
children 25892386493b
files lisp/ChangeLog lisp/emacs-lisp/byte-opt.el
diffstat 2 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu Aug 23 18:41:59 2007 +0000
+++ b/lisp/ChangeLog	Thu Aug 23 19:56:16 2007 +0000
@@ -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>
 
--- a/lisp/emacs-lisp/byte-opt.el	Thu Aug 23 18:41:59 2007 +0000
+++ b/lisp/emacs-lisp/byte-opt.el	Thu Aug 23 19:56:16 2007 +0000
@@ -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.
@@ -1014,12 +1014,21 @@
     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)
@@ -1326,7 +1335,7 @@
 ;; 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))