Skip to content

Lifting thunks out of thunks to reduce their size.

This is a spin off of this thread: ticket:10980#comment:131234

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 originalexample, 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.

Trac metadata
Trac field Value
Version 8.0.1
Type Task
TypeOfFailure OtherFailure
Priority low
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC rwbarton
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information