[commit: ghc] master: Comments on slow-call-shortcutting (9021737)

git at git.haskell.org git at git.haskell.org
Thu Nov 28 12:52:35 UTC 2013


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/9021737d6cc8f9eb992377dc7f7446017062b79c/ghc

>---------------------------------------------------------------

commit 9021737d6cc8f9eb992377dc7f7446017062b79c
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Thu Nov 28 10:55:26 2013 +0000

    Comments on slow-call-shortcutting


>---------------------------------------------------------------

9021737d6cc8f9eb992377dc7f7446017062b79c
 compiler/codeGen/StgCmmLayout.hs |   36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/compiler/codeGen/StgCmmLayout.hs b/compiler/codeGen/StgCmmLayout.hs
index 4f71568..54e2e92 100644
--- a/compiler/codeGen/StgCmmLayout.hs
+++ b/compiler/codeGen/StgCmmLayout.hs
@@ -188,6 +188,7 @@ slowCall fun stg_args
                                       " with pat " ++ unpackFS rts_fun)
            return r
 
+        -- Note [avoid intermediate PAPs]
         let n_args = length stg_args
         if n_args > arity && optLevel dflags >= 2
            then do
@@ -195,6 +196,15 @@ slowCall fun stg_args
              fun_iptr <- (CmmReg . CmmLocal) `fmap`
                     assignTemp (closureInfoPtr dflags (cmmUntag dflags funv))
 
+             -- ToDo: we could do slightly better here by reusing the
+             -- continuation from the slow call, which we have in r.
+             -- Also we'd like to push the continuation on the stack
+             -- before the branch, so that we only get one copy of the
+             -- code that saves all the live variables across the
+             -- call, but that might need some improvements to the
+             -- special case in the stack layout code to handle this
+             -- (see Note [diamond proc point]).
+
              fast_code <- getCode $
                 emitCall (NativeNodeCall, NativeReturn)
                   (entryCode dflags fun_iptr)
@@ -224,6 +234,32 @@ slowCall fun stg_args
              return r
 
 
+-- Note [avoid intermediate PAPs]
+--
+-- A slow call which needs multiple generic apply patterns will be
+-- almost guaranteed to create one or more intermediate PAPs when
+-- applied to a function that takes the correct number of arguments.
+-- We try to avoid this situation by generating code to test whether
+-- we are calling a function with the correct number of arguments
+-- first, i.e.:
+--
+--   if (TAG(f) != 0} {  // f is not a thunk
+--      if (f->info.arity == n) {
+--         ... make a fast call to f ...
+--      }
+--   }
+--   ... otherwise make the slow call ...
+--
+-- We *only* do this when the call requires multiple generic apply
+-- functions, which requires pushing extra stack frames and probably
+-- results in intermediate PAPs.  (I say probably, because it might be
+-- that we're over-applying a function, but that seems even less
+-- likely).
+--
+-- This very rarely applies, but if it does happen in an inner loop it
+-- can have a severe impact on performance (#6084).
+
+
 --------------
 direct_call :: String
             -> Convention     -- e.g. NativeNodeCall or NativeDirectCall



More information about the ghc-commits mailing list