[commit: ghc] wip/T14880-accum: Use an accumulator version of tyCoVarsOfType (d0a25e7)
git at git.haskell.org
git at git.haskell.org
Tue Sep 4 07:22:02 UTC 2018
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T14880-accum
Link : http://ghc.haskell.org/trac/ghc/changeset/d0a25e71157666ee3c436de273dd41b3ef1262b6/ghc
>---------------------------------------------------------------
commit d0a25e71157666ee3c436de273dd41b3ef1262b6
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Fri Aug 31 14:18:55 2018 +0100
Use an accumulator version of tyCoVarsOfType
In TyCoRep we now have tyCoVarsOfType implemented
1) Using FV -- this is the baseline version in GHC today
2) Using VarSets via unionVarSet
3) Using VarSets in accumulator-style
In this patch (3) is enabled.
When compiling perf/compiler/T5631 we get
Compiler allocs
(1) 1,144M
(2) 1,175M
(3) 1,142M
The key new insight in (3) is this:
ty_co_vars_of_type (TyVarTy v) is acc
| v `elemVarSet` is = acc
| v `elemVarSet` acc = acc <---- NB!
| otherwise = ty_co_vars_of_type (tyVarKind v) is (extendVarSet acc v)
Notice the second line! If the variable is already in the
accumulator, don't re-add it. This makes big difference.
Without it, allocation is 1,169M or so.
One cause is that we only take the free vars of its kind once;
that problem will go away when we do the main part of #14088 and
close over kinds /afterwards/. But still, another cause is perhaps
that every insert into a set overwrites the previous item, and so
allocates a new path to the item; it's not a no-op even if the
item is there already.
Why use (3) rather than (1)? Becuase it just /has/ to
be better;
* FV carries around an InterestingVarFun, which does nothing
useful here, but is tested at every variable
* FV carries around a [Var] for the deterministic version.
For this very hot operation (finding free vars) I think it
makes sense to have speical purpose code.
On the way I also simplified the (less used) coVarsOfType/Co family
to use FV, by making serious use of the InterestingVarFun!
>---------------------------------------------------------------
d0a25e71157666ee3c436de273dd41b3ef1262b6
compiler/types/TyCoRep.hs | 382 +++++++++++++++++++++++++++++++---------------
1 file changed, 261 insertions(+), 121 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 d0a25e71157666ee3c436de273dd41b3ef1262b6
More information about the ghc-commits
mailing list