
#9476: Implement late lambda-lifting -------------------------------------+------------------------------------- Reporter: simonpj | Owner: sgraf Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.2 Resolution: | Keywords: LateLamLift Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: #8763 #13286 | Differential Rev(s): Wiki Page: LateLamLift | -------------------------------------+------------------------------------- Comment (by sgraf): You can find the latest version of the paper at https://github.com/sgraf812/late-lam-lift/blob/master/paper.pdf. It's still pretty rough and littered with TODOs, but you can take a glance at the two chapters I got so far. What's missing is an evaluation + the usual prologue and epilogue. While writing the paper, I realised a few things here and there that I could change in the transformation. For example, currently we can't lift functions that occur in argument position, i.e. {{{ let f x = ... x ... a ... b ... in let g y z = ... in g f 1 }}} Lifting `f` would mean having to allocate a PAP at the call site of `g` for `f a b`. One of our heuristics forbids the lift here, because it's nonsense: We immediately re-introduce the allocation we spared at each call site of the lifted function. The only situation I can think of in which this could be beneficial is when this pushes allocation from a hot code path into multiple cold call sites. Making the transformation correct here is somewhat of a nuisance, but probably needed in order to back my claims in section 3 (C1, in particular) with benchmark figures. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9476#comment:40 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler