Careful tweaking to exprOkForSpeculation
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 7 Dec 2018 12:56:08 +0000 (12:56 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 7 Dec 2018 14:58:51 +0000 (14:58 +0000)
commitf334d20e00e3f4bd217e49216b7e9d9c8779db10
treeb2f8d059c0d1d6a7e294716a1ca31d788f922a63
parent5b7ca03995c1d5fbd29ba0e327bb2a1f344c9419
Careful tweaking to exprOkForSpeculation

This patch does several things:

* Make exprOkForSpeculation ignore evaluatedness of variables
  See the Note [exprOkForSpeculation and evaluated variables]
  This means that the binder-swap transformation no longer
  invaliates the let/app invariant.

* Make exprOkForSpeculation return False for
     DataToTagOp and SeqOp.
  See Note [exprOkForSpeculation and SeqOp/DataToTagOp]

* Remove the 'can_fail' property from dataToTag#; it was
  always a hack (described in the old Note [dataToTag#] in
  primops.txt.pp), and now its not necessary because of the
  fixes above.

* Make SetLevels use exprIsHNF, /not/ exprOkForSpeculation,
  when floating single-alternative cases.  See SetLevels
  Note [Floating single-alternative cases]

* Fix a buglet in FloatIn; probably never bites in practice
  See Note [Dead bindings]

Collectively, these changes finally fix Trac #15696.
compiler/coreSyn/CoreUtils.hs
compiler/coreSyn/MkCore.hs
compiler/prelude/PrelRules.hs
compiler/prelude/primops.txt.pp
compiler/simplCore/FloatIn.hs
compiler/simplCore/SetLevels.hs