summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Feuer <David.Feuer@gmail.com>2017-03-08 21:34:18 (GMT)
committerDavid Feuer <David.Feuer@gmail.com>2017-03-08 21:38:56 (GMT)
commitda4687f63ffe5a6162e3d7856aa53de048dd0f42 (patch)
tree77c7a781af6f8096eccdc329086984640ea2eb20
parent6a94b8bba999ce111a8195ab398291dce5bcef2d (diff)
downloadghc-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.pp10
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