diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2021-07-29 10:07:26 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2021-07-30 09:54:29 +0200 |
commit | dc9e2a1749c892cdf52a01414bee97e9a2245ca5 (patch) | |
tree | a9b13c9ca71f5b5d5f10891e2bd17cdd589cddb0 /lisp/emacs-lisp | |
parent | 9a6333811441a32e49bfd33c14f77680402cd639 (diff) | |
download | emacs-dc9e2a1749c892cdf52a01414bee97e9a2245ca5.tar.gz emacs-dc9e2a1749c892cdf52a01414bee97e9a2245ca5.tar.bz2 emacs-dc9e2a1749c892cdf52a01414bee97e9a2245ca5.zip |
Optimise prog1 better
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.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/byte-opt.el | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 58a08eb3cdb..b6052d82061 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -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 . ,_) |