[commit: ghc] wip/T10293: Call Arity: Trade precision for performance in large mutually recursive groups (2f3aa54)
git at git.haskell.org
git at git.haskell.org
Wed Apr 15 14:39:14 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T10293
Link : http://ghc.haskell.org/trac/ghc/changeset/2f3aa542cf9db37360925c27bd6646a1ce9dd852/ghc
>---------------------------------------------------------------
commit 2f3aa542cf9db37360925c27bd6646a1ce9dd852
Author: Joachim Breitner <mail at joachim-breitner.de>
Date: Wed Apr 15 16:25:13 2015 +0200
Call Arity: Trade precision for performance in large mutually recursive groups
Sometimes (especial with derived Data instances, it seems), one can have
very large mutually recursive bindings. Calculating the Call Arity
analysis result with full precision is an expensive operation in these
case. So above a certain threshold (25, for no good reason besides
intuition), skip this calculation and assume the recursion is not
linear, which is a conservative result.
With this, the Call Arity analysis accounts for 3.7% of the compile time
of haskell-src-exts.
>---------------------------------------------------------------
2f3aa542cf9db37360925c27bd6646a1ce9dd852
compiler/simplCore/CallArity.hs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/compiler/simplCore/CallArity.hs b/compiler/simplCore/CallArity.hs
index 4e4555c..c2a5ad0 100644
--- a/compiler/simplCore/CallArity.hs
+++ b/compiler/simplCore/CallArity.hs
@@ -630,6 +630,9 @@ callArityRecEnv any_boring ae_rhss ae_body
cross_calls
-- See Note [Taking boring variables into account]
| any_boring = completeGraph (domRes ae_combined)
+ -- Also, calculating cross_calls is expensive. Simply be conservative
+ -- if the mutually recursive group becomes too large.
+ | length ae_rhss > 25 = completeGraph (domRes ae_combined)
| otherwise = unionUnVarGraphs $ map cross_call ae_rhss
cross_call (v, ae_rhs) = completeBipartiteGraph called_by_v called_with_v
where
More information about the ghc-commits
mailing list