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 |