Converting unboxed sum types in StgCmm

Johan Tibell johan.tibell at gmail.com
Thu Sep 10 05:16:27 UTC 2015


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#.

On Wed, Sep 9, 2015 at 3:22 PM, Johan Tibell <johan.tibell at gmail.com> wrote:

> 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://github.com/ghc/ghc/blob/master/compiler/simplStg/UnariseStg.hs>
> 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://github.com/ghc/ghc/blob/master/compiler/codeGen/StgCmm.hs> 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/20150909/2ea48435/attachment-0001.html>


More information about the ghc-devs mailing list