From 18cb4f5e1b88aef7770446a354bfcc1e0a075e89 Mon Sep 17 00:00:00 2001 From: "klebinger.andreas@gmx.at" <klebinger.andreas@gmx.at> Date: Sat, 2 Jun 2018 21:18:19 -0400 Subject: [PATCH] Check for singletons when creating Bag/OrdList from a list. 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 | 1 + compiler/utils/OrdList.hs | 1 + 2 files changed, 2 insertions(+) diff --git a/compiler/utils/Bag.hs b/compiler/utils/Bag.hs index 727d1c5f3d..41c80390cc 100644 --- a/compiler/utils/Bag.hs +++ b/compiler/utils/Bag.hs @@ -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] diff --git a/compiler/utils/OrdList.hs b/compiler/utils/OrdList.hs index 081210a534..a5739764d4 100644 --- a/compiler/utils/OrdList.hs +++ b/compiler/utils/OrdList.hs @@ -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 -- GitLab