Converting unboxed sum types in StgCmm
Johan Tibell
johan.tibell at gmail.com
Wed Sep 9 22:22:14 UTC 2015
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/7a0a22bf/attachment.html>
More information about the ghc-devs
mailing list