Allow multiple constructor fields occupy the same word
The main goal is to reduce the overhead of things like:
data Bloated =
Bloated {-# UNPACK #-} !Word8
{-# UNPACK #-} !Int8
{-# UNPACK #-} !Bool
Assuming 64-bit architecture, currently those fields will take 8 bytes each! So for this example we'd need: 8 bytes for header + 3 * 8 bytes for fields = 32 bytes. But we should be able to pack the fields into a single word (a word is 8 bytes and each field really only needs 1 byte) for a total of 16 bytes (8 bytes header + 8 bytes for fields, with the 5 bytes being "overhead" due to heap alignment).
My understanding is that we need a few things to make this happen:
- Ability to refer to fields that are packed into a single word (currently everything in GHC assumes that each field occupies a single word). Simon Marlow started working on this in https://phabricator.haskell.org/D38
- Introduce primitives like
Word8#
,Int8#
, ... (currentlyWordX
andIntX
are defined as wrappers ofWord#
andInt#
respectively) and changeWordX
/IntX
definitions to use those primitives. -
~~Figure out what to do with
Bool
(should it be justWord8#
? should we haveBool#
?) and change its definition (using pattern synonyms forTrue
/False
)~~Bool
should be handled by #605 (see ticket:13825#comment:138006)
Some additional info:
- Thread on ghc-devs: https://mail.haskell.org/pipermail/ghc-devs/2017-June/014304.html