Andreas Klebinger pushed to branch wip/andreask/dfm-cleanup at Glasgow Haskell Compiler / GHC
Commits:
-
9cf5853f
by Andreas Klebinger at 2026-08-10T19:01:09+02:00
5 changed files:
- compiler/GHC/Data/Word64Map/Internal.hs
- compiler/GHC/Data/Word64Map/Lazy.hs
- compiler/GHC/Data/Word64Map/Strict.hs
- compiler/GHC/Data/Word64Map/Strict/Internal.hs
- compiler/GHC/Types/Unique/DFM.hs
Changes:
| ... | ... | @@ -72,6 +72,7 @@ module GHC.Data.Word64Map.Internal ( |
| 72 | 72 | -- * Query
|
| 73 | 73 | , null
|
| 74 | 74 | , size
|
| 75 | + , sizeAtMost
|
|
| 75 | 76 | , compareSize
|
| 76 | 77 | , member
|
| 77 | 78 | , notMember
|
| ... | ... | @@ -533,6 +534,10 @@ size = go 0 |
| 533 | 534 | go acc (Tip _ _) = 1 + acc
|
| 534 | 535 | go acc Nil = acc
|
| 535 | 536 | |
| 537 | +-- | Check if the map is <= n in O(min(|map|,n))
|
|
| 538 | +sizeAtMost :: Word64Map a -> Int -> Bool
|
|
| 539 | +sizeAtMost map n = compareSize map n /= GT
|
|
| 540 | + |
|
| 536 | 541 | -- | \(O(\min(n,c))\). Compare the number of entries in the map to an @Int@.
|
| 537 | 542 | --
|
| 538 | 543 | -- @compareSize m c@ returns the same result as @compare ('size' m) c@ but is
|
| ... | ... | @@ -113,6 +113,7 @@ module GHC.Data.Word64Map.Lazy ( |
| 113 | 113 | -- ** Size
|
| 114 | 114 | , WM.null
|
| 115 | 115 | , size
|
| 116 | + , sizeAtMost
|
|
| 116 | 117 | , compareSize
|
| 117 | 118 | |
| 118 | 119 | -- * Combine
|
| ... | ... | @@ -130,6 +130,7 @@ module GHC.Data.Word64Map.Strict ( |
| 130 | 130 | -- ** Size
|
| 131 | 131 | , null
|
| 132 | 132 | , size
|
| 133 | + , sizeAtMost
|
|
| 133 | 134 | , compareSize
|
| 134 | 135 | |
| 135 | 136 | -- * Combine
|
| ... | ... | @@ -132,6 +132,7 @@ module GHC.Data.Word64Map.Strict.Internal ( |
| 132 | 132 | -- ** Size
|
| 133 | 133 | , null
|
| 134 | 134 | , size
|
| 135 | + , sizeAtMost
|
|
| 135 | 136 | , compareSize
|
| 136 | 137 | |
| 137 | 138 | -- * Combine
|
| ... | ... | @@ -324,6 +325,7 @@ import GHC.Data.Word64Map.Internal |
| 324 | 325 | , spanAntitone
|
| 325 | 326 | , restrictKeys
|
| 326 | 327 | , size
|
| 328 | + , sizeAtMost
|
|
| 327 | 329 | , compareSize
|
| 328 | 330 | , split
|
| 329 | 331 | , splitLookup
|
| ... | ... | @@ -351,8 +351,8 @@ foldUDFM :: (elt -> a -> a) -> a -> UniqDFM key elt -> a |
| 351 | 351 | {-# INLINE foldUDFM #-}
|
| 352 | 352 | -- Specialises k and z into M.foldr on the small-map path.
|
| 353 | 353 | foldUDFM k z (UDFM m ub)
|
| 354 | - | M.compareSize m 1 /= GT = M.foldr (k . taggedFst) z m
|
|
| 355 | - | otherwise = fold_udfm k z m ub
|
|
| 354 | + | M.sizeAtMost m 1 = M.foldr (k . taggedFst) z m
|
|
| 355 | + | otherwise = fold_udfm k z m ub
|
|
| 356 | 356 | |
| 357 | 357 | fold_udfm :: (elt -> a -> a) -> a -> M.Word64Map (TaggedVal elt) -> Int -> a
|
| 358 | 358 | {-# NOINLINE fold_udfm #-}
|
| ... | ... | @@ -402,8 +402,8 @@ eltsUDFM :: UniqDFM key elt -> [elt] |
| 402 | 402 | {-# INLINE eltsUDFM #-} -- so the small case is a good producer
|
| 403 | 403 | -- This matters for T13719.
|
| 404 | 404 | eltsUDFM (UDFM m ub)
|
| 405 | - | M.compareSize m 1 /= GT = build (\c n -> M.foldr (c . taggedFst) n m)
|
|
| 406 | - | otherwise = elts_udfm m ub
|
|
| 405 | + | M.sizeAtMost m 1 = build (\c n -> M.foldr (c . taggedFst) n m)
|
|
| 406 | + | otherwise = elts_udfm m ub
|
|
| 407 | 407 | |
| 408 | 408 | elts_udfm :: M.Word64Map (TaggedVal elt) -> Int -> [elt]
|
| 409 | 409 | {-# NOINLINE elts_udfm #-}
|
| ... | ... | @@ -511,7 +511,7 @@ udfmToList :: UniqDFM key elt -> [(Unique, elt)] |
| 511 | 511 | -- traverseUSDFM in the pattern-match checker, which doesn't fuse. Inlining
|
| 512 | 512 | -- the size dispatch into it regresses T17836.
|
| 513 | 513 | udfmToList (UDFM m ub)
|
| 514 | - | M.compareSize m 1 /= GT =
|
|
| 514 | + | M.sizeAtMost m 1 =
|
|
| 515 | 515 | M.foldrWithKey (\k tv r -> (mkUniqueGrimily k, taggedFst tv) : r) [] m
|
| 516 | 516 | | usePigeonholeSort m ub = pigeonholeSort ub
|
| 517 | 517 | (\k tv -> TaggedVal (mkUniqueGrimily k, taggedFst tv) (taggedSnd tv)) m
|