Commit da4687f6 authored by David Feuer's avatar David Feuer

Make raiseIO# produce topRes

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
parent 6a94b8bb
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment