summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/byte-opt.el
diff options
context:
space:
mode:
authorMattias EngdegÄrd <mattiase@acm.org>2023-08-07 18:14:42 +0200
committerMattias EngdegÄrd <mattiase@acm.org>2023-08-08 11:46:18 +0200
commit89bd65197642e4700b36c270d3abf8e4a2dffbf8 (patch)
tree4a9138af3d14fa6e8c9b08b63d81d9636e270b0b /lisp/emacs-lisp/byte-opt.el
parenteeda9eff1aa1ad973851d6589c5bcf6020a090e8 (diff)
downloademacs-89bd65197642e4700b36c270d3abf8e4a2dffbf8.tar.gz
emacs-89bd65197642e4700b36c270d3abf8e4a2dffbf8.tar.bz2
emacs-89bd65197642e4700b36c270d3abf8e4a2dffbf8.zip
Teach byte-compiler about Aristotelian identity
* lisp/emacs-lisp/byte-opt.el (byte-optimize-equal, byte-optimize-eq): Optimise (eq X X) -> t where X is a variable; idem for eql and equal. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases): Add test case.
Diffstat (limited to 'lisp/emacs-lisp/byte-opt.el')
-rw-r--r--lisp/emacs-lisp/byte-opt.el33
1 files changed, 18 insertions, 15 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 12c2bc51b92..456b3891bfe 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -1052,23 +1052,26 @@ See Info node `(elisp) Integer Basics'."
(and (integerp o) (<= -536870912 o 536870911)))
(defun byte-optimize-equal (form)
- ;; Replace `equal' or `eql' with `eq' if at least one arg is a
- ;; symbol or fixnum.
- (byte-optimize-binary-predicate
- (if (= (length (cdr form)) 2)
- (if (or (byte-optimize--constant-symbol-p (nth 1 form))
- (byte-optimize--constant-symbol-p (nth 2 form))
- (byte-optimize--fixnump (nth 1 form))
- (byte-optimize--fixnump (nth 2 form)))
- (cons 'eq (cdr form))
- form)
- ;; Arity errors reported elsewhere.
- form)))
+ (cond ((/= (length (cdr form)) 2) form) ; Arity errors reported elsewhere.
+ ;; Anything is identical to itself.
+ ((and (eq (nth 1 form) (nth 2 form)) (symbolp (nth 1 form))) t)
+ ;; Replace `equal' or `eql' with `eq' if at least one arg is a
+ ;; symbol or fixnum.
+ ((or (byte-optimize--constant-symbol-p (nth 1 form))
+ (byte-optimize--constant-symbol-p (nth 2 form))
+ (byte-optimize--fixnump (nth 1 form))
+ (byte-optimize--fixnump (nth 2 form)))
+ (byte-optimize-binary-predicate (cons 'eq (cdr form))))
+ (t (byte-optimize-binary-predicate form))))
(defun byte-optimize-eq (form)
- (pcase (cdr form)
- ((or `(,x nil) `(nil ,x)) `(not ,x))
- (_ (byte-optimize-binary-predicate form))))
+ (cond ((/= (length (cdr form)) 2) form) ; arity error
+ ;; Anything is identical to itself.
+ ((and (eq (nth 1 form) (nth 2 form)) (symbolp (nth 1 form))) t)
+ ;; Strength-reduce comparison with `nil'.
+ ((null (nth 1 form)) `(not ,(nth 2 form)))
+ ((null (nth 2 form)) `(not ,(nth 1 form)))
+ (t (byte-optimize-binary-predicate form))))
(defun byte-optimize-member (form)
(cond