Admin message

Due to a large amount of spam we do not allow new users to create repositories, they are "external" users. If you are a new user and want to create a repository, for example for forking GHC, open a new issue on ghc/ghc using the "get-verified" issue template

Discussion about the structure of mkCoreUnfolding
I was contemplating the memory behaviour of `mkCoreUnfolding`: ``` mkCoreUnfolding :: UnfoldingSource -> Bool -> CoreExpr -> UnfoldingGuidance -> Unfolding -- Occurrence-analyses the expression before capturing it mkCoreUnfolding src top_lvl expr guidance = CoreUnfolding { uf_tmpl = occurAnalyseExpr expr, -- See Note [Occurrence analysis of unfoldings] uf_src = src, uf_is_top = top_lvl, uf_is_value = exprIsHNF expr, uf_is_conlike = exprIsConLike expr, uf_is_work_free = exprIsWorkFree expr, uf_expandable = exprIsExpandable expr, uf_guidance = guidance } ``` The immediate problem to me is that this definition seems like it will retain both the old `CoreExpr` (`expr`) and a new `CoreExpr`, (`occurAnalyseExpr expr`). However, `occurAnalyseExpr expr` is **also** a thunk, so this doubling situation only happens when `uf_tmpl` is forced but the predicate fields are not (or vice versa). Are these fields always forced in lock-step? We could-engineer that to be the case but it seems we might check the predicates before deciding to force the template. Are the predicates on the `expr` invariant under occurrence analysis? It seems to me that they should be. Therefore, perhaps the best thing to is to engineer this definition so that the predicates are called on `expr` if `uf_tmpl` has not been forced, if it has been forced then instead the forced value should be used for computation. This could be achieved using IORefs and unsafe functions. Thoughts?
issue