@@ -1703,10 +1703,6 @@ takeWhileAntitoneBits :: Int -> (Int -> Bool) -> Word -> Word
17031703
17041704#if defined(__GLASGOW_HASKELL__)
17051705
1706- lowestBitMask :: Word -> Word
1707- lowestBitMask x = x .&. negate x
1708- {-# INLINE lowestBitMask #-}
1709-
17101706lowestBitSet x = countTrailingZeros x
17111707
17121708highestBitSet x = WORD_SIZE_IN_BITS - 1 - countLeadingZeros x
@@ -1728,45 +1724,57 @@ revWord x1 = case ((x1 `shiftRL` 1) .&. 0x5555555555555555) .|. ((x1 .&. 0x55555
17281724 x6 -> ( x6 `shiftRL` 32 ) .|. ( x6 `shiftLL` 32 );
17291725#endif
17301726
1731- foldlBits prefix f z bitmap = go bitmap z
1732- where go 0 acc = acc
1733- go bm acc = go (bm `xor` bitmask) ((f acc) $! (prefix+ bi))
1734- where
1735- ! bitmask = lowestBitMask bm
1736- ! bi = countTrailingZeros bitmask
1737-
1738- foldl'Bits prefix f z bitmap = go bitmap z
1739- where go 0 acc = acc
1740- go bm ! acc = go (bm `xor` bitmask) ((f acc) $! (prefix+ bi))
1741- where ! bitmask = lowestBitMask bm
1742- ! bi = countTrailingZeros bitmask
1743-
1744- foldrBits prefix f z bitmap = go (revWord bitmap) z
1745- where go 0 acc = acc
1746- go bm acc = go (bm `xor` bitmask) ((f $! (prefix+ (WORD_SIZE_IN_BITS - 1 )- bi)) acc)
1747- where ! bitmask = lowestBitMask bm
1748- ! bi = countTrailingZeros bitmask
1749-
1750-
1751- foldr'Bits prefix f z bitmap = go (revWord bitmap) z
1752- where go 0 acc = acc
1753- go bm ! acc = go (bm `xor` bitmask) ((f $! (prefix+ (WORD_SIZE_IN_BITS - 1 )- bi)) acc)
1754- where ! bitmask = lowestBitMask bm
1755- ! bi = countTrailingZeros bitmask
1756-
1757- foldMapBits prefix f bitmap = go (prefix + bi0) (bitmap `xor` bitmask0)
1727+ foldlBits prefix f z0 bitmap = go z0 $! revWord bitmap
1728+ where
1729+ -- Note: We pass the z as a static argument because it helps GHC with demand
1730+ -- analysis. See GHC #25578 for details.
1731+ go z ! bm = f (if bm' == 0 then z else go z bm') x
1732+ where
1733+ bi = WORD_SIZE_IN_BITS - 1 - countTrailingZeros bm
1734+ ! x = prefix .|. bi
1735+ bm' = bm .&. (bm- 1 )
1736+
1737+ foldl'Bits prefix f z0 bitmap = go z0 bitmap
1738+ where
1739+ go ! z ! bm = if bm' == 0 then z' else go z' bm'
1740+ where
1741+ bi = countTrailingZeros bm
1742+ ! x = prefix .|. bi
1743+ ! z' = f z x
1744+ bm' = bm .&. (bm- 1 )
1745+
1746+ foldrBits prefix f z0 bitmap = go bitmap z0
1747+ where
1748+ -- Note: We pass the z as a static argument because it helps GHC with demand
1749+ -- analysis. See GHC #25578 for details.
1750+ go ! bm z = f x (if bm' == 0 then z else go bm' z)
1751+ where
1752+ bi = countTrailingZeros bm
1753+ ! x = prefix .|. bi
1754+ bm' = bm .&. (bm- 1 )
1755+
1756+ foldr'Bits prefix f z0 bitmap = (go $! revWord bitmap) z0
1757+ where
1758+ go ! bm ! z = if bm' == 0 then z' else go bm' z'
1759+ where
1760+ bi = WORD_SIZE_IN_BITS - 1 - countTrailingZeros bm
1761+ ! x = prefix .|. bi
1762+ ! z' = f x z
1763+ bm' = bm .&. (bm- 1 )
1764+
1765+ foldMapBits prefix f bitmap = go bitmap
17581766 where
1759- bitmask0 = lowestBitMask bitmap
1760- bi0 = countTrailingZeros bitmask0
1761- go ! x 0 = f x
1767+ go ! bm = if bm' == 0
1768+ then f x
17621769#if MIN_VERSION_base(4,11,0)
1763- go ! x bm = f x <> go (prefix + bi) (bm `xor` bitmask)
1770+ else f x <> go bm'
17641771#else
1765- go ! x bm = f x `mappend` go (prefix + bi) (bm `xor` bitmask)
1772+ else f x `mappend` go bm'
17661773#endif
17671774 where
1768- bitmask = lowestBitMask bm
1769- bi = countTrailingZeros bitmask
1775+ bi = countTrailingZeros bm
1776+ ! x = prefix .|. bi
1777+ bm' = bm .&. (bm- 1 )
17701778
17711779takeWhileAntitoneBits prefix predicate bitmap =
17721780 -- Binary search for the first index where the predicate returns false, but skip a predicate
0 commit comments