<div dir="ltr">I've given this a yet some more thought. Given this simple core program:<div><br></div><div><div><font face="monospace, monospace">f [InlPrag=NOINLINE] :: (#|#) Int Char -> Int</font></div><div><font face="monospace, monospace">[GblId, Arity=1, Str=DmdType]</font></div><div><font face="monospace, monospace">f =</font></div><div><font face="monospace, monospace">  \ (ds_dmE :: (#|#) Int Char) -></font></div><div><font face="monospace, monospace">    case ds_dmE of _ [Occ=Dead] {</font></div><div><font face="monospace, monospace">      (#_|#) x_amy -> x_amy;</font></div><div><font face="monospace, monospace">      (#|_#) ipv_smK -> patError @ Int "UnboxedSum.hs:5:1-15|function f"#</font></div><div><font face="monospace, monospace">    }</font></div><div><br></div><div>We will get this stg pre-unarise:</div><div><br></div><div><font face="monospace, monospace">unarise</font></div><div><font face="monospace, monospace">  [f [InlPrag=NOINLINE] :: (#|#) Int Char -> Int</font></div><div><font face="monospace, monospace">   [GblId, Arity=1, Str=DmdType, Unf=OtherCon []] =</font></div><div><font face="monospace, monospace">       \r srt:SRT:[0e :-> patError] [ds_svm]</font></div><div><font face="monospace, monospace">           case ds_svm of _ [Occ=Dead] {</font></div><div><font face="monospace, monospace">             (#_|#) x_svo [Occ=Once] -> x_svo;</font></div><div><font face="monospace, monospace">             (#|_#) _ [Occ=Dead] -> patError "UnboxedSum.hs:5:1-15|function f"#;</font></div><div><font face="monospace, monospace">           };]</font></div><div><br></div><div>What do we want it to look like afterwards? I currently, have this, modeled after unboxed tuples:</div><div><br></div><div><font face="monospace, monospace">post-unarise:</font></div><div><font face="monospace, monospace">  [f [InlPrag=NOINLINE] :: (#|#) Int Char -> Int</font></div><div><font face="monospace, monospace">   [GblId, Arity=1, Str=DmdType, Unf=OtherCon []] =</font></div><div><font face="monospace, monospace">       \r srt:SRT:[0e :-> patError] [ds_gvu ds_gvv]</font></div><div><font face="monospace, monospace">           case (#_|#) [ds_gvu ds_gvv] of _ [Occ=Dead] {  -- <-- WHAT SHOULD GO HERE?</font></div><div><font face="monospace, monospace">             (#_|#) x_svo [Occ=Once] -> x_svo;</font></div><div><font face="monospace, monospace">             (#|_#) _ [Occ=Dead] -> patError "UnboxedSum.hs:5:1-15|function f"#;</font></div><div><font face="monospace, monospace">           };]</font></div></div><div><br></div><div>Here I have performed the same rewriting of the scrutinee in the case statement as for unboxed tuples, but note that this doesn't quite work, as we don't know which data constructor to apply in "..." in case ... of. In the case of tuples it's easy; there is only one.</div><div><br></div><div>It seems to me that we just want to rewrite the case altogether into something that looks at the tag field of the data constructor. Also, in stg we use the same DataCon as in core, but after stg the unboxed sum case really only has one constructor (one with the union of all the fields), which makes it awkward to reuse the original DataCon.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 14, 2015 at 7:27 AM, Ryan Newton <span dir="ltr"><<a href="mailto:rrnewton@gmail.com" target="_blank">rrnewton@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><ul><li><br>data RepType = UbxTupleRep [UnaryType]<br>    | UbxSumRep [UnaryType]<br>    | UnaryRep UnaryType<br></li></ul></div></div></blockquote></span><div>Not, fully following, but ... this reptype business is orthogonal to whether you add a normal type to the STG level that models anonymous, untagged unions, right?  </div><div><br></div><div>That is, when using Any for pointer types, they could use indicative phantom types, like "Any (Union Bool Char)", even if there's not full support for doing anything useful with (Union Bool Char) by itself.  Maybe the casting machinery could greenlight a cast from Any (Union Bool Char) to Bool at least?</div><div><br></div><div>There's already the unboxed union itself, (|# #|) , but that's different than a pointer to a union of types...</div><div><br></div><div><br></div></div></div>
</blockquote></div><br></div>