[GHC] #13825: Allow multiple constructor fields occupy the same word

GHC ghc-devs at haskell.org
Mon Oct 30 01:51:18 UTC 2017


#13825: Allow multiple constructor fields occupy the same word
-------------------------------------+-------------------------------------
        Reporter:  michalt           |                Owner:  michalt
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #605              |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Ben Gamari <ben@…>):

 In [changeset:"cca2d6b78f97bfb79bef4dc3f75d6c4d15b94680/ghc"
 cca2d6b7/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="cca2d6b78f97bfb79bef4dc3f75d6c4d15b94680"
 Allow packing constructor fields

 This is another step for fixing #13825 and is based on D38 by Simon
 Marlow.

 The change allows storing multiple constructor fields within the same
 word. This currently applies only to `Float`s, e.g.,
 ```
 data Foo = Foo {-# UNPACK #-} !Float {-# UNPACK #-} !Float
 ```
 on 64-bit arch, will now store both fields within the same constructor
 word. For `WordX/IntX` we'll need to introduce new primop types.

 Main changes:

 - We now use sizes in bytes when we compute the offsets for
   constructor fields in `StgCmmLayout` and introduce padding if
   necessary (word-sized fields are still word-aligned)

 - `ByteCodeGen` had to be updated to correctly construct the data
   types. This required some new bytecode instructions to allow pushing
   things that are not full words onto the stack (and updating
   `Interpreter.c`). Note that we only use the packed stuff when
   constructing data types (i.e., for `PACK`), in all other cases the
   behavior should not change.

 - `RtClosureInspect` was changed to handle the new layout when
   extracting subterms. This seems to be used by things like `:print`.
   I've also added a test for this.

 - I deviated slightly from Simon's approach and use `PrimRep` instead
   of `ArgRep` for computing the size of fields.  This seemed more
   natural and in the future we'll probably want to introduce new
   primitive types (e.g., `Int8#`) and `PrimRep` seems like a better
   place to do that (where we already have `Int64Rep` for example).
   `ArgRep` on the other hand seems to be more focused on calling
   functions.

 Signed-off-by: Michal Terepeta <michal.terepeta at gmail.com>

 Test Plan: ./validate

 Reviewers: bgamari, simonmar, austin, hvr, goldfire, erikd

 Reviewed By: bgamari

 Subscribers: maoe, rwbarton, thomie

 GHC Trac Issues: #13825

 Differential Revision: https://phabricator.haskell.org/D3809
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13825#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list