]> git.eshelyaron.com Git - emacs.git/commitdiff
Strength-reduce (eq X nil) to (not X)
authorMattias Engdegård <mattiase@acm.org>
Tue, 20 Jul 2021 13:46:32 +0000 (15:46 +0200)
committerMattias Engdegård <mattiase@acm.org>
Tue, 20 Jul 2021 17:21:00 +0000 (19:21 +0200)
* lisp/emacs-lisp/byte-opt.el (byte-optimize-eq): New optimisation,
which results in better test and branch code generation where it
applies.

lisp/emacs-lisp/byte-opt.el

index 2fff0bd4a5f517cb48056518299dfe2b49e395a3..7ed04b32e97df5998de68709ee555082df33098b 100644 (file)
@@ -969,6 +969,12 @@ See Info node `(elisp) Integer Basics'."
      ;; Arity errors reported elsewhere.
      form)))
 
+(defun byte-optimize-eq (form)
+  (byte-optimize-binary-predicate
+   (pcase (cdr form)
+     ((or `(,x nil) `(nil ,x)) `(not ,x))
+     (_ form))))
+
 (defun byte-optimize-member (form)
   ;; Replace `member' or `memql' with `memq' if the first arg is a symbol,
   ;; or the second arg is a list of symbols.  Same with fixnums.
@@ -1056,7 +1062,7 @@ See Info node `(elisp) Integer Basics'."
 (put 'min 'byte-optimizer #'byte-optimize-min-max)
 
 (put '=   'byte-optimizer #'byte-optimize-binary-predicate)
-(put 'eq  'byte-optimizer #'byte-optimize-binary-predicate)
+(put 'eq  'byte-optimizer #'byte-optimize-eq)
 (put 'eql   'byte-optimizer #'byte-optimize-equal)
 (put 'equal 'byte-optimizer #'byte-optimize-equal)
 (put 'string= 'byte-optimizer #'byte-optimize-binary-predicate)