laziness, memoization and inlining
sedillard at ucdavis.edu
Wed May 14 11:31:08 EDT 2008
You're right. -fno-state-hack fixed it. I've opened a trac ticket.
Program and test data are there.
On Wed, May 14, 2008 at 1:48 AM, Simon Peyton-Jones
<simonpj at microsoft.com> wrote:
> | I'm experiencing some undesirable performance behavior, I suspect from
> | inlining things that shouldn't be, defeating my memoization attempts.
> This is bad, very bad. I think Don is right. I believe the following is happening. In your main program you have
> do let mesh = memoMesh rawMesh
> display :: IO ()
> display = draw mesh >> stuff
> setDisplayCallback display
> So the effect is that 'display' is performed many times, by glutMainLoop.
> Now 'display' is seen by GHC thus:
> display = \s -> draw mesh s >> stuff
> The "\s" says "given the state of the world, s, I'll draw the mesh on it". The "state hack" makes GHC think that a "\s" will only ever be called once (which is utterly false in this case), so it can inline mesh=memoMesh rawMesh. Result disaster.
> I bet you'll be fine if you compile your main module with -fno-state-hack.
> But I should fix this, somehow. It's coming up too often to justify the hack. Can you make a Trac bug report, and include your message and this one?
> Thanks for reporting it.
More information about the Glasgow-haskell-users