Avoid creating unnecessary join points in Stream.replicate
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 7 Dec 2009 14:40:26 +0000 (14:40 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 7 Dec 2009 14:40:26 +0000 (14:40 +0000)
Data/Vector/Fusion/Stream/Monadic.hs
Data/Vector/Fusion/Util.hs

index 832746d..6b64856 100644 (file)
@@ -69,7 +69,7 @@ module Data.Vector.Fusion.Stream.Monadic (
 ) where
 
 import Data.Vector.Fusion.Stream.Size
-import Data.Vector.Fusion.Util ( Box(..) )
+import Data.Vector.Fusion.Util ( Box(..), delay_inline )
 
 import Data.Char      ( ord )
 import GHC.Base       ( unsafeChr )
@@ -155,7 +155,9 @@ singleton x = Stream (return . step) True (Exact 1)
 -- | Replicate a value to a given length
 replicate :: Monad m => Int -> a -> Stream m a
 {-# INLINE_STREAM replicate #-}
-replicate n x = Stream (return . step) n (Exact (max n 0))
+-- NOTE: We delay inlining max here because GHC will create a join point for
+-- the call to newArray# otherwise which is not really nice.
+replicate n x = Stream (return . step) n (Exact (delay_inline max n 0))
   where
     {-# INLINE_INNER step #-}
     step i | i > 0     = Yield x (i-1)
index 1e46009..be673d9 100644 (file)
 -- Fusion-related utility types
 --
 
-module Data.Vector.Fusion.Util ( Id(..), Box(..) )
-where
+module Data.Vector.Fusion.Util (
+  Id(..), Box(..),
+
+  delay_inline
+) where
 
 -- | Identity monad
 newtype Id a = Id { unId :: a }
@@ -33,3 +36,9 @@ instance Monad Box where
   return      = Box
   Box x >>= f = f x
 
+-- | Delay inlining a function until late in the game (simplifier phase 0).
+delay_inline :: (a -> b) -> a -> b
+{-# INLINE [0] delay_inline #-}
+delay_inline f = f
+
+