surprising behavior of dynamic-extent in do forms

Bug #1766003 reported by Cyrus Harmon
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
SBCL
Invalid
Undecided
Unassigned

Bug Description

I'm seeing some surprising (to me at least) behavior caused by dynamic-extent declarations in do forms. Phoe on #sbcl reduced the issue to, roughly, the following test case:

(defun foo (startr endr)
  (let ((acc 0))
    (do ((i startr (1+ i))) ((> i endr))
      (declare (dynamic-extent i))
      (incf acc i))
    acc))

[note that this works without the acc stuff, I just used this to convince myself that this wasn't all just optimized away]

When I compile this form I get:
cd /home/sly/projects/clem/src/
1 compiler notes:

temp.lisp:37:5:
  note:
    could not stack allocate STARTR in: (DO ((I STARTR (1+ I))) ((> I ENDR)) (DECLARE (DYNAMIC-EXTENT I)) (INCF ACC I))
    --> BLOCK LET
    ==>
      STARTR

Why should the dynamic-extent declaration of i affect whether or not startr is stack allocated?

A trivial rewrite of this using loop does not trigger the same compiler note.

Revision history for this message
Stas Boukarev (stassats) wrote :

Because it's the initial value of I.

Revision history for this message
Cyrus Harmon (ch-launchpad) wrote :

Why is the behavior of do so different from:

(defun foo2 (startr endr)
  (declare (dynamic-extent startr))
  (let ((acc 0))
    (loop for i fixnum from startr to endr
       do (incf acc i))
    acc))

where, again, the initial value of i is startr, but I see no warning? I'm imagine I'm missing something obvious here.

Revision history for this message
Stas Boukarev (stassats) wrote :

There's no warning in your first form either.

And no notes for external entry point variables is a new thing, since in some cases it can be dxed at the call time now.

Revision history for this message
Cyrus Harmon (ch-launchpad) wrote :

Ok, I misspoke. note, not warning. I still don't see why the do form issues a note but the loop form doesn't.

Revision history for this message
Stas Boukarev (stassats) wrote :

The loop form doesn't even have any dynamic-extent declarations, so I'm not sure how you're comparing them.

Revision history for this message
Charles (karlosz) wrote :

We don't emit these kinds of notes anymore, because they are unactionable. It's better to use SB-EXT:STACK-ALLOCATED-P to check if stuff is stack consed.

Changed in sbcl:
status: New → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.