Skip to content

DmdAnal: Kill `is_thunk` case in `splitFV`

Sebastian Graf requested to merge wip/dmdanal-split-fvs into master

The splitFV function implements the highly dubious hack described in Note [Lazy und unleashable free variables] in GHC.Core.Opt.DmdAnal. It arranges it so that demand signatures only carry strictness info on free variables. Usage info is released through other means, see the Note. It's purely for analysis performance reasons.

It turns out that splitFV has a quite involved case for thunks that produces slightly different usage signatures and it's not clear why we need it: splitFV is only relevant in the LetDown case and the only time we call it on thunks is for top-level or local recursive thunks.

Since usage signatures of top-level thunks can only reference other top-level bindings and we completely discard demand info we have on top-level things (see the lack of setIdDemandInfo in dmdAnalTopBind), the is_thunk case is completely irrelevant here.

For local, recursive thunks, the added benefit of the is_thunk test is marginal: We get used-multiple-times in some cases where previously we had used-once if a recursive thunk has multiple call sites. It's very unlikely and not a case to optimise for.

So we kill the is_thunk case and inline splitFV at its call site, exposing isWeakDmd from GHC.Types.Demand instead.

The NoFib summary supports this decision:

            Min           0.0%     -0.0%
            Max           0.0%     +0.0%
 Geometric Mean          -0.0%     -0.0%
Edited by Sebastian Graf

Merge request reports