master: Fix ldb transforms

stassats via Sbcl-commits <[email protected]>
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  06151ad1c15b0097deaa12176e999f278f6747ab (commit)
      from  0a1f43ff5d5fbc95ad8aa41ac02b4d157b9e3413 (commit)

- Log -----------------------------------------------------------------
commit 06151ad1c15b0097deaa12176e999f278f6747ab
Author: Stas Boukarev <[email protected]>
Date:   Mon Aug 17 18:23:13 2026 +0300

    Fix ldb transforms
    
    erase-node-type has to be called with value-types.
    
    Reported by Eric Marsden.
---
 src/compiler/ir1util.lisp | 25 ++++++++++++++-----------
 src/compiler/srctran.lisp |  4 ++--
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp
index daab5d181..dad020266 100644
--- a/src/compiler/ir1util.lisp
+++ b/src/compiler/ir1util.lisp
@@ -652,17 +652,20 @@
 
 (defun erase-node-type (node type &optional nth-value erase-calls)
   (setf (node-derived-type node)
-        (if (eq type t)
-            (let ((derived (node-derived-type node)))
-              (make-values-type
-               (loop for i from 0
-                     for r in (values-type-required derived)
-                     collect (if (= i nth-value)
-                                 *universal-type*
-                                 r))
-               (values-type-optional derived)
-               (values-type-rest derived)))
-            type))
+        (cond ((eq type t)
+               (let ((derived (node-derived-type node)))
+                 (make-values-type
+                  (loop for i from 0
+                        for r in (values-type-required derived)
+                        collect (if (= i nth-value)
+                                    *universal-type*
+                                    r))
+                  (values-type-optional derived)
+                  (values-type-rest derived))))
+              (t
+               (aver (or (eq type *wild-type*)
+                         (values-type-p type)))
+               type)))
   (erase-lvar-type (node-lvar node) nth-value erase-calls))
 
 ;;; The uses need to have the correct type before calling this.
diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp
index 9c9416ae6..6c87e24d9 100644
--- a/src/compiler/srctran.lisp
+++ b/src/compiler/srctran.lisp
@@ -3621,7 +3621,7 @@
     (cond ((and (<= mask most-positive-word)
                 (or (combination-matches '= '(* 0) (node-dest node))
                     (combination-matches '> '(* 0) (node-dest node))))
-           (erase-node-type node (specifier-type 'word))
+           (erase-node-type node (values-specifier-type '(values word &optional)))
            `(logand integer ,mask))
           (t
            (give-up-ir1-transform)))))
@@ -3630,7 +3630,7 @@
 (deftransform %mask-field ((size posn int) * * :node node)
   (cond ((or (combination-matches '= '(* 0) (node-dest node))
              (combination-matches '> '(* 0) (node-dest node)))
-         (erase-node-type node (specifier-type 'unsigned-byte))
+         (erase-node-type node (values-specifier-type '(values unsigned-byte &optional)))
          `(%ldb size posn int))
         (t
          (give-up-ir1-transform))))

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.