Check for singletons when creating Bag/OrdList from a list.
authorklebinger.andreas@gmx.at <klebinger.andreas@gmx.at>
Sun, 3 Jun 2018 01:18:19 +0000 (21:18 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 3 Jun 2018 03:21:00 +0000 (23:21 -0400)
This gives us `One x` instead of `Many (x : [])` reducing overhead.
For compiling spectral/simple with -O0 difference was ~ -0.05%
allocations.

The only drawback is that something like toOL (x:panic "") will now
panic.  But that seems like a reasonable tradeoff.

Test Plan: ci, looking at +RTS -s

Reviewers: bgamari, jmct

Reviewed By: bgamari

Subscribers: jmct, rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4770

compiler/utils/Bag.hs
compiler/utils/OrdList.hs

index 727d1c5..41c8039 100644 (file)
@@ -328,6 +328,7 @@ mapAccumBagLM f s (ListBag xs)    = do { (s', xs') <- mapAccumLM f s xs
 
 listToBag :: [a] -> Bag a
 listToBag [] = EmptyBag
+listToBag [x] = UnitBag x
 listToBag vs = ListBag vs
 
 bagToList :: Bag a -> [a]
index 081210a..a573976 100644 (file)
@@ -122,4 +122,5 @@ foldlOL k z (Many xs)   = foldl k z xs
 
 toOL :: [a] -> OrdList a
 toOL [] = None
+toOL [x] = One x
 toOL xs = Many xs