Note [SafeArityType]
The function safeArityType trims an ArityType to return a "safe" ArityType, for which we use a type synonym SafeArityType. It is "safe" in the sense that (arityTypeArity at) really reflects the arity of the expression, whereas a regular ArityType might have more lambdas in its [ATLamInfo] that the (cost-free) arity of the expression. For example \x.\y.let v = expensive in \z. blah has arityType = AT [C?, C?, X?, C?] Top But the expression actually has arity 2, not 4, because of the X. So safeArityType will trim it to (AT [C?, C?] Top), whose [ATLamInfo] now reflects the (cost-free) arity of the expression Why do we ever need an "unsafe" ArityType, such as the example above? Because its (cost-free) arity may increased by combineWithCallCards in findRhsArity. See Note [Combining arity type with demand info]. Thus the function `arityType` returns a regular "unsafe" ArityType, that goes deeply into the lambdas (including under IsExpensive). But that is very local; most ArityTypes are indeed "safe". We use the type synonym SafeArityType to indicate where we believe the ArityType is safe.
References 1
- Combining arity type with demand info GHC.Core.Opt.Arity
Referenced by 3
- GHC.Core.Opt.Arity call site ×2
- Arity invariants for bindings GHC.Core.Opt.Arity