[GHC] #9992: Constructor specialization requires eta expansion

#9992: Constructor specialization requires eta expansion -------------------------------------+------------------------------------- Reporter: bgamari | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.4 Keywords: | Operating System: Unknown/Multiple performance | Type of failure: Runtime Architecture: | performance bug Unknown/Multiple | Blocked By: Test Case: | Related Tickets: Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- I recently encountered a slightly tricky performance issue[1] in `bytestring`'s `Builder` implementation which required explicit eta expansion in order for GHC to perform ConstrSpec. We have {{{#!hs data BufferRange = BufferRange {-# UNPACK #-} !(Ptr Word8) -- First byte of range {-# UNPACK #-} !(Ptr Word8) -- First byte /after/ range data BuildSignal a = ... -- Just a vanilla ADT type BuildStep a = BufferRange -> IO (BuildSignal a) }}} We end up with Core (full version https://gist.github.com/bgamari/091e3dac9c45ee9accf1#file-slow-hs-L1) that looks like this, {{{#!hs Main.$wa :: GHC.Prim.Word# -> GHC.Prim.Int# -> forall r_aKUt. Data.ByteString.Builder.Internal.BuildStep r_aKUt -> Data.ByteString.Builder.Internal.BuildStep r_aKUt Main.$wa = \ (ww_s10YU :: GHC.Prim.Word#) (ww1_s10YY :: GHC.Prim.Int#) (@ r_aKUt) (w_s10YR :: Data.ByteString.Builder.Internal.BuildStep r_aKUt) -> case ww1_s10YY of wild_XE { __DEFAULT -> ( \ (eta1_X1Q :: Data.ByteString.Builder.Internal.BufferRange) -> case eta1_X1Q of BufferRange a b -> -- A bunch of code eventually ending in a recursive call to $wa ) 0 -> w_s10YR } }}} If `w_s10YR` is eta-expanded GHC will run ConstrSpec, eliminating the fields of `BufferRange` to be unpacked between iterations of `$wa` and substantially improving performance. In [1] we had to manually eta-expand the empty case to ensure that this would happen. It would be great if GHC would identify cases like this. [1] https://github.com/haskell/bytestring/pull/40 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9992 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#9992: Constructor specialization requires eta expansion -------------------------------------+------------------------------------- Reporter: bgamari | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.4 Resolution: | Keywords: Operating System: Unknown/Multiple | performance Type of failure: Runtime | Architecture: performance bug | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Changes (by tibbe): * cc: tibbe (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9992#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#9992: Constructor specialization requires eta expansion -------------------------------------+------------------------------------- Reporter: bgamari | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.4 Resolution: | Keywords: Operating System: Unknown/Multiple | performance Type of failure: Runtime | Architecture: performance bug | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by simonpj): Ah, very interesting. I'll investigate -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9992#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#9992: Constructor specialization requires eta expansion
-------------------------------------+-------------------------------------
Reporter: bgamari | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.4
Resolution: | Keywords:
Operating System: Unknown/Multiple | performance
Type of failure: Runtime | Architecture:
performance bug | Unknown/Multiple
Blocked By: | Test Case:
Related Tickets: | Blocking:
| Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by Herbert Valerio Riedel
participants (1)
-
GHC