on master help sign in
Optimize (loopify) short pattern case
0463b79Harendra Kumar
src/Streamly/Internal/Data/Stream/StreamD.hs+52−39
@@ -1795,8 +1795,8 @@ data SplitOnSeqState rb rh ck w fs s b x =
1795 | SplitOnSeqEmpty s
1795 | SplitOnSeqEmpty s
1796 | SplitOnSeqSingle !fs s x
1796 | SplitOnSeqSingle !fs s x
1797
1797
1798− | SplitOnSeqWordInit Int s !w
1798+ | SplitOnSeqWordInit s
1799− | SplitOnSeqWordLoop !fs s !w
1799+ | SplitOnSeqWordLoop !w s !fs
1800 | SplitOnSeqWordDone Int !fs !w
1800 | SplitOnSeqWordDone Int !fs !w
1801
1801
1802 | SplitOnSeqKRInit Int s rb !rh
1802 | SplitOnSeqKRInit Int s rb !rh
@@ -1856,7 +1856,7 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
1856 return $ Skip $ SplitOnSeqSingle acc state pat
1856 return $ Skip $ SplitOnSeqSingle acc state pat
1857 else if sizeOf (undefined :: a) * patLen
1857 else if sizeOf (undefined :: a) * patLen
1858 <= sizeOf (undefined :: Word)
1858 <= sizeOf (undefined :: Word)
1859− then return $ Skip $ SplitOnSeqWordInit 0 state (0 :: Word)
1859+ then return $ Skip $ SplitOnSeqWordInit state
1860 else do
1860 else do
1861 (rb, rhead) <- liftIO $ RB.new patLen
1861 (rb, rhead) <- liftIO $ RB.new patLen
1862 skip $ SplitOnSeqKRInit 0 state rb rhead
1862 skip $ SplitOnSeqKRInit 0 state rb rhead
@@ -1917,45 +1917,58 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
1917 fs1 <- fstep fs (toEnum $ fromIntegral old)
1917 fs1 <- fstep fs (toEnum $ fromIntegral old)
1918 skip $ SplitOnSeqWordDone (n - 1) fs1 wrd
1918 skip $ SplitOnSeqWordDone (n - 1) fs1 wrd
1919
1919
1920− stepOuter gst (SplitOnSeqWordInit idx st wrd) = do
1920+ stepOuter gst (SplitOnSeqWordInit st0) =
1921+ go SPEC 0 0 st0
1922+
1923+ where
1924+
1925+ {-# INLINE go #-}
1926+ go !_ !idx !wrd !st = do
1921− res <- step (adaptState gst) st
1927+ res <- step (adaptState gst) st
1922− case res of
1928+ case res of
1923− Yield x s -> do
1929+ Yield x s -> do
1924− let wrd1 = addToWord wrd x
1930+ let wrd1 = addToWord wrd x
1925− if idx /= maxIndex
1931+ if idx == maxIndex
1926− then skip $ SplitOnSeqWordInit (idx + 1) s wrd1
1932+ then do
1927− else do
1933+ fs <- initial
1934+ if wrd1 .&. wordMask == wordPat
1935+ then do
1936+ r <- done fs
1937+ let next = SplitOnSeqWordInit s
1938+ skip $ SplitOnSeqYield r next
1939+ else skip $ SplitOnSeqWordLoop wrd1 s fs
1940+ else go SPEC (idx + 1) wrd1 s
1941+ Skip s -> go SPEC idx wrd s
1942+ Stop -> do
1928 fs <- initial
1943 fs <- initial
1944+ if idx /= 0
1945+ then skip $ SplitOnSeqWordDone idx fs wrd
1946+ else do
1947+ r <- done fs
1948+ skip $ SplitOnSeqYield r SplitOnSeqDone
1949+
1950+ stepOuter gst (SplitOnSeqWordLoop wrd0 st0 fs0) =
1951+ go SPEC wrd0 st0 fs0
1952+
1953+ where
1954+
1955+ {-# INLINE go #-}
1956+ go !_ !wrd !st !fs = do
1957+ res <- step (adaptState gst) st
1958+ case res of
1959+ Yield x s -> do
1960+ let wrd1 = addToWord wrd x
1961+ old = (wordMask .&. wrd)
1962+ `shiftR` (elemBits * (patLen - 1))
1963+ fs1 <- fstep fs (toEnum $ fromIntegral old)
1929 if wrd1 .&. wordMask == wordPat
1964 if wrd1 .&. wordMask == wordPat
1930 then do
1965 then do
1931− r <- done fs
1966+ r <- done fs1
1932− let next = SplitOnSeqWordInit 0 s (0 :: Word)
1967+ let next = SplitOnSeqWordInit s
1933 skip $ SplitOnSeqYield r next
1968 skip $ SplitOnSeqYield r next
1934− else skip $ SplitOnSeqWordLoop fs s wrd1
1969+ else go SPEC wrd1 s fs1
1935− Skip s -> skip $ SplitOnSeqWordInit idx s wrd
1970+ Skip s -> go SPEC wrd s fs
1936− Stop -> do
1937− fs <- initial
1938− if idx /= 0
1939− then skip $ SplitOnSeqWordDone idx fs wrd
1940− else do
1941− r <- done fs
1942− skip $ SplitOnSeqYield r SplitOnSeqDone
1943−
1944− stepOuter gst (SplitOnSeqWordLoop fs st wrd) = do
1945− res <- step (adaptState gst) st
1946− case res of
1947− Yield x s -> do
1948− let wrd1 = wordMask .&. addToWord wrd x
1949− old = wrd `shiftR` (elemBits * (patLen - 1))
1950− fs1 <- fstep fs (toEnum $ fromIntegral old)
1951− if wrd1 .&. wordMask == wordPat
1952− then do
1953− r <- done fs1
1954− let next = SplitOnSeqWordInit 0 s (0 :: Word)
1955− skip $ SplitOnSeqYield r next
1956− else skip $ SplitOnSeqWordLoop fs1 s wrd1
1957− Skip s -> skip $ SplitOnSeqWordLoop fs s wrd
1958− Stop -> skip $ SplitOnSeqWordDone patLen fs wrd
1971+ Stop -> skip $ SplitOnSeqWordDone patLen fs wrd
1959
1972
1960 -------------------------------
1973 -------------------------------
1961 -- General Pattern - Karp Rabin
1974 -- General Pattern - Karp Rabin
@@ -2029,7 +2042,7 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
2029 stepOuter gst (SplitOnSeqKRLoop fs st rb rh cksum) = do
2042 stepOuter gst (SplitOnSeqKRLoop fs st rb rh cksum) = do
2030 res <- step (adaptState gst) st
2043 res <- step (adaptState gst) st
2031 case res of
2044 case res of
2032− Yield x s -> do -- skip $ SplitOnSeqKRYield fs s rb rh cksum x
2045+ Yield x s -> do
2033 old <- liftIO $ peek rh
2046 old <- liftIO $ peek rh
2034 let cksum1 = deltaCksum cksum old x
2047 let cksum1 = deltaCksum cksum old x
2035 fs1 <- fstep fs old
2048 fs1 <- fstep fs old