<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">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">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><div><br></div><div>-- Johan</div><div><br></div></div>