summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2015-04-15 16:25:13 +0200
committerJoachim Breitner <mail@joachim-breitner.de>2015-04-16 14:06:44 +0200
commit9654a7cf8580bc3a027bf8b39c06d916050c446d (patch)
tree2d8499506a69e20dd4ca66a00d9feba9631bd64a
parenta9ca67f6bfb45d13944ba15452d3af613ec84d8b (diff)
downloadhaskell-9654a7cf8580bc3a027bf8b39c06d916050c446d.tar.gz
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. Fixes #10293 Differential Revision: https://phabricator.haskell.org/D843
-rw-r--r--compiler/simplCore/CallArity.hs3
1 files changed, 3 insertions, 0 deletions
diff --git a/compiler/simplCore/CallArity.hs b/compiler/simplCore/CallArity.hs
index 4e4555ca13..c2a5ad0cae 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