Sebastian Graf <[email protected]> writes:
> Hi folks, > > I was debugging a Core-to-Core transform for TEST=spec-inline > <https://github.com/ghc/ghc/blob/fe04f3783b662c52c4a0ff36b2d62a7a575998a5/testsuite/tests/simplCore/should_compile/spec-inline.hs> > and > was wondering (yet again) why GHC produces unlifted `let` bindings in Core > like it seems supposed to be doing > <https://github.com/ghc/ghc/blob/fe04f3783b662c52c4a0ff36b2d62a7a575998a5/testsuite/tests/simplCore/should_compile/spec-inline.stderr#L68-L76> > . > > - Why doesn't this use `case` instead? > - Is there a semantic difference? My understanding is that we use `case` in this case since there is no thunk evaluation necessary. Recall that operationally (under STG) `case` is what drives evaluation whereas `let` is simply allocation. In a sense, bringing an unlifted binding into scope is closer to the latter than the former, being a simple register assignment. > - Can `case` be used with unlifted types? I'm honestly not sure what would happen in this case. It may work fine or something may explode. I suspect CoreToStg will lower a case with an unlifted scrutinee to a let, but perhaps not. If not then things likely will blow up since, according to Note [Types in StgConApp], unlifted values can't be let-bound in STG. Cheers, - Ben
signature.asc
Description: PGP signature
_______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
