
On Sun, Nov 21, 2021 at 06:53:53AM -0500, Carter Schonwald wrote:
On Sat, Nov 20, 2021 at 4:17 PM Simon Peyton Jones via ghc-devs < ghc-devs@haskell.org> wrote:
There is absolutely no reason not to common-up those to join points. But we can't common up some join points when we could if they were let's. Consider
join j1 x = x+1 in case v of A -> f (join j2 x = x+1 in ...j2...) B -> ....j1... C -> ....j1...
Even though j2 is identical to j1's, we can't eliminate j2 in favour of j1 because then j1 wouldn't be a join point any more.
In this example: why would it stop being a join point ?
Admittedly, my intuition might be skewed by my own ideas about how join points are sortah a semantic special case of other constructs.
I think the point is that join points are tail calls that don't return to the caller. But here even though `j1` and `j2` have the same body j1's continuation is not the same as j2's continuation. Rather the result of `j2` is the input to `f`, but the result of j1 is a possible output of the whole `case` block in the B and C branches. For two join points to be duplicates they need to not only be alpha equivalent but to also have the same continuation. Something like join j1 x = x + 1 in join j2 y = y + 1 in ... j1 ... ... j2 ... where eliminating j2 in favour of j1 should be correct. -- VIktor.