Extensive Notes on can_fail and has_side_effects
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 7 Aug 2014 06:46:24 +0000 (07:46 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 7 Aug 2014 08:55:17 +0000 (09:55 +0100)
commitab6480b8d8ea45ae6958558245266153df071aa5
treec747a2491bc62ce74bc9e7439ef52ac8bdcb6b08
parentdb17d58dc4c43de155022909bfae7263d7870d0a
Extensive Notes on can_fail and has_side_effects

In fixing Trac #9390 I discovered that I *still* didn't really understand
what the can_fail and has_side_effects properties of a PrimOp mean, precisely.

The big new things I learned are

* has_side_effects needs to be true only of *write* effects,
  Reads (which are, strictly speaking, effects) don't matter here.

* has_side_effects must be true of primops that can throw a synchronous
  Haskell exception (eg raiseIO#)

* can_fail is true only of primops that can cause an *unchecked* (not
  Haskell) system exception, like divide by zero, or accessing memory
  out of range through an array read or write.

I've documented all this now.  The changes in this patch are only
in comments.
compiler/coreSyn/CoreUtils.lhs
compiler/prelude/PrimOp.lhs
compiler/simplCore/FloatIn.lhs