master: Don't dx the list in (dx-let ((a (list a b))) (reverse a))

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  d1b2b076bc95d36d046bd8cadcecc7506e4204bc (commit)
      from  913710ac98e1e1ad738d1dabd02015296a629c7d (commit)

- Log -----------------------------------------------------------------
commit d1b2b076bc95d36d046bd8cadcecc7506e4204bc
Author: Stas Boukarev <[email protected]>
Date:   Sun Aug 30 01:58:54 2026 +0300

    Don't dx the list in (dx-let ((a (list a b))) (reverse a))
---
 src/compiler/ir1util.lisp      | 14 ++++++++++----
 src/compiler/seqtran.lisp      |  4 ++++
 tests/dynamic-extent.pure.lisp |  9 +++++++++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp
index f9e2b381c..33649646f 100644
--- a/src/compiler/ir1util.lisp
+++ b/src/compiler/ir1util.lisp
@@ -1060,12 +1060,18 @@
 
   (values))
 
+(defun remove-lvar-dx (lvar)
+  (when lvar
+    (let ((dynamic-extent (lvar-dynamic-extent lvar)))
+      (when dynamic-extent
+        (setf (lvar-dynamic-extent lvar) nil)
+        (setf (dynamic-extent-values dynamic-extent)
+              (delq1 lvar (dynamic-extent-values dynamic-extent)))
+        dynamic-extent))))
+
 (defun propagate-lvar-dx (new old)
-  (let ((dynamic-extent (lvar-dynamic-extent old)))
+  (let ((dynamic-extent (remove-lvar-dx old)))
     (when dynamic-extent
-      (setf (lvar-dynamic-extent old) nil)
-      (setf (dynamic-extent-values dynamic-extent)
-            (delq1 old (dynamic-extent-values dynamic-extent)))
       (unless (lvar-dynamic-extent new)
         (setf (lvar-dynamic-extent new) dynamic-extent)
         (push new (dynamic-extent-values dynamic-extent))))))
diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp
index 4643dd2d7..77de1550e 100644
--- a/src/compiler/seqtran.lisp
+++ b/src/compiler/seqtran.lisp
@@ -4209,15 +4209,18 @@
   (or (combination-case sequence
         (list *
          (setf (combination-args combination) (reverse args))
+         (remove-lvar-dx sequence)
          'sequence)
         (list* *
          (let ((last (last args)))
            (cond ((lvar-subtypep (car last) null)
                   (setf (combination-args combination)
                         (append (cdr (reverse args)) last))
+                  (remove-lvar-dx sequence)
                   'sequence)
                  (t
                   (splice-fun-args sequence 'list* nil)
+                  (remove-lvar-dx sequence)
                   (let ((vars (make-gensym-list (length args))))
                     `(lambda ,vars
                        (,(case (combination-name node)
@@ -4227,6 +4230,7 @@
                         (list ,@(reverse (butlast vars))))))))))
         (initialize-vector *
          (setf (combination-args combination) (reverse args))
+         (remove-lvar-dx sequence)
          'sequence))
       (give-up-ir1-transform)))
 
diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp
index e1178fb98..a0e07d389 100644
--- a/tests/dynamic-extent.pure.lisp
+++ b/tests/dynamic-extent.pure.lisp
@@ -2636,3 +2636,12 @@
                                          (declare (notinline f))
                                          (f (lambda () x)))))
                    1)))
+
+(with-test (:name :reverse-remove-dx)
+  (declare (optimize (debug 1)))
+  (checked-compile-and-assert
+   ()
+   `(lambda (a b)
+      (sb-int:dx-let ((a (list a b)))
+        (stack-allocated-p (reverse a))))
+   ((1 2) nil)))

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


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.