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