diff options
author | David Feuer <David.Feuer@gmail.com> | 2017-03-08 21:34:18 (GMT) |
---|---|---|
committer | David Feuer <David.Feuer@gmail.com> | 2017-03-08 21:38:56 (GMT) |
commit | da4687f63ffe5a6162e3d7856aa53de048dd0f42 (patch) | |
tree | 77c7a781af6f8096eccdc329086984640ea2eb20 | |
parent | 6a94b8bba999ce111a8195ab398291dce5bcef2d (diff) | |
download | ghc-wip/raiseIO-conservative.zip ghc-wip/raiseIO-conservative.tar.gz ghc-wip/raiseIO-conservative.tar.bz2 |
Make raiseIO# produce topReswip/raiseIO-conservative
Summary:
Make `raiseIO#` produce `topRes` instead of `ExnRes`. `ExnRes`
leads to demand analysis being too aggressive, IMO, allowing
imprecise exceptions produced by `throw` to replace exceptions
thrown by `throwIO` that would like to think of as precise.
This fixes that, but is certanly much more conservative than we
would ideally like. Let's see how bad it is.
Fixes Trac #13380
Reviewers: austin, bgamari
Subscribers: rwbarton, thomie
Differential Revision: https://phabricator.haskell.org/D3301
-rw-r--r-- | compiler/prelude/primops.txt.pp | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/compiler/prelude/primops.txt.pp b/compiler/prelude/primops.txt.pp index 1d10223..64971a3 100644 --- a/compiler/prelude/primops.txt.pp +++ b/compiler/prelude/primops.txt.pp @@ -2005,11 +2005,9 @@ primop RaiseOp "raise#" GenPrimOp -- must be *precise* - we don't want the strictness analyser turning -- one kind of bottom into another, as it is allowed to do in pure code. -- --- But we *do* want to know that it returns bottom after --- being applied to two arguments, so that this function is strict in y --- f x y | x>0 = raiseIO blah --- | y>0 = return 1 --- | otherwise = return 2 +-- We currently produce topRes, which is much too conservative (interfering +-- with dead code elimination, unfortunately), but nothing else we currently +-- have on tap is actually correct. -- -- TODO Check that the above notes on @f@ are valid. The function successfully -- produces an IO exception when compiled without optimization. If we analyze @@ -2021,7 +2019,7 @@ primop RaiseOp "raise#" GenPrimOp primop RaiseIOOp "raiseIO#" GenPrimOp a -> State# RealWorld -> (# State# RealWorld, b #) with - strictness = { \ _arity -> mkClosedStrictSig [topDmd, topDmd] exnRes } + strictness = { \ _arity -> mkClosedStrictSig [topDmd, topDmd] topRes } out_of_line = True has_side_effects = True |