Motivation for let/app invariant
From time to time I wonder why it's ok to allow unlifted let bindings and then have to re-read the let/app invariant.
And after that, I'm still unconvinced that there is a good reason why we have unlifted let bindings and not just
I think one of the reason is because then we have an easier time in FloatOut/SetLevels, but it seems like it already is aware of speculation for
Note [Floating single-alternative cases].
Get rid of the let/app invariant and case-bind all unlifted expressions in Core. Let bindings must always be lifted. Deal with the fall-out by calling
exprOkForSpeculation on scrutinees to see whether they can be treated how unlifted let-bindings are treated at the moment.