diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2016-01-06 17:40:09 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2016-01-07 08:37:23 +0000 |
commit | 9915b6564403a6d17651e9969e9ea5d7d7e78e7f (patch) | |
tree | e064a66dca1e8d1be5e04d0349c53e99fe391353 /compiler/stranal/WorkWrap.hs | |
parent | a5cea73c658888e01c162723d3e0e1439514ecdb (diff) | |
download | haskell-9915b6564403a6d17651e9969e9ea5d7d7e78e7f.tar.gz |
Make demand analysis understand catch
As Trac #11222, and #10712 note, the strictness analyser
needs to be rather careful about exceptions. Previously
it treated them as identical to divergence, but that
won't quite do.
See Note [Exceptions and strictness] in Demand, which
explains the deal.
Getting more strictness in 'catch' and friends is a
very good thing. Here is the nofib summary, keeping
only the big ones.
--------------------------------------------------------------------------------
Program Size Allocs Runtime Elapsed TotalMem
--------------------------------------------------------------------------------
fasta -0.1% -6.9% -3.0% -3.0% +0.0%
hpg -0.1% -2.0% -6.2% -6.2% +0.0%
maillist -0.1% -0.3% 0.08 0.09 +1.2%
reverse-complem -0.1% -10.9% -6.0% -5.9% +0.0%
sphere -0.1% -4.3% 0.08 0.08 +0.0%
x2n1 -0.1% -0.0% 0.00 0.00 +0.0%
--------------------------------------------------------------------------------
Min -0.2% -10.9% -17.4% -17.3% +0.0%
Max -0.0% +0.0% +4.3% +4.4% +1.2%
Geometric Mean -0.1% -0.3% -2.9% -3.0% +0.0%
On the way I did quite a bit of refactoring in Demand.hs
Diffstat (limited to 'compiler/stranal/WorkWrap.hs')
-rw-r--r-- | compiler/stranal/WorkWrap.hs | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/compiler/stranal/WorkWrap.hs b/compiler/stranal/WorkWrap.hs index 7a94c1b3f3..c0a31c9b92 100644 --- a/compiler/stranal/WorkWrap.hs +++ b/compiler/stranal/WorkWrap.hs @@ -392,8 +392,9 @@ splitFun dflags fam_envs fn_id fn_info wrap_dmds res_info rhs -- The arity is set by the simplifier using exprEtaExpandArity -- So it may be more than the number of top-level-visible lambdas - work_res_info | isBotRes res_info = botRes -- Cpr stuff done by wrapper - | otherwise = topRes + work_res_info = case returnsCPR_maybe res_info of + Just _ -> topRes -- Cpr stuff done by wrapper; kill it here + Nothing -> res_info -- Preserve exception/divergence one_shots = get_one_shots rhs |