Converting unboxed sum types in StgCmm

Johan Tibell johan.tibell at gmail.com
Thu Sep 10 15:16:33 UTC 2015


I'll give that a try. The main use of the stg types in the stg-to-cmm pass
is to call idPrimRep (which call typePrimRep) to figure out which register
type we need to use. I guess as long as I rewrite the stg types so they
give me the typePrimRep I want in the end I should be fine.

On Thu, Sep 10, 2015 at 2:37 AM, Simon Peyton Jones <simonpj at microsoft.com>
wrote:

> The problem is that stg is too strongly typed
>
>
>
> It’s not really typed, or at least only in a very half-hearted way.  To be
> concrete I think you can just use Any for any Pointer arg.   All STG needs
> to know, really, is which things are pointers.  Detailed type info like
> “are you a Char or a Bool” is strictly jam; indeed never used I think.  (I
> could be wrong but I’m pretty sure I’m not wrong in a fundamental way.
>
>
>
> SImon
>
>
>
> *From:* Johan Tibell [mailto:johan.tibell at gmail.com]
> *Sent:* 09 September 2015 23:22
> *To:* Simon Peyton Jones; Simon Marlow; ghc-devs at haskell.org
> *Subject:* Converting unboxed sum types in StgCmm
>
>
>
> Hi!
>
>
>
> 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 unarise stg-to-stg
> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgithub.com%2fghc%2fghc%2fblob%2fmaster%2fcompiler%2fsimplStg%2fUnariseStg.hs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cca7beffb01494517d75108d2b9652973%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=U%2bFUNsL87iEemajTnAW9SxD9N5b4%2bG8QB1q19%2fX%2bBI4%3d>
> pass.
>
>
>
> 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
>
>
>
>     f :: (# Bool | Char #) -> ...
>
>
>
> to
>
>
>
>     f :: NonPointer {-# tag#-} -> Pointer {-# Bool or Char #-} -> ...
>
>
>
> 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.
>
>
>
> It seems to me that we will have to do the conversion in the stg-to-cmm
> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgithub.com%2fghc%2fghc%2fblob%2fmaster%2fcompiler%2fcodeGen%2fStgCmm.hs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cca7beffb01494517d75108d2b9652973%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=aXKZ78eGNKbJ6eZkxZgyJHgsAXpgOBjg3Zvqj%2bq7pk0%3d>
> pass, which is quite a bit more involved. For example, StgCmmEnv.idToReg
> function will have to change from
>
>
>
>     idToReg :: DynFlags -> NonVoid Id -> LocalReg
>
>
>
> to
>
>
>
>     idToReg :: DynFlags -> NonVoid Id -> [LocalReg]
>
>
>
> to accommodate the fact that we might need more than one register to store
> a binder.
>
>
>
> Any ideas for a better solution?
>
>
>
> -- Johan
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20150910/17f97e72/attachment-0001.html>


More information about the ghc-devs mailing list