From 0e0b61db8c958756723f7be24c75db72e08e4f54 Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Thu, 24 Aug 2006 04:13:26 +0000 Subject: [PATCH] explicitly tag Data.ByteString rules with the FPS prefix. --- Data/ByteString.hs | 16 ++++++++----- Data/ByteString/Char8.hs | 15 +++++++----- Data/ByteString/Fusion.hs | 56 ++++++++++++++++++++++----------------------- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/Data/ByteString.hs b/Data/ByteString.hs index df76e6b..927a91f 100644 --- a/Data/ByteString.hs +++ b/Data/ByteString.hs @@ -453,7 +453,7 @@ unpackList (PS fp off len) = withPtr fp $ \p -> do loop (p `plusPtr` off) (len-1) [] {-# RULES -"unpack-list" [1] forall p . unpackFoldr p (:) [] = unpackList p + "FPS unpack-list" [1] forall p . unpackFoldr p (:) [] = unpackList p #-} #endif @@ -513,7 +513,7 @@ lengthU = foldl' (const . (+1)) (0::Int) {-# RULES -- v2 fusion -"length/loop" forall loop s . +"FPS length/loop" forall loop s . length (loopArr (loopWrapper loop s)) = lengthU (loopArr (loopWrapper loop s)) @@ -819,11 +819,11 @@ minimumU = foldl1' min {-# RULES -"minimum/loop" forall loop s . +"FPS minimum/loop" forall loop s . minimum (loopArr (loopWrapper loop s)) = minimumU (loopArr (loopWrapper loop s)) -"maximum/loop" forall loop s . +"FPS maximum/loop" forall loop s . maximum (loopArr (loopWrapper loop s)) = maximumU (loopArr (loopWrapper loop s)) @@ -1438,8 +1438,8 @@ filterByte w ps = replicate (count w ps) w #if __GLASGOW_HASKELL__ >= 605 {-# RULES -"FPS specialise filter (== x)" forall x. - filter (== x) = filterByte x + "FPS specialise filter (== x)" forall x. + filter (== x) = filterByte x #-} #endif @@ -1582,6 +1582,9 @@ zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString -> [a] zipWith f ps qs | null ps || null qs = [] | otherwise = f (unsafeHead ps) (unsafeHead qs) : zipWith f (unsafeTail ps) (unsafeTail qs) +#if defined(__GLASGOW_HASKELL__) +{-# INLINE [1] zipWith #-} +#endif -- -- | A specialised version of zipWith for the common case of a @@ -1613,6 +1616,7 @@ zipWith' f (PS fp s l) (PS fq t m) = inlinePerformIO $ "FPS specialise zipWith" forall (f :: Word8 -> Word8 -> Word8) p q . zipWith f p q = unpack (zipWith' f p q) + #-} -- | /O(n)/ 'unzip' transforms a list of pairs of bytes into a pair of diff --git a/Data/ByteString/Char8.hs b/Data/ByteString/Char8.hs index 93f6dc5..bd4b31a 100644 --- a/Data/ByteString/Char8.hs +++ b/Data/ByteString/Char8.hs @@ -307,16 +307,15 @@ pack str = B.unsafeCreate (P.length str) $ \(Ptr p) -> stToIO (go p str) writeByte p c = ST $ \s# -> case writeWord8OffAddr# p 0# c s# of s2# -> (# s2#, () #) {-# INLINE writeByte #-} +{-# INLINE [1] pack #-} {-# RULES -"pack/packAddress" forall s# . - pack (unpackCString# s#) = B.packAddress s# + "FPS pack/packAddress" forall s . + pack (unpackCString# s) = B.packAddress s #-} #endif -{-# INLINE pack #-} - -- | /O(n)/ Converts a 'ByteString' to a 'String'. unpack :: ByteString -> [Char] unpack = P.map w2c . B.unpack @@ -520,12 +519,16 @@ takeWhile f = B.takeWhile (f . w2c) -- | 'dropWhile' @p xs@ returns the suffix remaining after 'takeWhile' @p xs@. dropWhile :: (Char -> Bool) -> ByteString -> ByteString dropWhile f = B.dropWhile (f . w2c) -{-# INLINE dropWhile #-} +#if defined(__GLASGOW_HASKELL__) +{-# INLINE [1] dropWhile #-} +#endif -- | 'break' @p@ is equivalent to @'span' ('not' . p)@. break :: (Char -> Bool) -> ByteString -> (ByteString, ByteString) break f = B.break (f . w2c) -{-# INLINE break #-} +#if defined(__GLASGOW_HASKELL__) +{-# INLINE [1] break #-} +#endif -- | 'span' @p xs@ breaks the ByteString into two segments. It is -- equivalent to @('takeWhile' p xs, 'dropWhile' p xs)@ diff --git a/Data/ByteString/Fusion.hs b/Data/ByteString/Fusion.hs index 99cfa2b..7821e16 100644 --- a/Data/ByteString/Fusion.hs +++ b/Data/ByteString/Fusion.hs @@ -233,7 +233,7 @@ loopU f start (PS z s i) = unsafePerformIO $ withForeignPtr z $ \a -> do {-# RULES -"loop/loop fusion!" forall em1 em2 start1 start2 arr. +"FPS loop/loop fusion!" forall em1 em2 start1 start2 arr. loopU em2 start2 (loopArr (loopU em1 start1 arr)) = loopSndAcc (loopU (em1 `fuseEFL` em2) (start1 :*: start2) arr) @@ -260,7 +260,7 @@ loopL f = loop {-# RULES -"lazy loop/loop fusion!" forall em1 em2 start1 start2 arr. +"FPS lazy loop/loop fusion!" forall em1 em2 start1 start2 arr. loopL em2 start2 (loopArr (loopL em1 start1 arr)) = loopSndAcc (loopL (em1 `fuseEFL` em2) (start1 :*: start2) arr) @@ -430,13 +430,13 @@ sequenceLoops loop1 loop2 src dest len0 = do {-# RULES -"loopArr/loopSndAcc" forall x. +"FPS loopArr/loopSndAcc" forall x. loopArr (loopSndAcc x) = loopArr x -"seq/NoAcc" forall (u::NoAcc) e. +"FPS seq/NoAcc" forall (u::NoAcc) e. u `seq` e = e -"loop/loop wrapper elimination" forall loop1 loop2 arr. +"FPS loop/loop wrapper elimination" forall loop1 loop2 arr. loopWrapper loop2 (loopArr (loopWrapper loop1 arr)) = loopSndAcc (loopWrapper (sequenceLoops loop1 loop2) arr) @@ -445,95 +445,95 @@ sequenceLoops loop1 loop2 src dest len0 = do -- is monadic, so its really n >> m fusion (i.e. m.n), not n . m fusion. -- -"up/up loop fusion" forall f1 f2 acc1 acc2. +"FPS up/up loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doUpLoop f1 acc1) (doUpLoop f2 acc2) = doUpLoop (f1 `fuseAccAccEFL` f2) (acc1 :*: acc2) -"map/map loop fusion" forall f1 f2 acc1 acc2. +"FPS map/map loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doMapLoop f1 acc1) (doMapLoop f2 acc2) = doMapLoop (f1 `fuseMapMapEFL` f2) (acc1 :*: acc2) -"filter/filter loop fusion" forall f1 f2 acc1 acc2. +"FPS filter/filter loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doFilterLoop f1 acc1) (doFilterLoop f2 acc2) = doFilterLoop (f1 `fuseFilterFilterEFL` f2) (acc1 :*: acc2) -"map/filter loop fusion" forall f1 f2 acc1 acc2. +"FPS map/filter loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doMapLoop f1 acc1) (doFilterLoop f2 acc2) = doNoAccLoop (f1 `fuseMapFilterEFL` f2) (acc1 :*: acc2) -"filter/map loop fusion" forall f1 f2 acc1 acc2. +"FPS filter/map loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doFilterLoop f1 acc1) (doMapLoop f2 acc2) = doNoAccLoop (f1 `fuseFilterMapEFL` f2) (acc1 :*: acc2) -"map/up loop fusion" forall f1 f2 acc1 acc2. +"FPS map/up loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doMapLoop f1 acc1) (doUpLoop f2 acc2) = doUpLoop (f1 `fuseMapAccEFL` f2) (acc1 :*: acc2) -"up/map loop fusion" forall f1 f2 acc1 acc2. +"FPS up/map loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doUpLoop f1 acc1) (doMapLoop f2 acc2) = doUpLoop (f1 `fuseAccMapEFL` f2) (acc1 :*: acc2) -"filter/up loop fusion" forall f1 f2 acc1 acc2. +"FPS filter/up loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doFilterLoop f1 acc1) (doUpLoop f2 acc2) = doUpLoop (f1 `fuseFilterAccEFL` f2) (acc1 :*: acc2) -"up/filter loop fusion" forall f1 f2 acc1 acc2. +"FPS up/filter loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doUpLoop f1 acc1) (doFilterLoop f2 acc2) = doUpLoop (f1 `fuseAccFilterEFL` f2) (acc1 :*: acc2) -"down/down loop fusion" forall f1 f2 acc1 acc2. +"FPS down/down loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doDownLoop f1 acc1) (doDownLoop f2 acc2) = doDownLoop (f1 `fuseAccAccEFL` f2) (acc1 :*: acc2) -"map/down fusion" forall f1 f2 acc1 acc2. +"FPS map/down fusion" forall f1 f2 acc1 acc2. sequenceLoops (doMapLoop f1 acc1) (doDownLoop f2 acc2) = doDownLoop (f1 `fuseMapAccEFL` f2) (acc1 :*: acc2) -"down/map loop fusion" forall f1 f2 acc1 acc2. +"FPS down/map loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doDownLoop f1 acc1) (doMapLoop f2 acc2) = doDownLoop (f1 `fuseAccMapEFL` f2) (acc1 :*: acc2) -"filter/down fusion" forall f1 f2 acc1 acc2. +"FPS filter/down fusion" forall f1 f2 acc1 acc2. sequenceLoops (doFilterLoop f1 acc1) (doDownLoop f2 acc2) = doDownLoop (f1 `fuseFilterAccEFL` f2) (acc1 :*: acc2) -"down/filter loop fusion" forall f1 f2 acc1 acc2. +"FPS down/filter loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doDownLoop f1 acc1) (doFilterLoop f2 acc2) = doDownLoop (f1 `fuseAccFilterEFL` f2) (acc1 :*: acc2) -"noAcc/noAcc loop fusion" forall f1 f2 acc1 acc2. +"FPS noAcc/noAcc loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doNoAccLoop f1 acc1) (doNoAccLoop f2 acc2) = doNoAccLoop (f1 `fuseNoAccNoAccEFL` f2) (acc1 :*: acc2) -"noAcc/up loop fusion" forall f1 f2 acc1 acc2. +"FPS noAcc/up loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doNoAccLoop f1 acc1) (doUpLoop f2 acc2) = doUpLoop (f1 `fuseNoAccAccEFL` f2) (acc1 :*: acc2) -"up/noAcc loop fusion" forall f1 f2 acc1 acc2. +"FPS up/noAcc loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doUpLoop f1 acc1) (doNoAccLoop f2 acc2) = doUpLoop (f1 `fuseAccNoAccEFL` f2) (acc1 :*: acc2) -"map/noAcc loop fusion" forall f1 f2 acc1 acc2. +"FPS map/noAcc loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doMapLoop f1 acc1) (doNoAccLoop f2 acc2) = doNoAccLoop (f1 `fuseMapNoAccEFL` f2) (acc1 :*: acc2) -"noAcc/map loop fusion" forall f1 f2 acc1 acc2. +"FPS noAcc/map loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doNoAccLoop f1 acc1) (doMapLoop f2 acc2) = doNoAccLoop (f1 `fuseNoAccMapEFL` f2) (acc1 :*: acc2) -"filter/noAcc loop fusion" forall f1 f2 acc1 acc2. +"FPS filter/noAcc loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doFilterLoop f1 acc1) (doNoAccLoop f2 acc2) = doNoAccLoop (f1 `fuseFilterNoAccEFL` f2) (acc1 :*: acc2) -"noAcc/filter loop fusion" forall f1 f2 acc1 acc2. +"FPS noAcc/filter loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doNoAccLoop f1 acc1) (doFilterLoop f2 acc2) = doNoAccLoop (f1 `fuseNoAccFilterEFL` f2) (acc1 :*: acc2) -"noAcc/down loop fusion" forall f1 f2 acc1 acc2. +"FPS noAcc/down loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doNoAccLoop f1 acc1) (doDownLoop f2 acc2) = doDownLoop (f1 `fuseNoAccAccEFL` f2) (acc1 :*: acc2) -"down/noAcc loop fusion" forall f1 f2 acc1 acc2. +"FPS down/noAcc loop fusion" forall f1 f2 acc1 acc2. sequenceLoops (doDownLoop f1 acc1) (doNoAccLoop f2 acc2) = doDownLoop (f1 `fuseAccNoAccEFL` f2) (acc1 :*: acc2) -- 1.7.10.4