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.
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to