[commit: ghc] master: Remove ad-hoc special case in occAnal (c16382d)

git at git.haskell.org git at git.haskell.org
Thu Jun 7 10:06:17 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/c16382d57ed9bf51089a14f079404ff8b4ce6eb2/ghc

>---------------------------------------------------------------

commit c16382d57ed9bf51089a14f079404ff8b4ce6eb2
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Thu Jun 7 11:03:21 2018 +0100

    Remove ad-hoc special case in occAnal
    
    Back in 1999 I put this ad-hoc code in the Case-handling
    code for occAnal:
    
      occAnal env (Case scrut bndr ty alts)
       = ...
            -- Note [Case binder usage]
            -- ~~~~~~~~~~~~~~~~~~~~~~~~
            -- The case binder gets a usage of either "many" or "dead", never "one".
            -- Reason: we like to inline single occurrences, to eliminate a binding,
            -- but inlining a case binder *doesn't* eliminate a binding.
            -- We *don't* want to transform
            --      case x of w { (p,q) -> f w }
            -- into
            --      case x of w { (p,q) -> f (p,q) }
        tag_case_bndr usage bndr
          = (usage', setIdOccInfo bndr final_occ_info)
          where
            occ_info       = lookupDetails usage bndr
            usage'         = usage `delDetails` bndr
            final_occ_info = case occ_info of IAmDead -> IAmDead
                                              _       -> noOccInfo
    
    But the comment looks wrong -- the bad inlining will not happen -- and
    I think it relates to some long-ago version of the simplifier.
    
    So I simply removed the special case, which gives more accurate
    occurrence-info to the case binder.  Interestingly I got a slight
    improvement in nofib binary sizes.
    
    --------------------------------------------------------------------------------
            Program           Size    Allocs   Runtime   Elapsed  TotalMem
    --------------------------------------------------------------------------------
          cacheprof          -0.1%     +0.2%     -0.7%     -1.2%     +8.6%
    --------------------------------------------------------------------------------
                Min          -0.2%      0.0%    -14.5%    -30.5%      0.0%
                Max          -0.1%     +0.2%    +10.0%    +10.0%    +25.0%
     Geometric Mean          -0.2%     +0.0%     -1.9%     -5.4%     +0.3%
    
    I have no idea if the improvement in runtime is real.  I did look at the
    tiny increase in allocation for cacheprof and concluded that it was
    unimportant (I forget the details).
    
    Also the more accurate occ-info for the case binder meant that some
    inlining happens in one pass that previously took successive passes
    for the test dependent/should_compile/dynamic-paper (which has a
    known Russel-paradox infinite loop in the simplifier).
    
    In short, a small win: less ad-hoc complexity and slightly smaller
    binaries.


>---------------------------------------------------------------

c16382d57ed9bf51089a14f079404ff8b4ce6eb2
 compiler/simplCore/OccurAnal.hs                    | 75 +++++++++++-----------
 .../tests/codeGen/should_compile/T14626.stdout     |  2 +-
 testsuite/tests/dependent/should_compile/all.T     |  2 +-
 .../should_compile/dynamic-paper.stderr}           |  0
 .../tests/simplCore/should_compile/T13143.stderr   |  4 +-
 .../tests/simplCore/should_compile/T3717.stderr    |  4 +-
 .../tests/simplCore/should_compile/T4930.stderr    |  4 +-
 .../tests/simplCore/should_compile/T7360.stderr    |  4 +-
 .../tests/simplCore/should_compile/T7865.stdout    |  2 +-
 .../simplCore/should_compile/spec-inline.stderr    |  6 +-
 10 files changed, 54 insertions(+), 49 deletions(-)

Diff suppressed because of size. To see it, use:

    git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc c16382d57ed9bf51089a14f079404ff8b4ce6eb2


More information about the ghc-commits mailing list