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