[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