Skip to content

Nested CPR light (#19398)

Sebastian Graf requested to merge wip/conservative-field-binder-cpr into master

While fixing #19232 (closed), it became increasingly clear that the vestigial hack described in Note [Optimistic field binder CPR] is complicated and causes reboxing. Rather than make the hack worse, this patch gets rid of it completely in favor of giving deeply unboxed parameters the Nested CPR property. Example:

f :: (Int, Int) -> Int
f p = case p of
 (x, y) | x == y    = x
        | otherwise = y

Based on p's idDemandInfo SP(SP(U),SP(U)), we can see that both fields of p will be available unboxed. As a result, we give p the nested CPR property 1(1,1). When analysing the case, the field CPRs are transferred to the binders x and y, respectively, so that we ultimately give f the CPR property.

I took the liberty to do a bit of refactoring:

  • I renamed CprResult ("Constructed product result result") to plain Cpr.
  • I moved a bit of stuff around in GHC.Core.Opt.WorkWrap.Utils and introduced UnboxingDecision to replace the Maybe DataConPatContext type we used to return from wantToUnbox.
  • Since the Outputable Cpr instance changed anyway, I removed the leading m which we used to emit for ConCpr. It's just noise, especially now that we may output nested CPRs.

No changes to NoFib at all through this patch.

Fixes #19398 (closed).

Edited by Sebastian Graf

Merge request reports