
#15503: interpreter: sequence_ (replicate 100000000 (return ())) gobbles up memory -------------------------------------+------------------------------------- Reporter: int-e | Owner: osa1 Type: bug | Status: new Priority: high | Milestone: 8.8.1 Component: GHCi | Version: 8.5 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Hmm. Thanks for showing the full code that GHCi compiles to bytecode. It looks like this: {{{ let main_action = ... in bindIO main_action (\it -> return [it]) }}} So GHCi will build a thunk for `main_action` and will pass it to the compiled code for `GHC.Base.bindIO`. But alas `main_action` is essentially this {{{ main_action :: IO () main_action = sequence_ (replicate ...) }}} (I have omitted the `ghcStepIO` stuff; it is essentially the identity function, and I don't think it affects things.) Now that `main_action` thunk will be updated, so if it remains live for any reason, we'll retain a huge PAP of the form described in an earlier comment `return () >> (return () ...))`. Why is it being kept alive? I'm really not sure. The interpreter should be ''tail-calling'' `bindIO`... I wonder if `main_action` could be floated to top level as a CAF before it gets to the bytecode generator? Anyway, I hope that may help a bit. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15503#comment:12 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler