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 <[email protected]> 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 > >
_______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
