Make demand analysis understand catch
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 6 Jan 2016 17:40:09 +0000 (17:40 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 7 Jan 2016 08:37:23 +0000 (08:37 +0000)
commit9915b6564403a6d17651e9969e9ea5d7d7e78e7f
treee064a66dca1e8d1be5e04d0349c53e99fe391353
parenta5cea73c658888e01c162723d3e0e1439514ecdb
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
15 files changed:
compiler/basicTypes/Demand.hs
compiler/coreSyn/CoreArity.hs
compiler/coreSyn/MkCore.hs
compiler/prelude/primops.txt.pp
compiler/stgSyn/CoreToStg.hs
compiler/stranal/DmdAnal.hs
compiler/stranal/WorkWrap.hs
testsuite/tests/deSugar/should_compile/T2431.stderr
testsuite/tests/numeric/should_compile/T7116.stdout
testsuite/tests/simplCore/should_compile/T3772.stdout
testsuite/tests/simplCore/should_compile/T4930.stderr
testsuite/tests/simplCore/should_compile/spec-inline.stderr
testsuite/tests/stranal/sigs/HyperStrUse.stderr
testsuite/tests/stranal/sigs/T8598.stderr
testsuite/tests/stranal/sigs/UnsatFun.stderr