Note [Core top-level string literals]
As an exception to the usual rule that top-level binders must be lifted,
we allow binding primitive string literals (of type Addr#) at the
top level. This allows us to share string literals earlier in the pipeline and
crucially allows other optimizations in the Core2Core pipeline to fire.
Consider,
f n = let a::Addr# = "foo"#
in \x -> blah
In order to be able to inline `f`, we would like to float `a` to the top.
Another option would be to inline `a`, but that would lead to duplicating string
literals, which we want to avoid. See #8472.
The solution is simply to allow top-level unlifted binders. We can't allow
arbitrary unlifted expression at the top-level though, unlifted binders cannot
be thunks, so we just allow string literals.
We allow the top-level primitive string literals to be wrapped in Ticks
in the same way they can be wrapped when nested in an expression.
CoreToSTG currently discards Ticks around top-level primitive string literals.
See #14779.
Also see Note [Compilation plan for top-level string literals]. References 1
Referenced by 10
- GHC.Core.Utils call site ×2
- Core letrec invariant GHC.Core
- Compilation plan for top-level string literals GHC.Core
- GHC.Core.Lint call site
- GHC.Core.Opt.Simplify.Env call site
- Cannot trivialise GHC.Core.Opt.Simplify.Iteration
- Which type variables to abstract over GHC.Core.Opt.Simplify.Utils
- GHC.CoreToStg call site
- GHC.Stg.Syntax call site