Note [EPT enforcement lowers strict constructor worker semantics]
In Core, a saturated application of a strict constructor worker evaluates its strict fields and thus is *not* a value; see Note [Strict fields in Core]. This is also the semantics of strict constructor workers in STG *before* EPT enforcement (see Note [EPT enforcement]) However, after enforcing the EPT Invariant, all constructor workers can effectively be lazy. That is, when actually generating code to allocate the data constructor, the code generator does not need to evaluate the argument; that has already been done by the EPT pass. Thus for code-gen reasons (StgToX), all constructor workers are considered lazy after EPT enforcement.
References 2
- Strict fields in Core GHC.Core
- EPT enforcement GHC.Stg.EnforceEpt
Referenced by 1
- Strict fields in Core GHC.Core