Note [Join points are less general than the paper]
In the paper "Compiling without continuations", this expression is
perfectly valid:
join { j = \_ -> e }
in (case blah of )
( True -> j void# ) arg
( False -> blah )
assuming 'j' has arity 1. Here the call to 'j' does not look like a
tail call, but actually everything is fine. See Section 3, "Managing \Delta"
in the paper.
In GHC, however, we adopt a slightly more restrictive subset, in which
join point calls must be tail calls. I think we /could/ loosen it up, but
in fact the simplifier ensures that we always get tail calls, and it makes
the back end a bit easier I think. Generally, just less to think about;
nothing deeper than that. References 0
This Note does not link to any other.
Referenced by 4
- GHC.Core.Lint call site ×2
- Invariants on join points GHC.Core
- simple_app and join points GHC.Core.SimpleOpt