Boxity: DataCon wrappers have no boxity signature
Example
data D = D !Int
f :: Bool -> Int -> D
f x y = D (go x)
where
go False = y
go True = go False
{-# NOINLINE f #-}
Core after DmdAnal:
f [InlPrag=NOINLINE] :: Bool -> Int -> D
[LclIdX,
Arity=2,
Str=<1L><SL>,
Cpr=1,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [0 0] 52 0}]
f = \ (x_auC [Dmd=1L] :: Bool) (y_auD [Dmd=SL] :: Int) ->
join {
$j_svX [Dmd=SCS(!P(L))] :: Int %1 -> D
[LclId[JoinId(1)(Nothing)], Arity=1, Str=<SL>, Cpr=1]
$j_svX (arg_svW [Dmd=SL, OS=OneShot] :: Int) = Lib.$WD arg_svW } in
joinrec {
go_svV [Occ=LoopBreaker, Dmd=SCS(!P(L))] :: Bool -> D
[LclId[JoinId(1)(Nothing)],
Arity=1,
Str=<1L> {auD->SL svX->SCS(!P(L))},
Cpr=1,
Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [34] 28 0}]
go_svV (ds_dvL [Dmd=1L] :: Bool)
= case ds_dvL of {
False -> jump $j_svX y_auD;
True -> jump go_svV GHC.Types.False
}; } in
jump go_svV x_auC
So today, we won't unbox y
, which is bogus, because the DataCon wrapper will unbox it anyway (if inlined).
Note that CPR will fire on f
, because it handles DataCon wrappers by lookin at the unfolding, see Note [CPR for DataCon wrappers]
. Let's do the same for demand analysis.