Wired-in data-constructors with UNPACKed fields

Simon Peyton Jones simonpj at microsoft.com
Tue Aug 19 16:13:24 UTC 2014


Yes, -O0 implies -fomit-interface-pragmas.

I still think that option 3 would a better avenue.

Simon

| -----Original Message-----
| From: Herbert Valerio Riedel [mailto:hvriedel at gmail.com]
| Sent: 19 August 2014 10:24
| To: Simon Peyton Jones
| Cc: ghc-devs at haskell.org
| Subject: Re: Wired-in data-constructors with UNPACKed fields
| 
| Hello Simon,
| 
| On 2014-08-19 at 00:01:17 +0200, Simon Peyton Jones wrote:
| 
| [...]
| 
| > But you can probably write the code in such a way as to be mostly
| > independent (eg explicit UNPACK rather than rely on
| > -funbox-strict-fields), or assume that some things won't happen (e.g.
| > souce module will not be compiled with -fomit-interface-pragmas).
| See
| > MkId.mkDataConRep.
| 
| I was under the impression that even -O0 vs -O1+ makes a huge
| difference:
| 
| As given the following program,
| 
|   {-# LANGUAGE MagicHash #-}
|   module M where
|   import GHC.Exts
|   data T0 = C0 ByteArray#
|   data T1 = C1 {-# UNPACK #-} !T0
|           | C2 {-# UNPACK #-} !Int
|           | C3 !Int
|           | C4 Int
| 
| compilation with
| 
|   $ ../inplace/bin/ghc-stage2  -fforce-recomp  -ddump-types -O1 -c M.hs
|   TYPE SIGNATURES
|   TYPE CONSTRUCTORS
|     data T0 = C0 ByteArray#
|     data T1
|       = C1 {-# UNPACK #-}T0
|       | C2 {-# UNPACK #-}Int
|       | C3 {-# UNPACK #-}Int
|       | C4 Int
|   COERCION AXIOMS
|   Dependent modules: []
|   Dependent packages: [base, ghc-prim, integer-gmp2]
| 
| has everything but C4 unpacked as expected, but when using -O0, nothing
| is UNPACKed at all:
| 
|   $ ../inplace/bin/ghc-stage2  -fforce-recomp  -ddump-types -O0 -c M.hs
|   TYPE SIGNATURES
|   TYPE CONSTRUCTORS
|     data T0 = C0 ByteArray#
|     data T1 = C1 !T0 | C2 !Int | C3 !Int | C4 Int
|   COERCION AXIOMS
|   Dependent modules: []
|   Dependent packages: [base, ghc-prim, integer-gmp2]
| 
| ...am I interpreting the output `-ddump-types` incorrectly?
| 
| 
| PS: adding a '!' in front of the 'ByteArray#' field in `T0` is not
|     supposed to have any effect on primitive types, is it? If so,
| should
|     GHC warn about the redundant '!'?
| 
| Cheers,
|   hvr


More information about the ghc-devs mailing list