[commit: base] master: Worker/Wrapper and static argument transform for `until` so it can be inlined (9aa29b8)

Daniel Fischer daniel.is.fischer at googlemail.com
Thu Dec 6 17:40:49 CET 2012


Repository : ssh://darcs.haskell.org//srv/darcs/packages/base

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/9aa29b806cb9e6c23adf6deb50a1bd14487487a4

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

commit 9aa29b806cb9e6c23adf6deb50a1bd14487487a4
Author: Daniel Fischer <daniel.is.fischer at googlemail.com>
Date:   Thu Dec 6 16:38:12 2012 +0100

    Worker/Wrapper and static argument transform for `until` so it can be inlined
    
    With the direct top level recursion, `until` cannot be inlined by GHC, so no strictness
    analysis and consequently no unboxing occurs at the call site.
    With the recursion delegated to the worker with the condition and update function
    static arguments, it can be inlined, and strictness analysis can happen.

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

 GHC/Base.lhs |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/GHC/Base.lhs b/GHC/Base.lhs
index 303d716..075f21d 100644
--- a/GHC/Base.lhs
+++ b/GHC/Base.lhs
@@ -571,8 +571,10 @@ f $ x                   =  f x
 
 -- | @'until' p f@ yields the result of applying @f@ until @p@ holds.
 until                   :: (a -> Bool) -> (a -> a) -> a -> a
-until p f x | p x       =  x
-            | otherwise =  until p f (f x)
+until p f = go
+  where
+    go x | p x          = x
+         | otherwise    = go (f x)
 
 -- | 'asTypeOf' is a type-restricted version of 'const'.  It is usually
 -- used as an infix operator, and its typing forces its first argument





More information about the Cvs-libraries mailing list