[commit: ghc] master: Record evaluated-ness on workers and wrappers (596dece)
git at git.haskell.org
git at git.haskell.org
Mon Jan 23 17:42:00 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/596dece7866006d699969f775fd97bd306aad85b/ghc
>---------------------------------------------------------------
commit 596dece7866006d699969f775fd97bd306aad85b
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Fri Jan 13 08:56:53 2017 +0000
Record evaluated-ness on workers and wrappers
Summary:
This patch is a refinement of the original commit (which
was reverted):
commit 6b976eb89fe72827f226506d16d3721ba4e28bab
Date: Fri Jan 13 08:56:53 2017 +0000
Record evaluated-ness on workers and wrappers
In Trac #13027, comment:20, I noticed that wrappers created after
demand analysis weren't recording the evaluated-ness of strict
constructor arguments. In the ticket that led to a (debatable)
Lint error but in general the more we know about evaluated-ness
the better we can optimise.
This commit adds that info
* both in the worker (on args)
* and in the wrapper (on CPR result patterns).
See Note [Record evaluated-ness in worker/wrapper] in WwLib
On the way I defined Id.setCaseBndrEvald, and used it to shorten
the code in a few other places
Then I added test T13077a to test the CPR aspect of this patch,
but I found that Lint failed!
Reason: simpleOptExpr was discarding evaluated-ness info on
lambda binders because zapFragileIdInfo was discarding an
Unfolding of (OtherCon _). But actually that's a robust
unfolding; there is no need to discard it. To fix this:
* zapFragileIdInfo only zaps fragile unfoldings
* Replace isClosedUnfolding with isFragileUnfolding (the latter
is just the negation of the former, but the nomenclature is
more consistent). Better documentation too
Note [Fragile unfoldings]
* And Simplify.simplLamBndr can now look at isFragileUnfolding
to decide whether to use the longer route of simplUnfolding.
For some reason perf/compiler/T9233 improves in compile-time
allocation by 10%. Hooray
Nofib: essentially no change:
--------------------------------------------------------------------------------
Program Size Allocs Runtime Elapsed TotalMem
--------------------------------------------------------------------------------
cacheprof +0.0% -0.3% +0.9% +0.4% +0.0%
--------------------------------------------------------------------------------
Min +0.0% -0.3% -2.4% -2.4% +0.0%
Max +0.0% +0.0% +9.8% +11.4% +2.4%
Geometric Mean +0.0% -0.0% +1.1% +1.0% +0.0%
>---------------------------------------------------------------
596dece7866006d699969f775fd97bd306aad85b
compiler/basicTypes/Id.hs | 13 ++-
compiler/basicTypes/IdInfo.hs | 18 +++-
compiler/coreSyn/CoreSubst.hs | 12 ++-
compiler/coreSyn/CoreSyn.hs | 36 ++++++--
compiler/coreSyn/CoreUtils.hs | 6 +-
compiler/simplCore/Simplify.hs | 16 ++--
compiler/stranal/WwLib.hs | 108 +++++++++++++++++-----
testsuite/tests/perf/compiler/all.T | 5 +-
testsuite/tests/stranal/should_compile/T13077.hs | 15 +++
testsuite/tests/stranal/should_compile/T13077a.hs | 21 +++++
testsuite/tests/stranal/should_compile/all.T | 3 +-
11 files changed, 192 insertions(+), 61 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 596dece7866006d699969f775fd97bd306aad85b
More information about the ghc-commits
mailing list