More robust optimisation of ignore

Treat `ignore` as any other function during source-level optimisation,
to avoid having its warning-suppression effects cancelled by repeated
passes.  Instead, define a custom code generation function.

* lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
Don't treat `ignore' specially here.
(side-effect-free-fns): Don't mark `ignore` as side-effect-free
or error-free (although it is), since that would allow the optimiser
to elide calls.
* lisp/emacs-lisp/bytecomp.el (ignore, byte-compile-ignore):
Define and register a code-gen function.
This commit is contained in:
Mattias Engdegård 2021-06-10 21:27:16 +02:00
parent fab1e220db
commit bba48d6ee5
2 changed files with 9 additions and 8 deletions

View file

@ -562,13 +562,6 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
`(catch ,(byte-optimize-form tag nil)
. ,(byte-optimize-body exps for-effect))))
(`(ignore . ,exps)
;; Don't treat the args to `ignore' as being
;; 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'.
`(progn ,@(mapcar #'byte-optimize-form exps) nil))
;; Needed as long as we run byte-optimize-form after cconv.
(`(internal-make-closure . ,_)
;; Look up free vars and mark them to be kept, so that they
@ -1419,7 +1412,9 @@ See Info node `(elisp) Integer Basics'."
fixnump floatp following-char framep
get-largest-window get-lru-window
hash-table-p
identity ignore integerp integer-or-marker-p interactive-p
;; `ignore' isn't here because we don't want calls to it elided;
;; see `byte-compile-ignore'.
identity integerp integer-or-marker-p interactive-p
invocation-directory invocation-name
keymapp keywordp
list listp

View file

@ -4207,6 +4207,7 @@ discarding."
(byte-defop-compiler-1 funcall)
(byte-defop-compiler-1 let)
(byte-defop-compiler-1 let* byte-compile-let)
(byte-defop-compiler-1 ignore)
(defun byte-compile-progn (form)
(byte-compile-body-do-effect (cdr form)))
@ -4222,6 +4223,11 @@ discarding."
(if ,discard 'byte-goto-if-nil 'byte-goto-if-nil-else-pop))
,tag))
(defun byte-compile-ignore (form)
(dolist (arg (cdr form))
(byte-compile-form arg t))
(byte-compile-form nil))
;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
;; Only return items that are not in ONLY-IF-NOT-PRESENT.
(defun byte-compile-find-bound-condition (condition-param