<div dir="ltr">I wonder if rewriting any aliased pointer field as Any in Stg and any non-pointer field as Word# would work. I suspect that not all non-pointer fields (e.g. Double# on 32-bit) can be represented as Word#.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 9, 2015 at 3:22 PM, Johan Tibell <span dir="ltr"><<a href="mailto:johan.tibell@gmail.com" target="_blank">johan.tibell@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">Hi!<div><br></div><div>The original idea for implementing the backend part of the unboxed sums proposal was to convert from the core representation to the actual data representation (i.e. a tag followed by some pointer and non-pointer fields) in the <a href="https://github.com/ghc/ghc/blob/master/compiler/simplStg/UnariseStg.hs" target="_blank">unarise stg-to-stg</a> pass.</div><div><br></div><div>I have now realized that this won't work. The problem is that stg is too strongly typed. When we "desugar" sum types we need to convert functions receiving a value e.g. from</div><div><br></div><div>    f :: (# Bool | Char #) -> ...</div><div><br></div><div>to</div><div><br></div><div>    f :: NonPointer {-# tag#-} -> Pointer {-# Bool or Char #-} -> ...</div><div><br></div><div>Since stg is still typed with normal Haskell types (e.g. Bool, Char, etc), this is not possible, as we cannot represent an argument which has two different types.</div><div><br></div><div>It seems to me that we will have to do the conversion in the <a href="https://github.com/ghc/ghc/blob/master/compiler/codeGen/StgCmm.hs" target="_blank">stg-to-cmm</a> pass, which is quite a bit more involved. For example, StgCmmEnv.idToReg function will have to change from</div><div><br></div><div>    idToReg :: DynFlags -> NonVoid Id -> LocalReg</div><div><br></div><div>to</div><div><br></div><div>    idToReg :: DynFlags -> NonVoid Id -> [LocalReg]</div><div><br></div><div>to accommodate the fact that we might need more than one register to store a binder.</div><div><br></div><div>Any ideas for a better solution?</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>-- Johan</div><div><br></div></font></span></div>
</blockquote></div><br></div>