Improve the handling of used-once stuff
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Nov 2013 17:13:05 +0000 (17:13 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 12 Dec 2013 11:26:58 +0000 (11:26 +0000)
commit80989de947dc7edb55999456d1c1e8c337efc951
tree4c8fc179290159ee48b2995c58eaa4ce00e1ac61
parent869f69fd4a78371c221e6d9abd69a71440a4679a
Improve the handling of used-once stuff

Joachim and I are committing this onto a branch so that we can share it,
but we expect to do a bit more work before merging it onto head.

Nofib staus:
  - Most programs, no change
  - A few improve
  - A couple get worse (cacheprof, tak, rfib)
Investigating the "get worse" set is what's holding up putting this
on head.

The major issue is this.  Consider

    map (f g) ys

where f's demand signature looks like

   f :: <L,C1(C1(U))> -> <L,U> -> .

So 'f' is not saturated.  What demand do we place on g?
Answer
        C(C1(U))
That is, the inner C1 should stay, even though f is not saturated.

I found that this made a significant difference in the demand signatures
inferred in GHC.IO, which uses lots of higher-order exception handlers.

I also had to add used-once demand signatures for some of the
'catch' primops, so that we know their handlers are only called once.
12 files changed:
compiler/basicTypes/BasicTypes.lhs
compiler/basicTypes/Demand.lhs
compiler/basicTypes/Id.lhs
compiler/basicTypes/IdInfo.lhs
compiler/basicTypes/MkId.lhs
compiler/coreSyn/CoreArity.lhs
compiler/coreSyn/PprCore.lhs
compiler/simplCore/OccurAnal.lhs
compiler/simplCore/SetLevels.lhs
compiler/specialise/SpecConstr.lhs
compiler/stranal/WorkWrap.lhs
compiler/stranal/WwLib.lhs