See Note [CoreSyn let/app invariant] in CoreSyn.
Briefly, you can write
let x::Int# = e in …
if e is “ok-for-speculation”. See extensive comments in CoreUtils on what that means.
You could also use case, but let-bindings “float” more easily than cases, because they are not worried about preserving exception behaviour.
Simon
From: ghc-devs [mailto:ghc-devs-bounces@haskell.org]
On Behalf Of Sebastian Graf
Sent: 29 October 2017 21:07
To: ghc-devs <ghc-devs@haskell.org>
Subject: When does GHC produce unlifted `let` bindings?
Hi folks,
I was debugging a Core-to-Core transform for TEST=spec-inline and
was wondering (yet again) why GHC produces unlifted `let` bindings in Core like
it seems supposed to be doing.
Unlifted `let` seems much close to `case` than to `let`.
Some GHC passes seem to agree.
Cheers,
Sebastian