Andreas Klebinger pushed to branch wip/andreask/dfm-cleanup at Glasgow Haskell Compiler / GHC

Commits:

5 changed files:

Changes:

  • compiler/GHC/Data/Word64Map/Internal.hs
    ... ... @@ -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
    

  • compiler/GHC/Data/Word64Map/Lazy.hs
    ... ... @@ -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
    

  • compiler/GHC/Data/Word64Map/Strict.hs
    ... ... @@ -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
    

  • compiler/GHC/Data/Word64Map/Strict/Internal.hs
    ... ... @@ -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
    

  • compiler/GHC/Types/Unique/DFM.hs
    ... ... @@ -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