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:
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?

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.

Assignee

Unassigned

Reporter

leonoel

Labels

None

Approval

None

Patch

None

Priority

Major