Note [runRW arg]
Consider the Core program (from #11291), runRW# (case bot of {}) The late inlining logic in cpe_app would transform this into: (case bot of {}) realWorld# Which would rise to a panic in CoreToStg.myCollectArgs, which expects only variables in function position. However, as runRW#'s strictness signature captures the fact that it will call its argument this can't happen: the simplifier will transform the bottoming application into simply (case bot of {}). Note that this reasoning does *not* apply to non-bottoming continuations like: hello :: Bool -> Int hello n = runRW# ( case n of True -> \s -> 23 _ -> \s -> 10) Why? The difference is that (case bot of {}) is considered by okCpeArg to be trivial, consequently cpeArg (which the catch-all case of cpe_app calls on both the function and the arguments) will forgo binding it to a variable. By contrast, in the non-bottoming case of `hello` above the function will be deemed non-trivial and consequently will be case-bound.
References 0
This Note does not link to any other.
Referenced by 2
- GHC.CoreToStg.Prep call site
- CorePrepEnv: cpe_subst GHC.CoreToStg.Prep