Note [Arity trimming for CPR signatures]
Although it doesn't affect correctness of the analysis per se, we have to trim
CPR signatures to idArity. Here's what might happen if we don't:
f x = if expensive
then \y. Box y
else \z. Box z
g a b = f a b
The two lambdas will have a CPR type of @1m@ (so construct a product after
applied to one argument). Thus, @f@ will have a CPR signature of @2m@
(constructs a product after applied to two arguments).
But WW will never eta-expand @f@! In this case that would amount to possibly
duplicating @expensive@ work.
(Side note: Even if @f@'s 'idArity' happened to be 2, it would not do so, see
Note [Don't eta expand in w/w].)
So @f@ will not be worker/wrappered. But @g@ also inherited its CPR signature
from @f@'s, so it *will* be WW'd:
f x = if expensive
then \y. Box y
else \z. Box z
$wg a b = case f a b of Box x -> x
g a b = Box ($wg a b)
And the case in @g@ can never cancel away, thus we introduced extra reboxing.
Hence we always trim the CPR signature of a binding to idArity. References 1
- Don't eta expand in w/w GHC.Core.Opt.WorkWrap
Referenced by 2
- GHC.Core.Opt.CprAnal call site
- GHC.Core.Opt.WorkWrap call site