[GHC] #15113: Do not make CAFs from literal strings

GHC ghc-devs at haskell.org
Mon Jun 18 08:15:51 UTC 2018


#15113: Do not make CAFs from literal strings
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  patch
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:  CAFs
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D4717
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 I like the idea of trying this out.

 It might actually make programs allocate more (because we start using
 call-by-name), but it's usually very short-lived allocation.

 To judge the effect, you might want to add a way to show the total SRT
 table sizes (statically); and the number of SRT links traversed by the
 garbage collector (dynamically).  Reducing these two is the main point, so
 we should measure them.  For the latter, perhaps add to the `-ticky`
 stats?

 Variants to explore

 * Broaden scope: do this for non-top-level bindings as well as top-level
 ones.   (The Phab patch has bug on this point; it does it only for the
 non-top-level ones!)

 * Broaden scope: do this for any function marked CONLIKE.  Currently those
 functions (in `libraries/`) are
 {{{
 ./ghc-prim/GHC/CString.hs:74:{-# NOINLINE CONLIKE unpackCString# #-}
 ./ghc-prim/GHC/CString.hs:124:{-# NOINLINE CONLIKE unpackCStringUtf8# #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:74:#define CONLIKE
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:157:{-# INLINE
 CONLIKE size #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:161:{-# INLINE
 CONLIKE runF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:166:{-# INLINE
 CONLIKE emptyF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:171:{-# INLINE
 CONLIKE pairF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:185:{-# INLINE
 CONLIKE contramapF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:190:{-# INLINE
 CONLIKE toB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:195:{-# INLINE
 CONLIKE liftFixedToBounded #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:199:{-# INLINE
 CONLIKE storableToF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:204:{-# INLINE
 CONLIKE liftIOF #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:218:{-# INLINE
 CONLIKE sizeBound #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:225:{-# INLINE
 CONLIKE runB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:238:{-# INLINE
 CONLIKE contramapB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:243:{-# INLINE
 CONLIKE emptyB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:248:{-# INLINE
 CONLIKE pairB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:264:{-# INLINE
 CONLIKE eitherB #-}
 ./bytestring/Data/ByteString/Builder/Prim/Internal.hs:277:{-# INLINE
 CONLIKE condB #-}
 }}}
   I have no idea if this idea would be a good one for those functions in
 `bytestring`; maybe not.

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


More information about the ghc-tickets mailing list