Elide lexical variables in for-effect context in source optimiser
* 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.
This commit is contained in:
parent
566e29f78c
commit
9a63338114
1 changed files with 15 additions and 10 deletions
|
@ -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))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue