
#10844: CallStack should not be inlined -------------------------------------+------------------------------------- Reporter: nomeata | Owner: gridaphobe Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by gridaphobe): Sorry to be slow here. I've been investigating this more today, trying to get GHC to not inline CallStacks. I can tell GHC to not inline Ids with an `IP CallStack` type by adding a special case to `CoreUnfold.callSiteInline` and `SimplUtils.{pre,post}InlineUnconditionally`, but this doesn't seem to be good enough. In Joachim's minimal example (thanks by the way!) the CallStack ''still'' ends up in `T10844`. I've posted the output of `-dverbose-core2core` with what I believe to be the relevant portion highlighted. https://gist.github.com/gridaphobe/fd9f313d7d91be405f01#file- gistfile1-txt-L773-L981 You can see that the pieces of the CallStack have just been floated out to the top-level, but `$cfoo`s unfolding still contains the whole CallStack instead of just a reference to the newly-created binder. So it seems that we want to tell the simplifier to update the unfolding when a CallStack is floated out. Is that a reasonable thing to do? (Sorry, my knowledge of this part of GHC is very limited) As an alternative, perhaps we could revise how CallStacks are desugared. If we could tell the Desugarer to translate CallStack evidence into exported binders instead of local binders, we could mark those binders as NOINLINE. This approach seems like it would be less brittle. (My WIP branch is at https://github.com/gridaphobe/ghc.git, branch `noinline-callstacks`) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10844#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler