some locals are not cleared in go blocks

Description

Running this code eventually throws OOME :

This one (with let instead of when-some) works fine :

In the former, the range seq is stored on the heap (in go block's state array) and retained for the whole doseq iteration, althought it's not needed anymore after loop initialization.
In the latter, the range seq is stored on the stack so the compiler is able to perform its local clearing magic.

This behavior is likely to happen for every value spanning across multiple ssa blocks.

Environment

None

Activity

Show:
leonoel
August 30, 2018, 3:39 PM

I updated the description with a less contrived example.
The problem happens because a let binding wraps a control flow expression. This effectively moves the value from the stack to the heap, preventing the compiler to clear the reference.

Alex Miller
August 30, 2018, 2:17 PM

Isn't the problem actually that when-some is really a let and you're holding the head of the infinite range in the let?

Your pinned fields
Click on the next to a field label to start pinning.

Assignee

Unassigned

Reporter

leonoel