Note [Wrapper activation]
When should the wrapper inlining be active? 1. It must not be active earlier than the current Activation of the Id, because we must give rewrite rules mentioning the wrapper and specialisation a chance to fire. See Note [Worker/wrapper for INLINABLE functions] and Note [Worker activation] 2. It should be active at some point, despite (1) because of Note [Worker/wrapper for NOINLINE functions] 3. For ordinary functions with no pragmas we want to inline the wrapper as early as possible (#15056). Suppose another module defines f !x xs = ... foldr k z xs ... and suppose we have the usual foldr/build RULE. Then if we have a call `f x [1..x]`, we'd expect to inline f and the RULE will fire. But if f is w/w'd (which it might be), we want the inlining to occur just as if it hadn't been. (This only matters if f's RHS is big enough to w/w, but small enough to inline given the call site, but that can happen.) 4. We do not want to inline the wrapper before specialisation. module Foo where f :: Num a => a -> Int -> a f n 0 = n -- Strict in the Int, hence wrapper f n x = f (n+n) (x-1) g :: Int -> Int g x = f x x -- Provokes a specialisation for f module Bar where import Foo h :: Int -> Int h x = f 3 x In module Bar we want to give specialisations a chance to fire before inlining f's wrapper. (Historical note: At one stage I tried making the wrapper inlining always-active, and that had a very bad effect on nofib/imaginary/x2n1; a wrapper was inlined before the specialisation fired.) 4a. If we have {-# SPECIALISE foo :: (Int,Int) -> Bool -> Int #
References 3
- Worker activation GHC.Core.Opt.WorkWrap
- Worker/wrapper for INLINABLE functions GHC.Core.Opt.WorkWrap
- Worker/wrapper for NOINLINE functions GHC.Core.Opt.WorkWrap
Referenced by 8
- GHC.Core.Opt.WorkWrap call site ×4
- GHC.Core.Opt.Simplify.Iteration call site ×2
- GHC.Core.Opt.CSE call site
- Compiler phases GHC.Types.Basic