Commit f6bf2ce8 authored by Sebastian Graf's avatar Sebastian Graf Committed by Marge Bot
Browse files

Revert "`exprOkForSpeculation` for Note [IO hack in the demand analyser]"

This reverts commit ce64b397 on the
grounds of the regression it would introduce in a couple of packages.

Fixes #17653.

Also undoes a slight metric increase in #13701 introduced by that commit
that we didn't see prior to !1983.

Metric Decrease:
parent f416fe64
......@@ -333,7 +333,10 @@ io_hack_reqd scrut con bndrs
| (bndr:_) <- bndrs
, con == tupleDataCon Unboxed 2
, idType bndr `eqType` realWorldStatePrimTy
= not (exprOkForSpeculation scrut)
, (fun, _) <- collectArgs scrut
= case fun of
Var f -> not (isPrimOpId f)
_ -> True
| otherwise
= False
......@@ -384,18 +387,15 @@ getMaskingState# is not going to diverge or throw an exception! This
situation actually arises in GHC.IO.Handle.Internals.wantReadableHandle
(on an MVar not an Int), and made a material difference.
So if the scrutinee is ok-for-speculation, we *don't* apply the state hack,
because we are free to push evaluation of the scrutinee after evaluation of
expressions from the (single) case alternative.
A few examples for different scrutinees:
So if the scrutinee is a primop call, we *don't* apply the
state hack:
- If it is a simple, terminating one like getMaskingState,
applying the hack would be over-conservative.
- If the primop is raise# then it returns bottom (so not ok-for-speculation),
but the result from the case alternatives are discarded anyway.
applying the hack is over-conservative.
- If the primop is raise# then it returns bottom, so
the case alternatives are already discarded.
- If the primop can raise a non-IO exception, like
divide by zero (so not ok-for-speculation), then we are also bottoming out
anyway and don't mind evaluating 'x' first.
divide by zero or seg-fault (eg writing an array
out of bounds) then we don't mind evaluating 'x' first.
Note [Demand on the scrutinee of a product case]
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