[GHC] #11383: CAFs lose sharing due to implicit call stacks

GHC ghc-devs at haskell.org
Fri Jan 8 15:03:41 UTC 2016


#11383: CAFs lose sharing due to implicit call stacks
-------------------------------------+-------------------------------------
           Reporter:  simonmar       |             Owner:  gridaphobe
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.0.1
          Component:  Compiler       |           Version:  8.0.1-rc1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 The implicit call stack machinery adds a constraint to CAFs, which loses
 sharing in some cases.  The regression is fixed by -O (actually `-ffull-
 laziness`), but it is surprising nonetheless, and might cause problems for
 people using GHCi or other places where -O is turned off.

 For example:

 {{{
 {-# LANGUAGE NoMonomorphismRestriction #-}
 module Main where

 import System.Environment

 fib :: Integer -> Integer
 fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)

 x = if fib 3 > 20 then error "x" else fib 30

 main = do
   [n] <- getArgs
   case n of
     "a" -> print (x + x)
     "b" -> print x
 }}}

 Try it as follows (requires 8.0+):

 {{{
 $ ghc imp.hs -fforce-recomp -O -fno-full-laziness
 $ ./imp a +RTS -t
 2692538
 <<ghc: 430859568 bytes, 822 GCs, 36580/44384 avg/max bytes residency (2
 samples), 1M in use, 0.000 INIT (0.000 elapsed), 0.156 MUT (0.203
 elapsed), 0.018 GC (0.009 elapsed) :ghc>>
 $ ./imp b +RTS -t
 1346269
 <<ghc: 215456192 bytes, 411 GCs, 36580/44384 avg/max bytes residency (2
 samples), 1M in use, 0.000 INIT (0.000 elapsed), 0.073 MUT (0.119
 elapsed), 0.008 GC (0.004 elapsed) :ghc>>
 }}}

 With GHC 7.10 and earlier both commands perform the same.

 Note that this only uses `error`, and doesn't require `ImplicitParams`.
 It does require `NoMonomorphismRestriction`, however.

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


More information about the ghc-tickets mailing list