Subject: bug#35868: closed (Re: [PATCH] `memql' does not work for bignums)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 30 May 2019 22:02:03 +0000

Your bug report

#35868: [PATCH] `memql' does not work for bignums

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
35868: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=35868
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: [PATCH] `memql' does not work for bignums
From: Paul Eggert <[email-masked]>
To: Mattias Engdegård <[email-masked]>
Cc: [email-masked]
Date: Thu, 30 May 2019 15:01:19 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

Thanks for the bug report and fix. I installed it into master, followed 
by the attached performance tweaks.

>From 24a58620cb8ce4aa11e2428d86e58911e7975aeb Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Thu, 30 May 2019 14:57:21 -0700
Subject: [PATCH] Improve eq1/memql performance

* src/fns.c (Fmemql, Feql): Inline to tweak performance.
---
 src/fns.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/fns.c b/src/fns.c
index da830a9000..cb47b818f1 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1521,7 +1521,7 @@ DEFUN ("elt", Felt, Selt, 2, 2, 0,
   EMACS_UINT word[WORDS_PER_DOUBLE];
 };
 
-/* Return true if X and Y are the same floating-point value.
+/* Return true if the floats X and Y have the same value.
    This looks at X's and Y's representation, since (unlike '==')
    it returns true if X and Y are the same NaN.  */
 static bool
@@ -1567,32 +1567,32 @@ DEFUN ("memql", Fmemql, Smemql, 2, 2, 0,
 The value is actually the tail of LIST whose car is ELT.  */)
   (Lisp_Object elt, Lisp_Object list)
 {
+  Lisp_Object tail = list;
+
   if (FLOATP (elt))
     {
-      Lisp_Object tail = list;
       FOR_EACH_TAIL (tail)
         {
           Lisp_Object tem = XCAR (tail);
           if (FLOATP (tem) && same_float (elt, tem))
             return tail;
         }
-      CHECK_LIST_END (tail, list);
-      return Qnil;
     }
   else if (BIGNUMP (elt))
     {
-      Lisp_Object tail = list;
       FOR_EACH_TAIL (tail)
         {
           Lisp_Object tem = XCAR (tail);
-          if (equal_no_quit (elt, tem))
+          if (BIGNUMP (tem)
+	      && mpz_cmp (XBIGNUM (elt)->value, XBIGNUM (tem)->value) == 0)
             return tail;
         }
-      CHECK_LIST_END (tail, list);
-      return Qnil;
     }
   else
     return Fmemq (elt, list);
+
+  CHECK_LIST_END (tail, list);
+  return Qnil;
 }
 
 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
@@ -2301,7 +2301,9 @@ DEFUN ("eql", Feql, Seql, 2, 2, 0,
   if (FLOATP (obj1))
     return FLOATP (obj2) && same_float (obj1, obj2) ? Qt : Qnil;
   else if (BIGNUMP (obj1))
-    return equal_no_quit (obj1, obj2) ? Qt : Qnil;
+    return ((BIGNUMP (obj2)
+	     && mpz_cmp (XBIGNUM (obj1)->value, XBIGNUM (obj2)->value) == 0)
+	    ? Qt : Qnil);
   else
     return EQ (obj1, obj2) ? Qt : Qnil;
 }
-- 
2.21.0

Subject: [PATCH] `memql' does not work for bignums
From: Mattias Engdegård <[email-masked]>
To: [email-masked]
Date: Thu, 23 May 2019 17:07:11 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

(memql (ash 1 100) (list (ash 1 100))) => nil

Proposed patch attached.