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

@ -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