[GHC] #13213: Lifting thunks out of thunks to reduce their size.

GHC ghc-devs at haskell.org
Tue Jan 31 16:45:37 UTC 2017


#13213: Lifting thunks out of thunks to reduce their size.
-------------------------------------+-------------------------------------
           Reporter:  nomeata        |             Owner:
               Type:  task           |            Status:  new
           Priority:  low            |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           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:
-------------------------------------+-------------------------------------
 This is a spin off of this thread:
 ticket:10980#comment:12

 The idea is to add a transformation to STG (or Core) that replaces


 {{{
 let t1 = let t2 = e1
          in e2
 in e3
 }}}

 with


 {{{
 let t2 = e1
     t1 = e2
 in e3
 }}}


 Can we give an easy criterion when this transformation is beneficial?

 The problem is that this will increase allocation in the case when `t1` is
 not called, as it is more space efficient to pack the union of the free
 variables of `e1` and `e2` into one closure, instead of having one for the
 free variables of `e1` and one for those of `e2`.

 We could say “Do this transformation if the free variables of `e2` and
 `e1`” are disjoint. Then we’d allocate two extra words (one for the info
 table of `t2`, and one pointer to that in the closure for `t1`), but have
 some nice gains if `t1` is indeed called.

 But this rule would not fire in the [ticket:10980#comment:12 original
 example], because the `Num a` dictionary is also a free variable, which
 would now have to be copied into both closures!

 I guess one could try and see whether real-world programs benefit from
 this transformation, and how many shared free variables between `e1` and
 `e2` are heuristically ok.

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


More information about the ghc-tickets mailing list