[commit: ghc] wip/callArityExprIsCheap: CallArity: Use exprIsCheap to detect thunks (899cf3b)

git at git.haskell.org git at git.haskell.org
Mon Dec 26 09:18:00 UTC 2016


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

On branch  : wip/callArityExprIsCheap
Link       : http://ghc.haskell.org/trac/ghc/changeset/899cf3b9ed306178ab03bd6d97ec86668cc5c76b/ghc

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

commit 899cf3b9ed306178ab03bd6d97ec86668cc5c76b
Author: Joachim Breitner <mail at joachim-breitner.de>
Date:   Mon Dec 26 10:16:55 2016 +0100

    CallArity: Use exprIsCheap to detect thunks
    
    Originally, everything that is not in WHNF (`exprIsWHNF`) is considered
    a thunk, not eta-expanded, to avoid losing any sharing. This is also how
    the published papers on Call Arity describe it.
    
    In practice, there are thunks that do a just little work, such as
    pattern-matching on a variable, and the benefits of eta-expansion likely
    oughtweigh the cost of doing that repeatedly. Therefore, this
    implementation of Call Arity considers everything that is not cheap
    (`exprIsCheap`) as a thunk.


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

899cf3b9ed306178ab03bd6d97ec86668cc5c76b
 compiler/simplCore/CallArity.hs | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/compiler/simplCore/CallArity.hs b/compiler/simplCore/CallArity.hs
index 3bd6a43..b703c07 100644
--- a/compiler/simplCore/CallArity.hs
+++ b/compiler/simplCore/CallArity.hs
@@ -15,7 +15,7 @@ import BasicTypes
 import CoreSyn
 import Id
 import CoreArity ( typeArity )
-import CoreUtils ( exprIsHNF, exprIsTrivial )
+import CoreUtils ( exprIsCheap, exprIsTrivial )
 --import Outputable
 import UnVarGraph
 import Demand
@@ -192,7 +192,7 @@ Using the result: Eta-Expansion
 We use the result of these two analyses to decide whether we can eta-expand the
 rhs of a let-bound variable.
 
-If the variable is already a function (exprIsHNF), and all calls to the
+If the variable is already a function (exprIsCheap), and all calls to the
 variables have a higher arity than the current manifest arity (i.e. the number
 of lambdas), expand.
 
@@ -395,6 +395,17 @@ the case for Core!
     arguments mentioned in the strictness signature.
     See #10176 for a real-world-example.
 
+Note [What is a thunk]
+~~~~~~~~~~~~~~~~~~~~~~
+
+Originally, everything that is not in WHNF (`exprIsWHNF`) is considered a
+thunk, not eta-expanded, to avoid losing any sharing. This is also how the
+published papers on Call Arity describe it.
+
+In practice, there are thunks that do a just little work, such as
+pattern-matching on a variable, and the benefits of eta-expansion likely
+oughtweigh the cost of doing that repeatedly. Therefore, this implementation of
+Call Arity considers everything that is not cheap (`exprIsCheap`) as a thunk.
 -}
 
 -- Main entry point
@@ -533,7 +544,7 @@ callArityBind boring_vars ae_body int (NonRec v rhs)
     --          (vcat [ppr v, ppr ae_body, ppr int, ppr ae_rhs, ppr safe_arity])
     (final_ae, NonRec v' rhs')
   where
-    is_thunk = not (exprIsHNF rhs)
+    is_thunk = not (exprIsCheap rhs) -- see note [What is a thunk]
     -- If v is boring, we will not find it in ae_body, but always assume (0, False)
     boring = v `elemVarSet` boring_vars
 
@@ -603,7 +614,7 @@ callArityBind boring_vars ae_body int b@(Rec binds)
 
             | otherwise
             -- We previously analized this with a different arity (or not at all)
-            = let is_thunk = not (exprIsHNF rhs)
+            = let is_thunk = not (exprIsCheap rhs) -- see note [What is a thunk]
 
                   safe_arity | is_thunk    = 0  -- See Note [Thunks in recursive groups]
                              | otherwise   = new_arity



More information about the ghc-commits mailing list