Add a seq rule for scanlU (+) 0
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 20 May 2010 03:32:12 +0000 (03:32 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 20 May 2010 03:32:12 +0000 (03:32 +0000)
This occurs quite frequently when calculating segment descriptors.
Nevertheless, it is a hack.

dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential/Flat/Combinators.hs

index 057bc04..578a331 100644 (file)
@@ -53,6 +53,8 @@ import Data.Array.Parallel.Unlifted.Sequential.Flat.Basics (
 import Data.Array.Parallel.Unlifted.Sequential.Flat.Subarrays (
   sliceU)
 
+import qualified GHC.Base
+
 import Debug.Trace
 
 here s = "Data.Array.Parallel.Unlifted.Sequential.Flat.Combinators." ++ s
@@ -120,6 +122,14 @@ scanlU :: (UA a, UA b) => (b -> a -> b) -> b -> UArr a -> UArr b
 {-# INLINE_U scanlU #-}
 scanlU f z = unstreamU . scanS f z . streamU
 
+{-# RULES
+
+"seq/scanlU (+)" forall i xs z.
+  seq (unstreamU (scanS GHC.Base.plusInt i (streamU xs))) z
+    = i `seq` xs `seq` z
+
+  #-}
+
 -- |Prefix scan of a non-empty array proceeding from left to right
 --
 scanl1U :: UA a => (a -> a -> a) -> UArr a -> UArr a