No more destructive MERGE of shared data in best-modular-version
authorPaul Khuong <pvk@pvk.ca>
Tue, 9 Jul 2013 12:16:41 +0000 (08:16 -0400)
committerPaul Khuong <pvk@pvk.ca>
Thu, 18 Jul 2013 19:43:24 +0000 (15:43 -0400)
The old code worked by accident: few/no platform implements
untagged signed modular arithmetic VOPs.

The new code handles that common case to avoid consing a fresh list
when the MERGE will be an identity.

src/compiler/srctran.lisp

index 18f7301..2fc1c40 100644 (file)
   ;; 3. >/>= width-matched :untagged
   (let* ((uuwidths (modular-class-widths *untagged-unsigned-modular-class*))
          (uswidths (modular-class-widths *untagged-signed-modular-class*))
-         (uwidths (merge 'list uuwidths uswidths #'< :key #'car))
+         (uwidths (if (and uuwidths uswidths)
+                      (merge 'list (copy-list uuwidths) (copy-list uswidths)
+                             #'< :key #'car)
+                      (or uuwidths uswidths)))
          (twidths (modular-class-widths *tagged-modular-class*)))
     (let ((exact (find (cons width signedp) uwidths :test #'equal)))
       (when exact