[MLton] an analysis to flatten refs into tuples
Stephen Weeks
MLton@mlton.org
Tue, 18 May 2004 09:36:54 -0700
> Do you mean doing something like:
>
> datatype t = A of int | B of int
>
> L0: ...
> case x of A => LA | B => LB
>
> LA(xa: ConApp A): ... a: int = ConSelect (xa, 0) ...
>
> LB(xb: ConApp B): ... b: int = ConSelect (xb, 0) ...
Yes.
> Type checking the above certainly seems pretty straightforward.
>
> But, what is the type of z in the following?
> z = ConApp (A, #[0])
> Would we require another coercion statement to lift z (as a ConApp A) to a
> Datatype t?
That is the question. We can either make the coercion implicit or
explicit. If we make it implicit, we need a little bit of subtyping
in the IL. If we make it explicit, passes have to be more careful to
distinguish between the two different kinds of values. In particular,
when I tried this once before, I ran into shrinker problems. I don't
think it was anything deep, just that the code wasn't geared to keep
track of the distinction between a ConApp value of type ConApp A and
that same value, but of type t.
I also played with the subtyping when I tried this (years ago), but
wasn't comfortable at that time with such a big change to the type
system. Now that I have added subtyping (of an even more complicated
form) to the Rssa IL, I am confident I can do the same to Ssa. So,
I'm leaning towards that route.
> BTW, whatever is done to the IL, then the knownCase pass will take a
> real beating.
Yeah, I think this change is big enough that it's worth introducing
two Ssa ILs that will exist simultaneously for a while, and pushing
the new IL one pass at a time from the backend to the closure
converter. I'll let you know when I reach the knownCase pass so you
can have at it :-).